Skip to content

第三章 不会误解的名字

在前一章中,我们将到了如何把信息塞入名字中。本章会关注另一个话题:小心可能会有歧义的名字。

关键思想

要多问自己几遍: “这个名字会被人解读成其他的含义吗?”

推荐使用 min 和 max 来表示包含的极限

假设你的购物车应用程序最多不能超过10件物品:

python
CART_TOO_BIG_LIMIT = 10
if shopping_cart.num_items() >= CART_TOO_BIG_LIMIT:
   Error("Too Many items in cart.")

这段代码有个经典的“大小差一”缺陷。我们可以把 >= 编程 > 或者通过把 CART_TOO_BIG_LIMIT 变成 11。但问题根源在于 CART_TOO_BIG_LIMIT 是个二义性名字,它的含义到底是“少于”还是“少于且包括”不得而知。

在这个例子里,名字应当是 MAX_ITEMS_IN_CART

推荐使用 first 和 last 来表示包含范围

python
set.PrintKeys(first="Bart", last="Maggie")

推荐使用 begin 和 end 来表示包含或排除的范围

给布尔值命名

当为布尔值变量或者返回布尔值的函数命名时,要确保 true 和 false 的意义很明确。

通常来讲,加上 is、has、can 或者 should 这样的词,可以把布尔值变得更明确。

例如,spaceLeft() 函数听上去像是会返回一个数字,如果它的本意是返回一个布尔值,可能 hasSpaaceLeft() 这个名字更好一些。

最后,最好避免使用反义词名字。

例如,不要用

c
bool disable_ssl = false;

而更简单易读的表示方式是:

c
bool use_ssl = true;

与使用者的期望相匹配

java
public class StatisticsCollector {
   public void addSample(double x) { ... }
   public double getMean(){
      // Iterate through all samples and return total / num_samples
   }
}

在这个例子中, getMean() 的实现是要遍历所有经过的数据并同时计算其中的值。如果有大量的数据的话,这样的一步可能会有很大的代价!但一个容易轻信的程序员可能会随意地调用 getMean(),还以为这是个没什么代价的调用。

总结

不会误解的名字是最好的名字——阅读你代码的人应该理解你的本意,并且不会有其他的理解。遗憾的是,很多英语单词在用来编程时是多义性的,例如 filter、length 和 limit。

在你决定使用一个名字以前,要吹毛求疵一点,来想象一下你的名字会被误解成什么。最好的名字是不会误解的。

要定义一个值的上限或下限时, max 和 min 时很好的选择。对于包含的范围,first 和 last 时好的选择。对于包含或排除范围,begin 和 end 时最好的选择,因为它们最常用。

当为布尔值命名时,使用 is 和 has 这样的词来明确表示它是个布尔值,避免使用反义的词例如 dasable_ssl。

要小心用户对特定词的期望。例如,用户会期望 get() 或者 size() 是轻量的方法。