class DtaRcrd102 {private Date genymdhms;private Date modymdhms;private final String pszqint = "102";/*...*/};和class Customer {private Date generationTimestamp;private Date modificationTimestamp;private final String recordId = "102";/*...*/};
现在读起来就像人话了:“喂,Mikey,看看这条记录!生成时间戳(generation timestamp)[9]被设置为明天了!不能这样吧?”
— 05 —
使用可搜索的名称
对于单字母名称和数字常量,有一个问题,就是很难在一大篇文字中找出来 。
找MAX_CLASSES_PER_STUDENT很容易,但想找数字7就麻烦了,它可能是某些文件名或其他常量定义的一部分,出现在因不同意图而采用的各种表达式中 。如果该常量是个长数字,又被人错改过,就会逃过搜索,从而造成错误 。
同样,e也不是一个便于搜索的好变量名,它是英文中最常用的字母,在每个程序、每段代码中都有可能出现 。由此而见,长名称胜于短名称,搜得到的名称胜于用自造编码代写就的名称 。
窃以为单字母名称仅用于短 *** 中的本地变量 。名称长短应与其作用域大小相对应 [N5] 。若变量或常量可能在代码中多处使用,则应赋予其便于搜索的名称 。再比较:
for (int j=0; j<34; j++) {s += (t[j]*4)/5;}和int realDaysPerIdealDay = 4;const int WORK_DAYS_PER_WEEK = 5;int sum = 0;for (int j=0; j < NUMBER_OF_TASKS; j++) {int realTaskDays = taskEstimate[j] * realDaysPerIdealDay;int realTaskWeeks = (realTaskdays / WORK_DAYS_PER_WEEK);sum += realTaskWeeks;}
注意,上面代码中的sum并非特别有用的名称,不过至少搜得到它 。采用能表达意图的名称,貌似拉长了函数代码,但要想想看,WORK_DAYS_PER_WEEK比数字5好找得多,而列表中也只剩下了体现作者意图的名称 。
— 06 —
避免使用编码
编码已经太多,无谓再自找麻烦 。把类型或作用域编进名称里面,徒然增加了解码的负担 。没理由要求每位新人都在弄清要应付的代码之外(那算是正常的),还要再搞懂另一种编码“语言” 。这对解决问题而言,纯属多余的负担 。带编码的名称通常也不便发音,容易打错 。
匈牙利语标记法
在往昔名称长短很重要的时代,我们毫无必要地破坏了不编码的规矩,如今后悔不迭 。Fortran语言要求首字母体现出类型,导致了编码的产生 。BASIC语言的早期版本只允许使用一个字母再加上一位数字 。匈牙利语标记法[10](Hungarian Notation,HN)将这种态势愈演愈烈 。
在Windows的C语言API的时代,HN相当重要,那时所有名称要么是一个整数句柄,要么是一个长指针或者void指针,要不然就是string的几种实现(有不同的用途和属性)之一 。那时候编译器并不做类型检查,程序员需要匈牙利语标记法来帮助自己记住类型 。
现代编程语言具有更丰富的类型系统,编译器也记得并强制使用类型 。而且,程序员趋向于使用更小的类、更短的 ***,好让每个变量的定义都在视野范围之内 。
Java程序员不需要类型编码,因为对象是强类型的,代码编辑环境已经先进到在编译开始前就能监测到类型错误的程度!所以,如今HN和其他的类型编码形式都纯属多余 。它们增加了修改变量、函数或类的名称或类型的难度,它们增加了阅读代码的难度,它们制造了让编码系统误导读者的可能性 。
PhoneNumberphoneString;//name not changed when type changed!
成员前缀
也不必用m_前缀来标明成员变量 。应当把类和函数做得足够小,以消除对成员前缀的需要 。你应当使用某种可以高亮或用颜色标出成员的编辑环境 。
public class Part {private String m_dsc; // The textual descriptionvoid setName(String name) {m_dsc = name;}}--------------------------------------------------------------------------------------public class Part {String description;void setDescription(String description) {this.description = description;}}
此外,人们会很快学会无视前缀(或后缀),而只看到名称中有意义的部分 。代码读得越多,眼中就越没有前缀 。最终,前缀变作了不入法眼的废料,变作了旧代码的标志物 。
接口和实现
有时也会出现采用编码的特殊情形 。比如,你在做一个创建形状用的抽象工厂(Abstract Factory),该工厂是一个接口,要用具体类来实现 。你怎么来命名工厂和具体类呢?IShapeFactory和ShapeFactory吗?我喜欢不加修饰的接口 。前导字母I被滥用到了说好听点儿是干扰,说难听点儿根本就是废话的程度 。
我不想让用户知道我给他们的是接口,而就想让他们知道那是一个ShapeFactory 。如果在接口和实现中必须选其一来编码的话,我宁肯选择实现 。ShapeFactoryImp,甚至是丑陋的CShapeFactory,都比对接口名称编码好 。
推荐阅读
- 重复名空白代码,重复名字查询
- ie浏览器c0000005异常代码,c0000005异常代码蓝屏
- 苹果手机虚电量校正代码,苹果手机虚电量校正有什么用
- 企业代码怎么查询,企业代码查询系统官网
- 江西建设职业技术学院排名 江西建设职业技术学院
- 古井贡酒股票分析报告,古井贡酒股票代码是多少
- 梦幻西游手游变异泡泡技能怎样弄 梦幻西游变异泡泡技能是什么
- 梦幻西游手游技能认证是什么意思 梦幻西游手游唐僧技能是什么
- 梦幻西游手游普陀怎么加点 梦幻西游手游普陀怎么买武器
- 梦幻西游手游6技能鲛将军 梦幻西游鲛将军技能是什么