-
短小
-
函数越短小越好!
- if,else,while,它们中的代码最好只有一行!最好是一个函数调用
- 又因为函数名称具有说明意义,所以它们本质上又是一个不错的说明文档!
-
-
只做一件事
-
函数应该只做一件事情!
- 如何判断函数是否只做了一件事情:看该函数是否能再拆出一个函数,该函数不仅只是单纯地重新诠释其实现!
-
-
每个函数一个抽象层级
-
自顶向下读代码:向下规则
-
确保函数做一件事情的关键,就是函数中的语句要在同一抽象层级上。
- 程序就像是一系列TO开头的段落,每一段都描述当前抽象层级,并引用位于下一个抽象层级的后续TO起头段落。
-
-
-
switch语句
- 如果该语句只出现一次,那么最好是用来创建多态对象(也就是工厂模式),而且要隐藏在某个继承关系中。
- 当然,要视情况而定,灵活应用;
-
使用描述性名称
- 别害怕长名称。长而具有描述性的名称,要比描述性的长注释好很多;
- 命名方式要一致。使用与模块名一脉相承的短语,名词和动词给函数命名,如:
includeSetupAndTeardownPages includeSetupPages includeSuiteSetupPage |
-
函数参数
- 最理想的参数数量是零,其次是一个,再次是两个,尽量避免使用三个,除非你有特殊的理由;
- 最好不要向函数传递布尔值;
-
参数对象
- 如果函数需要两个,三个甚至更多,那么是时候将它们封装成一个类了;
Circle makeCIrcle(double x,double y,double radius); |
- 可变参数算一个参数;
- 函数和参数应当形成一种良好的动词/名词对形式
writeField(name),它告诉我们,"name"是一个"field" |
- 尽量避免使用输出参数
-
分隔指令与询问
- 函数要么做什么事,要么回答什么事,二者不可兼得。
-
使用异常替代返回错误码
- 返回错误码就是要求调用者立刻处理错误
-
如果使用异常代替错误码,错误处理代码就能从主路径代码中分离出来,得到简化:
-
抽离try/catch代码块
-
最好把try和catch代码块的主体部分抽离出来,另外形成函数:
-
-
错误处理就是一件事
- 错误处理就是一件事。处理错误的函数不该做其他事。如果关键字try在某个函数中存在,它就该是这个函数的第一个单词,而且在catch/finally代码块后面也不该有其他内容;
-
Error.java依赖磁铁
-
返回错误码通常按时某处有个类或是枚举,定义了所有错误码
-
这样的类就是依赖磁铁;其他许多类都要导入和使用它。当它被修改时,所有使用它的类都要重新编译;
- 使用异常替代错误码,新异常就可以从异常类派生出来,无需重新编译或重新部署;
-
-
别重复自己
-
结构化编程
-
每个函数,函数中的每个代码块都应该有一个入口,一个出口。这样就意味着每个函数只该有一个return,循环中不能有break或continue,永远不要有GOTO语句;
- 在短小的函数中,这条不太适用。只要保持函数短小,偶尔出现的return,break,continue没有坏处;
-
-
如何写出这样的函数?
- 不可能一蹴而就!
- 一开始都冗长而复杂;
- 完成之后,开始打磨,分解函数,修改名称,消除重复,或者拆散类。并保证它们测试通过
-