在编程中取一个好名字很花时间,但是花去的时间绝对物有所值,笔者的mentro说过:“你写代码所花去的时间一定远小于将来别人读你代码所花去的时间,所以不要给别人添麻烦。”命名就是不给别人也是不给自己添麻烦的第一步。笔者在读完《Clean Code》的第二章后,将命名的要点总结为两点:精确、具体。
精确
命名应当精确,变量、函数或者类的名称应该回答了所有的大问题,它应该告诉读者,它为什么会存在,它要做或者做了什么事,它应该如何使用,而不是用注释来体现这些。那么如何做到精确?笔者认为,假如在项目中做到命名的单词与读者脑海的概念形成一对一的映射,便做到了命名的精确。
单词---->概念
- 避免 单词---->零个概念 这一情况 要避免上述情况就需要在命名时不要说废话,比如以数字做区别(a1、a2、a3)就完全没有提供正确信息,再比如variable出现在变量名中、table出现在表名中都是在说废话。
- 避免 单词---->多个概念 这一情况 要避免上述情况就需要做到避免思维映射,不要让读者把名称翻译为他们熟知的另一种概念,也不能一词多意。比如在多个类中有add方法表示通过增加或连接两个现有的值获得新值,假如要写一个新方法表示把单个参数放到集群中,那么这个方法就不能使用add命名,而应该用insert或者append。
概念---->单词
- 为每一抽象概念选一个词 如果在多个类中给同种方法命名确实用了fetch、get和retrieve等多个同义词,就会让读者产生困惑。所以给每个抽象概念选一个词并且一以贯之。
具体
精确做的是把命名单词与概念形成一对一映射,而具体则需要把这种一对一映射做的更好,而不是读者读了命名之后脑海中一片混沌。
添加有用的语境
假如有名为firstName、lastName、street、houseNumber、city这些变量,它们在一起时明显构成了一个地址。不过当它们单独出现时就无法推断它们是地址的一部分。所以可以添加前缀为addrFirstName、addrLastName、addrState等,以提供语境。当然,假如能够创建一个名为Address的类则更好。
使用可读出来的名字
编程是个社会活动,如果名称读不出来,那么讨论的时候就会有些尴尬。而且,使用可读出来的名字也更容易让读者留下印象。
使用可搜索的名字
单个字母名称和数字常量很难在一大片代码中找出来。找MAX_CLASS_PER_STUDENT比搜索数字7容易太多了。所以能够使用搜索获得准确结果的名字才是一个合格的名字。