代码怎么用 代码怎么用手机打开( 三 )


废话都是冗余 。variable一词永远不应当出现在变量名中 。table一词永远不应当出现在表名中 。NameString会比Name好吗?难道Name会是一个浮点数?如果是这样,就违反了关于误导的规则 。
设想有一个名为Customer的类 , 还有一个名为CustomerObject的类,它们的区别何在呢?哪一个是表示客户历史支付情况的最佳方式?
有一个应用反映了这种状况 。为当事者讳,我们改了一下,不过犯错的代码的确就是这个样子:
getActiveAccount(); getActiveAccounts(); getActiveAccountInfo();程序员怎么知道该调用哪个函数呢?
如果缺少明确约定,那么变量moneyAmount与money就没区别,customerInfo与customer没区别,accountData与account没区别,theMessage也与message没区别 。要区分名称 , 就要以读者能鉴别不同之处的方式来区分 。
— 04 —
使用读得出来的名称
人类长于记忆和使用单词 。大脑的相当一部分就是用来容纳和处理单词的 。单词能读得出来 。人类的大脑中有那么大的一块地方用来处理言语 , 若不善加利用,实在是种耻辱 。
如果名称读不出来,讨论的时候就会像个傻鸟 。“哎,这儿 , 鼻涕阿三喜摁踢(bee cee arr three cee enn tee)[6]上头 , 有个皮挨死极翘(pee ess zee kyew)[7]整数,看见没?”这不是小事,因为编程本就是一种社会活动 。
有一家公司,程序里面写了一个genymdhms(生成日期,年、月、日、时、分、秒),他们一般读作“gen why emm dee aich emm ess”[8] 。我有见字照拼读的恶习,于是开口就念“gen-yah-mudda-hims” 。
后来好些设计师和分析师都有样学样 , 听起来傻乎乎的 。我们知道典故 , 所以会觉得很搞笑 。搞笑归搞笑,实际是在强忍糟糕的命名 。在给新开发者解释变量名的意义时,他们总是读出傻乎乎的自造词,而非恰当的英语词 。比较
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好找得多,而列表中也只剩下了体现作者意图的名称 。

推荐阅读