C++警惕那些有歧义的命名

C++ 1

 

关键点
“别人还能够管这个名字理解成什么意思?”通过不停的发问自己是问题来主动检查各个一个命名。

实际上,这种有创造性的、不断尝试“错误理解”的方,能够有效之意识歧义的命名,并修正它们。正而本文中的演示,我们将随时通过“骑驴看唱歌本
——边倒边看”的方式来 探讨所看到名字的误会的处在,然后择一个复好之名字。

示例:Filter()
苟写了平等截代码来操作数据库结果的汇:

results = Database.all_objects.filter("year <= 2011")

那,results包含什么数据也?

  • 有满足year<=2011的目标
  • 所有满足year<=2011的对象

 

题材之来由是打filter这个产生歧义的歌词起之,它从未了解表达其的意是“选取”还是“剔除”。因此,应该避免用filter,它太好造
成误解!
倘此想使的效用是“选取”,一个复好的名是select;如果想要的凡“剔除”,更好之名则是exclude。

也布尔值取名
当也布尔值变量命名或者函数返回布尔值的下,要特别注意真与假所表达出来的实际意思,这里就是生出一个非常惊险的例子:

bool read_password = true;

立马句代码意思在当时怎么读的(没有其余的意了),显然这里来个别栽了不同之明:

  • 需要读密码
  • 密码都让读了了

以斯用例下,做好避免因此单词read,可以考虑下need_password或者user_is_authenticated来代替。

常见状态下,添加单词is、has、can或者should可以让布尔值的意更加清晰易懂。
例如有只函数叫SpaceLeft(),乍一看,就会想到这个函数返回的价是数字。如果欲明白返回值是布尔值,一个再好的名是
HasSpaceLeft()。
还有,尽量避免使用反义短句来命名。例如:

bool disable_ssl = false;

转移化如下代码则再度易于了解,同时再度合乎原意:

bool use_ssl = true;

 

切合用户愿意
重重名是富含误导性的,因为于有名字,用户从曾起一个料的概念,但是代码的意思可能刚刚不是这个意思。如此情况下,最好作出“让步”并改
变名,消除 误导性。

示例:get*()
许多程序员都于动这样的编码规范:某个方法以get开头来表述一个“轻量级的访问器”以回到内部成员。违反这专业将格外轻误导用户。
避免下的例子中java代码段的做法:

public class StatisticsCollector {

    public void addSample(double x) { ... }

 

    public double getMean() {

        // Iterate through all samples and return total / num_samples

    }

    ...

}

此,getMean的贯彻是枚举过去有的数码,并盘算其平均值。如果数据量很挺之上,这无异步的出将会晤是老非常的。但是,一个非了解情况的
程 序员则会非常粗的调用它同时假要即是一个颇廉价的调用。
为此,这个方法应该改名成类似computeMean()这样的,看起如此尽管是一个代价高昂的操作了(或者,另一个抉择虽是改变写那落实,变成一
单名副其实的轻量级操作)。

示例:list::size()
此地谈话一个C++标准库里之命名问题。这段代码导致的结果是,很不便定位和修补类似导致服务器龟速运行等等的问题:

void ShrinkList(list<Node>& list, int max_size) {

    while (list.size() > max_size) {

        FreeNode(list.back());

        list.pop_back();

    }

}

诸如此类的bug的导致是笔者没有意识及list.size()是一个O(n)复杂度的操作——它挨个计数链表的节点得发总数要非是回就算
好的终究个数,这将促成ShrintList是一个O(n2) 的操作。
自从技术角度谈,这段代码没有问题,也能够经过有的单元测试。但是当调用ShrintList()并传到一个富含上亿数目级的list时,它可能用
耗费数钟头的光阴。
恐你见面当,这个是调用者的荒唐使用,他/她没认真细致的开卷有关的文档!确实是这般的,但是,事实上,这里的list.size()不是平
个定点准时(constant-time)操作,这太奇怪了!其他兼具的C++容器类都是稳定准时的size()方法呀。
若是把size()更名成countSize()或者countElements(),类似的不当就见面大大减少了。C++标准库的实现者可能想的
是利用一个size()方法去与另的容器匹配,像vector和map,这样API的一致性看起又好。正是由这样的做了,导致程序员容易误
用连当就是一个迅速的操作,和任何的容器一样!幸运的凡,最新的C++标准要求size()是O(1)复杂度。

 

参考资料:《The Art of Readable Code》第三节