软件中随处可见命名。我们给变量、函数、参数、类和封包命名。我们给源代码及源代码所在目录命名。我们给jar文件、war文件和ear文件命名。我们无时无刻在进行这命名。既然有这么多的命名要做,不妨做好它。
下面列出了取个好名字的几条规则。
1、名副其实。
变量函数或类的名称应该已经答复了以下的问题:
变量为什么会存在,变量做什么事,变量应该怎么用。
2、避免误导
以同样的方式拼写出同样的概念才是信息。拼写前后不一致就是误导。
(1)避免使用与本意相悖的词。
(2)避免使用有特殊意义的词。比如把一组账号直接命名为List,就会和原有的容器类List相同,引起错误的判断。
(3)提防使用不同之处较小的名称。必须函数命名出现外形很相似的命名。就像XYZControlerForHandlingofStrings和XYZControlerForStorageOfStrings.
3、做有意义的区分。
命名中光是添加数字系列或是废话远远不够,即便这足以让编译器满意。如果名称必须相异,那其意思也应该不对才对。(特别反感数字命名。)
废话是另一种没意义的区分。假设你有一个Product类。如果还有一个ProductInfo或者ProductData类。虽然名称不同,意思却无区别。Info和Data就像a、an和the一样。是具体含混的废话。
废话都是冗余。Variable一词永远不应当出现在变量中。
4、使用读的出来的名称。
简单来说,就是不要怕变量名长,即便缩写也不要太简略。让人分辨不出来由哪几个单词合成。搞的一头雾水,产生歧义。
5、使用可搜索的名称。
对于数字常量来说,一定用宏定义代替。字符常量尽量用宏定义代替。比较i==5这样写,没人看的懂为啥和5比较。同时维护起来说不定就少改了一处。
命名中长名称胜于短名称,搜的到的名称胜于自造编码代写就的名称。(这翻译,感觉好拗口,其实就是我上面的经验)另外,单字母的名称仅用于短方法中的本地变量。名称长短应与其作用域大小想对应。
6、避免使用编码
这个主要说了三点:命名中不要带关键字、不要加成员前缀m_、接口类中不要刻意在命名中说明是接口。
(1)关键字
作者说的这个编码,其实就是C++和C中的关键字。意思就是尽量不要在命名的变量中带关键字。但是从MFC出来的,都喜欢在变量名中带类型。作者的意思是以前的IDE没有做检测,但是对于C++、C和Java来说都是强类型的语言,在代码编辑的开始就能检测到类型错误的程度。所以,在变量名称中加类型就显得多余了,而且如果更改了变量的类型,名称没有更改。就为后期别人阅读代码增加了难度。比如PhoneNumber phoneString;//类型变化时,名称并不变化。
(2)成员前缀。
不必用m_前缀来标明成员变量。应当把类和函数做的足够小,消除对成员前缀的需要。(臣妾做不到啊!!!)你应当使用某种可以高亮或用颜色标出成员的编辑环境。(这点有点想当然了。可能还是我看的代码少,功力不够吧。)
代码读的越多,眼中就越没有前缀。代码读的越多,眼中就越没有前缀。代码读的越多,眼中就越没有前缀。
最终,前缀变作了不入法眼的废料,变作了旧代码的标志物。
(3)接口和实现
作者说喜欢不加修饰的接口。比如对于IShapeFactory和ShapeFactory两个命名。他更喜欢不加修饰的。前导字母I被滥用了,说好听是干扰。说难听点就是废话的程度。(看的代码少,体会不到。可能他更想让人们关注类本身,而不仅仅是接口实现的动作。)
7、避免思维映射。
不应当让阅读代码的人在脑中把你的名称翻译或者映射为他们熟知的名称。聪明程序员和专业程序员之间的区别在于,专业程序员了解,明确是王道。专业程序员善用其能,编写其他人能理解的代码。
8、类名
类名和对象名应该是名词或者名词短语,类名不应当是动词。
9、方法名
方法名应当是动词或动词短语。属性访问器、修改器和断言应该根据其值命名。
10、别扮可爱。
用人话说,就是“言到意到,意到言到”。
11、每个概念对应一个词。
给每个抽象概念选一个词,并且一以贯之。函数名称应当是独一无二的,并且要保持一致。这样你才能不借助多余的浏览就找到正确的方法。
12、别用双关语。
避免同一单词用于不同目的。
13、使用解决方案领域名称。
代码是给程序员看的,能用术语尽量用术语。
14、使用源自所涉问题领域的名称。
如果没有熟语或者术语,就采用从所涉问题领域而来的名称吧。至少,负责维护代码的人就能去请教领域的专家了。优秀的程序员和设计师,其工作之一就是分离解决方案领域和问题领域的概念。
15、添加有意义的语境。
如果上面招数都不见效,给名称添加浅醉是最后一招了。不过记得,添加前还是要想一想,能不能通过类的封装来提供语境呢?
16、不要添加没用的语境。
大神都这么啰嗦吗???上面说了可以添加语境。下面又开始划重点,记的有意义三个字。
只要短名称足够清楚,就要比长名称好。别给名称添加不必要的语境。
终于完了,但是还是要慢慢体会。