代码中的命名

代码中的命名

周伟光

2012-10-15

 

子曰:名不正则言不顺。

 

       提到代码里面的命名,大家首先想到匈牙利命名法,骆驼命名法,.net命名规范,C/C++命名规范等。而本文中的命名,主要解决代码可读性的问题。

 

 

 

Bad Small

       当我接手一个新系统的时候,命名不规范让我十分头疼,改也不是,不改也不是。最好的结果就是,大家都能注意,不要把这些问题继承给其他程序员。

单词拼写错误

       单词拼写错误,是最常见的“坏味”,最容易嗅到的。换句话说,是最臭的。我想,这个大家都应该闻到过。我们或多或少的,都吃过他的亏。如,我同事的代码,让我改。他写了一大堆,我也没时间全看。而现在客户让我马上处理一个和Order相关的问题,我于是开始搜索Order这个单词,结果找不到。怎么办,只能一个一个文件去“人肉”。最后发现,他把Order拼成了Ordre。这是简单的例子,虽然拼写错了,但程序还是可以运行。再复杂一点的,还有.net里面的反射。我这次可能要通过反射,或者在Configure文件里配置,去调用我同事的代码,我当然会正确的使用Order这个词,但是我同事源代码里用了Ordre,于是就产生Bug了。

词性误用

       很多时候,很多人并不把它当作一个错误。经常看到这样一个命名,叫IsReleased,乍一看,这应该是个属性,但它却偏偏是一个函数。可是函数应该是动词呀,应该叫GetIsReleased

       正确词性应该是这样的:命名空间(.Net),类等用名词;函数用动词;属性(Property)和域(Field)用名词和形容词。

单复数

       单复数也是我们中国人常见的错误。单复数的误用,会对理解程序造成很大的障碍。我经常遇到,数组变量是个单数词。

       一般单复数不同形的,数组里应该使用负数形式。单复数同形的,可以加上后缀以示区别。如SheepList等。

缩写

       缩写是很伤可读性的。一般形况,应该尽量避免。缩写应该只限定在常用的,大家能理解的词。而且,缩写应该符合语言的规范。缩写,这里指英文缩写。分为两种,首字母缩写词(Acronym)和其他缩写词。常用的首字母缩写词,都是可以用的,如URLHTMLIO等。而其他的缩写词,最好不要用了。如Department可以写成Dpt,也可以写成Dept,那如果你要用缩写,就一点规范也没有了。你知道Dpt,我也知道,但是换个人呢,他还知道DptDepartment么?不过,也不是所有的都不能用。出现ID的地方,你还非得用ID不可,你如果用Identity,会很奇怪的。还有OK也是可以用的,这个全世界人民都知道,连不认识字的老太太都知道。我个人觉得,像Dpt这种字典里查不出来的,就不要用了。

       首字母缩写词(Acronym),在使用的时候,不要自己造词!我就见过,有人把中国人民银行缩写成了PBOC。我当时一看,就知道错了。我心想,你还是大陆人么? People’sRepublic of ChinaPeople’s Bankof China,全称结构一样的,差了一个词而已。前者的简称,都应该知道是PRC吧,推导一下,就知道后者的简称应该是PBC了。那,我是不是马上给他改了呢?不,如果我贸然改了,我也是自己造词。怎么办?这个时候,需要去央行的网站看一下,看看官方说法。我查了官网,确定我是对的,才给他改过来的。看了上面的例子,你也许认为,O都是要拿掉的。那再举一例,中华民国又叫ROC了。所以,没有把握还是去查资料吧。

词不达意

词不达意,也分不同的情况。误用了意思有欠准确的英语单词是一种。还有一种,可能只表达了部分的意思。如一个函数,有两个功能。这时,已经不是一个简单的命名的问题了。最好把这个函数分成两个。

不符合语言习惯

       我以前写过一个函数,叫ChangeName。后来,我发现这样写不对,改成了Rename。同样的一个问题是,别人来找重命名这部分的代码的时候,十之八九,会用Rename这个关键词。我不能让别人找不到吧。

亡羊补牢

《战国策》:“见兔而顾犬,未为晚也;亡羊而补牢,未为迟也。”

 

       对于亡羊补牢,大家有两种态度,有人说,亡羊补牢,为时未晚。有人说,亡羊补牢,为时已晚。历史上,有改名的,也有不改名的。美国的印第安人,人家明明不是印度人,英国人硬说人家是Indians,后来就约定俗成,没法改了。韩国的首都,汉语叫汉城,叫了这么多年,结果这两年突然改成首尔了。你问我改还是不改,我只能学习美国外交部处理钓鱼岛问题时的回答了:We don't have a position(我们没有立场)。

       修改命名,其实也是一件危险的事情。我自己就有过血的教训。程序的成员有全局和局部的。对于局部成员,重命名影响比较小。如一个函数里面,所定义的变量,你把他的名字改了,他的影响是不会传递出去的。

如果是Public成员,就危险了。你要注意三个方面。一、引用到他的地方,也要一起改了。这对于所有项目都在一个解决方案(Solution)里的情况,问题不大,如果跨解决方案,会麻烦一点。二、反射它的地方,这点就是我经过血的教训得到的。当时别人拼写错了,我给他该对了。结果QA一测,说某个地方本来没问题,怎么让你改出问题了。我找了半天,结果发现,他在某处还反射调用了。反射的地方拼写也是错的。两个都错,正好“负负得正”了。反射用的是字符串,而不是类名。也就是说,这个问题,只有运行时才能发现。三、Configure文件里面的配置。其实三和二是同一个问题,单独提出来,是为了让大家查完了代码里面的反射,不要忘了还有Configure文件里面的反射。

还有Protect成员,也作为Public成员处理。

另外一个容易出错的,是Internal成员。一般情况Internal成员改名,影响范围应该只涉及到项目本身。然而,有一种特殊情况,会让Internal成员改名的影响,超出项目的范围。Assembly有个属性,叫InternalVisibleTo,意思就是项目A可以让项目B访问其Internal成员。这时,你可以参考上文处理Public成员的方法处理。

修炼

了解特定语言命名规范

       .Net程序员可以学习一下《.net设计规范》,Java程序员也自行去找书看。

学习系统API

       我见过一个函数,叫AddNDay。我看了以后,十分头疼。DateTime里面,不是有个函数叫AddDays么。这边命名成和系统一样,多好,而且,就应该和系统一样,一字不差,大小写都一样。如果是Java程序,就是addDays

向业务人员咨询准确的用法

       有些缩写词,不要自己去创造,不要发明PBOC。同样的,一些专业词汇,更要避免自己去创造。有BA的,尽量请教BA

学好英语

       学好英语,不仅要向普通人那样学。作为程序员,还要有针对性的学习。可以看一些英语专业书。用英文的操作系统。

猜你喜欢

转载自blog.csdn.net/juwikuang/article/details/8078758