Wetts's blog

Stay Hungry, Stay Foolish.

0%

代码整洁之道-第3章-函数

函数的规则:

  • 短小

    • 代码块和缩进

      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
    4
    if (attributeExists("username")) {
    setAttribute("username","unclebob");
    ...
    }
  • 使用异常代替返回错误码

  • 避免重复的代码