第二章 有意义的命名
概述
软件中随处可见命名。我们给变量、函数、参数、类和封包命名。我们给源代码及源代码所在目录命名。我们给jar文件、war文件和ear文件命名。我们命名、命名,不断命名。
既然有这么多命名要做,不妨做好它。下文列出了取个好名字的几条简单规则
规则
1. 名副其实
其实换一句话通俗的话说就是“见名知意”.
demo
String[] array=new String[]{"学生1","学生2"};
这是一个代表学生的数组,但是我们array没有明确的意思。我们应该直接写成能够直接看明白的名称。
String[] studentArray=new String[]{"学生1","学生2"};
2. 避免误导
命名不能有歧义,并且避免太过于相似导致难以区分
demo1:
String[] studentList =new String[]{"学生1","学生2"};
其中studentList不是一个List却命名成List,容易给人带来误导,直接写成”studentArray“或者真正用List容器来存放.
demo2:
class XYZControllerForEfficienHandingOfStrings{
}
class XYZControllerForEfficienStorageOfStrings{
}
两个类的命名太过于相似,难以辨认。
demo3:
int l=0;//小写字母的l
int O=0;//大写字母的O
}
避免使用小写字母的l,大写字母的O
3. 做有意义的区分
如果名称必须相异,意思上必须不同才对
demo1:
public void copyChars(a1[],a2[]){
}
如果参数名改成”source“,”destination“,函数会像样很多。
demo2:
避免废话的区分
class ProductInfo{
}
class ProductData{
}
上述例子虽然名称不同,意思却无区别。Info和Data就像”a、an、the“一样,是意义含糊的废话。
要区分名称,就要以读者能鉴别不同之处的方式来区分
4. 使用读的出来的名称
命名应当易读。
demo
Srting projectName=null;
而不是一些很难发音的自造词汇。
5. 使用可搜索的词汇
避免常用,不易找到的名称或数字。
demo
int i=7;
int sum=0;
for(int j=0;j<i;j++){
sum+=i;
}
如果把”i“ 写成”cycleNumber“,cycleNumber容易找到,名称太常见,无明显意义的”i“ 就反而难以找到。
6. 避免使用编码
- 不必用特殊的前缀来标记成员变量。应当把类和函数做得足够小,消除队成员前缀的需要。
7. 避免映射思维
不应当让读者在脑中把你的名称翻译为他们熟知的名称。这种问题经常出现在选择是使用问题领域术语还是解决方案领域术语时。
单字母变量名就是个问题。在作用域较小、也没有名称冲突时,循环计数器自然有可能被命名为i或j或k。(但千万别用字母1!)这是因为传统上惯用单字母名称做循环计数器。然而,在多数其他情况下,单字母名称不是个好选择;读者必须在脑中将它映射为真实概念
仅仅是因为有了a和b,就要取名为c,实在并非像样的理由
8. 类名
类名和对象名应该是名词或名词短语,如 Customer, wikiPage、 Account和 AddressParser 避免使用 Manager、 Processor、Data或hnfo这样的类名。类名不应当是动词。
9. 方法名
方法名应当是动词或动词短语,如 postPayment、 deletePage或save。属性访问器、修改 器和断言应该根据其值命名,并依 Javabean标准加上get、set和is前缀。
10.别使用俗语
- 即别使用地方词汇,使用大家通用都懂的词汇
11. 每个概念对应一个词
demo
class controller{
}
class manager{
}
如果这两个类都是mvc的c类文件,取其中一种即可。一个程序中一个概念统一一个词汇。
12. 别用双关语
- 命名应当通俗易懂,不必花时间去揣摩其意思
13. 使用解决方案领域名称
记住,只有程序员才会读你的代码。所以,尽管用那些计算机科学( Computer Science,Cs) 术语、算法名、模式名、数学术语吧。依据问题所涉领域来命名可不算是聪明的做法,因为不该让协作者老是跑去问客户每个名称的含义,其实他们早该通过另一名称了解这个概念了 。
对于熟悉访问者(ⅥsToR)模式的程序来说,名称 Account Visitor富有意义。哪个程
序员会不知道 JobQueue的意思呢?程序员要做太多技术性工作。给这些事取个技术性的名称,通常是最靠谱的做法。
14. 使用源自所涉问题领域的名称
如果不能用程序员熟悉的术语来给手头的工作命名,就采用从所涉问题领域而来的名称 吧。至少,负责维护代码的程序员就能去请教领域专家了。
优秀的程序员和设计师,其工作之一就是分离解决方案领域和问题领域的概念。与所涉问题领域更为贴近的代码,应当采用源自问题领域的名称。
15. 添加有意义的语境
在公共的地方可以给名称带上有语义的前缀,增加含义。(请将这点与废话的前缀区分开来)
demo
String firstName;
String lastName;
如果上述代码代表地址名称,改成以下代码可能更加有明显意义
String addrFirstName;
String addrLastName;
千万不要添加没有意义的语境,如果没有意义就变成了前面提到的”废话“
最后的话
取好名字最难的地方在于需要良好的描述技巧和共有文化背景。与其说这是一种技术、商业或管理问题,还不如说是一种教学问题。其结果是,这个领域内的许多人都没能学会做得很好。
我们有时会怕其他开发者反对重命名。如果讨论一下就知道,如果名称改得更好,那大
家真的会感激你。多数时候我们并不记忆类名和方法名。我们使用现代工具对付这些细节好让自己集中精力于把代码写得就像词句篇章、至少像是表和数据结构(词句并非总是呈现数据的最佳手段)。改名可能会让某人吃惊,就像你做到其他代码改善工作一样。别让这种事阻碍你的前进步伐。