降低模块复杂度
- 抽取函数:独立业务代码封装为函数,通过函数名诠释代码作用,做到见名知意
- 合并重复:不同条件的分支,有相似的处理,可以提炼出分支以外,或者封装为函数
- 移除控制标记:有控制标签作为条件的,使用break/return取代
- 设计模式:对于同一层的if/else, - switch/case分支过多,可考虑采用状态机或策略模式、表驱动法(Map查找)
- 单一职责:一个函数应该只实现一个功能点
变量个数
- 不需要有过多的局部变量,单个函数建议局部变量不超过5个
- 解决方案;Replace Method with Method Object
方法-对象-简化代码
- Replace Method with Method Object(以函数对象取代函数)
- 问题:你有一个过长函数,它的局部变量交织在一起,以致于你无法应用提炼函数(Extract Method) 。
- 解决:将函数移到一个独立的类中,使得局部变量成了这个类的字段。然后,你可以将函数分割成这个类中的多个函数。
- 以查询取代临时变量(Replace Temp with Query) (替换临时变量为函数调用)
- 引入参数对象(Introduce Parameter Object)
- 问题:某些参数总是很自然地同时出现。
- 解决: 以一个对象来取代这些参数。
- 保持对象完整(Preserve Whole Object)
- 问题:你从某个对象中取出若干值,将它们作为某一次函数调用时的参数。
- 解决:改为传递整个对象
int low = daysTempRange.getLow();
int high = daysTempRange.getHigh();
boolean withinPlan = plan.withinRange(low, high);
to
改为传递整个对象。
boolean withinPlan = plan.withinRange(daysTempRange);
- 分解条件表达式(Decompose Conditional)
- 解决:复杂的条件表达式,使用函数进行封装
嵌套层次
-
降低if/else嵌套层次方法
- 少使用else:使用if + return,代码反向判断,避免进入 else 分支,提前 return
- 减少非空判断:如Java8引用Optional的orElse或orElseGet方法
- 合并if条件判断:使用条件与(&&),利用条件短路的特性
- 三元表达式:如Java中的 e = (a==b) ? c : d ,c与d可以是函数调用
-
try/catch可以再嵌套try/catch,但也是最容易出逻辑问题的地方,降低try/catch嵌套层次方法:
- 抽取函数:try与catch的中各代码块超过10行以上,建议是分别抽取函数,try/catch块内只有函数调用
- 合并try/catch:分析是否可以合并try/catch到同一层次
- 折分try/catch:让try的范围更小,尽早catch,避免大try中不必要的嵌套