函数的规则:
短小
代码块和缩进
if语句、else语句、while语句等,其中的代码块应该只有一行。该行大抵应该是一个函数调用语句。这样不但能保持函数短小,而且,因为块内调用的函数拥有较具说明性的名称,从而增加了文档上的价值。
这也意味着函数不应该大到足以容纳嵌套结构。所以,函数的缩进层级不该多于一层或两层。当然,这样的函数易于阅读和理解。
只做一件事
每个函数一个抽象级别
使用描述性的命名
函数参数尽量少
最理想的参数数量是零(零参数函数),其次是一(单参数函数),再次是二(双参数函数),应尽量避免三(三参数函数)。有足够特殊的理由才能用三个以上参数(多参数函数)——————所以无论如何也不要这么做。
从测试的角度看,参数过多测试覆盖所有可能值的组合让人生畏。
标识参数
向函数传入布尔值简直就是骇人听闻的做法。这样做标识着导致该函数不止做一件事。
如果函数看来需要两个、三个或三个以上参数,就说明其中一些参数应该封装为类了。
分隔指令与询问
public boolean set(String attribute, String value);
该函数设置某个指定属性,如果成功就返回true,如果不存在那个属性则返回false。这就会导致以下的语句:
if (set("username", "unclebob")) ...
。作者本意,set是个动词,但在if语句的上下文中,感觉它像是个形容词。该语句读取来像是说“如果username属性值之前已被设置为unclebob”,而不是“设置username属性值为unclebob,看看是否可行,然后……”。要解决这个问题,可以将set函数重命名为setAndCheckIfExists,但这对提高if语句的可读性帮助不大。真正的解决方案是把指令与询问分割开来,防止混淆的发生:
1
2
3
4if (attributeExists("username")) {
setAttribute("username","unclebob");
...
}使用异常代替返回错误码
避免重复的代码