Clean Code – 函数

By | 2019年3月31日

1. 短小

函数的第一条规则就是要短小,第二条规则还是短小。没法证明这个断言,也没有任何证实了小函数更好的研究结果。但是经验告诉我们,小函数不易出错,而且容易看懂。

  • 一行代码最好不要超过120个字符,最大可以忍受150个字符。太长的话,容易有滚动条。
  • 代码行数不要超过20行最佳。

2. 只做一件事

函数应当只做一件事,做好这件事。如果函数做了多件事情,就把每件事情拆分一个函数。拆分后代码短了,并且更容易给每个拆分后的函数起个好的名字。

3. 无副作用

函数承诺制做一件事,但还是会做其它被隐藏起来的事。下面的函数检查userName和password是不是valid,它有副作用。

public boolean checkPassword(String userName, String password) {
  User user = UserGateway.findByName(userName);
  if (user != User.NULL) {
    String codedPhrase = ser.getPhraseEncodedByPassword();
    String phase = cryptographer.decrypt(codedPhrase, password);
    if ("Valid Password".equals(phase)) {
      Session.initialize();
      return true;
    }
  }
  retur false;
}

checkPassword函数就是用来检查密码的,但它还初始化Session。如果Session已经初始化了,调用checkPassword函数,就会抹掉当前Session,初始化一个新的Session。

如果一定要加入Session.initialize()这样代码,就重命名函数为checkPasswordAndInitializeSession,防止错误使用该函数。

4. try/catch代码块

try里面的代码抽离为一个函数,当前函数仅仅是处理异常的,try/catch语句前后,都不应该有其它代码。比如下面代码:

public void delete(Page page) {
  try {
    doDelete();
  } catch (PermissionException e) {
    // Handle PermissionException.
  } catch (FileNotFoundException e) {
   // Handle FileNotFoundException.
  }
}

public void doDelete(Page page) throws PermissionException, FileNotFoundException {
  deletePage(Page);
  registry.deleteReference(page.name);
  configKeys.deleteKey(page.name.makeKey());
}