短小
第一规则:短小。
if语句、else语句、while语句等,其中的代码块应该只有一行,该行大抵应该是一个函数调用语句,这样既能保持函数短小,而且,因为块内调用的函数拥有较具说明性的名称,从而增加了文档上的价值。所以函数的缩进层级不该多于一层或两层,这样的函数易于阅读和理解
第二条:函数应该做一件事。做好这件事,只做这一件事。
如果函数只是做了该函数名下同一抽象层上的步骤,则函数还是只做了一件事,编写函数毕竟是为了把大一些的概念(换言之,函数的名称)拆分为另一抽象层上的一系列步骤。注意函数中的区段,只做一件事的函数无法被合理地切分为多个区段。
第三条:每个函数一个抽象层级
要却道函数只做了一件事,函数中的语句都要在同一抽象层级上。
自顶向下读代码:向下规则
我们想要这样读程序,程序就像是一系列TO起头的段落,每一段都描述当前抽象层级,并引用位于下一抽象层级的后续TO起头段落
例如:要容纳设置和分拆步骤,就先容纳设置步骤,然后纳入测试页面内容,在纳入分析步骤。
要容纳设置步骤,如果是套件,就纳入套件设置步骤,然后在纳入普通设置步骤。
要容纳套件设置步骤,先搜索“SuiteSetUp”页面的上级继承关系,在添加一个包括该页面路径的语句。
Switch语句
写出短小的switch语句很难。写出只做一件事的switch也很难,switch天生要做N件事,不幸的是我们总无法避开switch语句。
例如下面这个Payroll.java文件
public Money calculatePay(Employee e)
throws InvalidEmployeeType{
switch (e.type){
case COMMISSIONED:
return calculateCommissionedPay(e);
case HOURLY:
return calculateHourlypay(e);
case SALARIED:
return calculateSalariedpay(e);
default:
throw new InvalidEmployeeType(e.type);
}
}
这个函数的问题:
1.太长,如果出现新的类型的话,还会更长
2.它做了不止一件事
3.它违反了单一权责原则,因为有好几个修改它的理由
4.它违反了开放闭合原则,每当添加新类型时,就必须修改
解决方案:将switch语句埋到抽象工厂底下,不让任何人看到。
对于switch语句,如果只出现一次,用于创建多态对象,而且隐藏在某个继承关系中,在系统其他部分看不到,就还能容忍。
函数——使用描述性名称
我们可以把名称从testableHtml改为SetupTeardownIncluder.render,因为它较好的描述了函数做的事情。
- 不要害怕长名称,长而具有描述性的名称,要比短而令人费解的名称好
- 不要害怕花时间取名字
- 选择描述性的名称能理清你关于模块的设计思路,并帮你改进。
- 命名方式要保持一致。
-55
网友评论