快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

C++中为什么尽量不增加函数的参数个数

本篇内容主要讲解“C++中为什么尽量不增加函数的参数个数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中为什么尽量不增加函数的参数个数”吧!

为白银等地区用户提供了全套网页设计制作服务,及白银网站建设行业解决方案。主营业务为成都网站制作、做网站、白银网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!

Reason(原因)

参数过多会增加混淆的可能性。和其他方式相比,传递很多参数的代价通常也很高。

Discussion(讨论)

函数参数过多通常有两个原因:

  1. 抽象缺失。这里缺少一个抽象,因此组合数据被分开传递而不是作为包含不变量的单独的对象。这不是扩展参数列表的问题,而是由于组合值不被强制不变量保护而引发错误的问题。

  2. 违反了“一个函数,一个职责”原则。函数试图做一件以上的事情,应该被重构。

  3. Example(示例)

标注库merge()就处在我们可以舒服地处理的上限:

templateOutputIterator merge(InputIterator1 first1, InputIterator1 last1,                     InputIterator2 first2, InputIterator2 last2,                     OutputIterator result, Compare comp);

注意这是因为前面提到的第一个问题:抽象缺失。STL传递了迭代器对(没有包装的组合值)而不是range(抽象)。

译者注:range是C++14引入的新特性。译者注:range是C++14引入的新特性。

这里一共有四个模板参数和六个函数参数。为了简化最常见和最简单的用法,比较操作可以默认为<(小于号):

templateOutputIterator merge(InputIterator1 first1, InputIterator1 last1,                     InputIterator2 first2, InputIterator2 last2,                     OutputIterator result);

这并没有减少复杂性,但是降低了面向很多用户的表面上的复杂度。为了真正减少参数的数量,我们需要将参数绑定到高级别的抽象中。

templateOutputIterator merge(InputRange1 r1, InputRange2 r2, OutputIterator result);

将参数分组打包是一种减少参数数量的通常技术,这样也可以增加检查的机会。

或者,我们也可以使用concept( 在ISO技术规范中定义)来定义合并操作必须可用的三个类型。

译者注:concept将会被C++20正式引入。

Mergeable{In1, In2, Out}OutputIterator merge(In1 r1, In2 r2, Out result);
Example(示例)

安全规则群组推荐将

void f(int* some_ints, int some_ints_length);  // BAD: C style, unsafe

with(替换为)

void f(gsl::span some_ints);              // GOOD: safe, bounds-checked

这里,我们使用一个安全而且健壮的抽象,而且通常也可以减少参数的数量。

Note(注意)

多少参数算太多?争取让参数的个数少于4个。存在一些4个独立参数是最佳表达方式的函数,但不多。

可选项:使用较好的抽象:将参数分组并形成有意义的对象然后传递它(传值或传址)。

可选项:使用默然参数或重载以便更加通用的调用形式可以使用较少的参数。

Enforcement(实施建议)

  • Warn when a function declares two iterators (including pointers) of the same type instead of a range or a view.

    如果函数定义了相同类型的两个迭代器(包括指针)而不是range或view。

  • (Not enforceable) This is a philosophical guideline that is infeasible to check directly.

       (非强制)这是一个事关编程哲学的准则,无法直接检查。

到此,相信大家对“C++中为什么尽量不增加函数的参数个数”有了更深的了解,不妨来实际操作一番吧!这里是创新互联网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!


分享标题:C++中为什么尽量不增加函数的参数个数
当前地址:http://6mz.cn/article/jdosdp.html

其他资讯