第三章:Names That Can’t Be Misconstrued
本章的核心思想:通过询问自己“它还可能被理解成什么意思?”来积极审查自己所起的变量名。
对于包含性的上下限问题最好使用max_和min_
例:CART_TOO_BIG_LIMIT = 10;if shopping_cart.num_items() >= CART_TOO_BIG_LIMIT:
但是我们分不清,到底应该是大于还是大于等于,如果将名字改为MAX_ITEMS_IN_CART = 10那么一切就清楚了。if shopping_cart.num_items() > MAX_ITEMS_IN_CART:
对于包含性的范围问题,最好使用fist和last
当然如果听起来正确,那么max和min也可以用于包含性范围问题。
对于开始包含结束不包含的范围性问题,最好使用begin和end
给bool型变量命名时,一定要使布尔值true和false有清晰的含义
例:bool read_password = true;这个read_password有两种意思,我们需要取得密码,还是密码已经被读出呢?最好的方式是用need_password或者user_is_authenticated根据不同的含义来代替它。
一般我们可以使用is, has, can, 或者 should来使布尔值变清楚
例:SpaceLeft()听起来好像是要返回一个num值,所以HasSpaceLeft()更清楚
最后最好不要在bool型名字中出现否定短语
例:用bool use_ssl = true;代替bool disable_ssl = false;
要和用户的期望值匹配
例:public class StatisticsCollector {
public void addSample(double x) { ... }
public double getMean() {
// Iterate through all samples and return total / num_samples
}
...
}
getMean() 的原意是获得过去数据的平均值,这是一个昂贵的操作,但是编程人员有个潜在的约束,凡是get开头的方法都是轻量级的方法,例如返回类中的内部变量等等,所以在使用getMean() 的时候就很随意。因此如果我们将它重命名为computeMean(),则会使其听起来是个昂贵的操作,程序员在调用它的时候也会谨慎的多。
从候选名字中选一个最适合的
当人们在起名字时可能会有很多候选名字,常用的做法是评判这些候选名字的优点,然后再做决定,下面的例子阐述了评判过程:
experiment_id: 100
description: "increase font size to 14pt"
traffic_fraction: 5%
到
experiment_id: 101
the_other_experiment_id_I_want_to_reuse: 100
[change any properties as needed]
候选名字是
1. template
2. reuse
3. copy
4. inherit
最佳名字是:copy_experiment 和 inherit_from_experiment_id
总结:
最好的命名是使用那些不能被误解的词汇:当别人在读你的程序时能够清楚的知道你所赋予变量的含义,糟糕的是很多英语单词的意思是模棱两可的,例如filter, length, 和 limit。
在命名的时候,尽量想象你的命名可能被怎样误解,这样取出的名字将很难再被误解。