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()); }