前言
与面向过程编程相比,面向对象编程的条件表达式相对来说已经比少了,因为很多的条件行为都可以被多态的机制处理掉;但是有时候我们还是会遇到一些小伙伴写出来的条件表达式和面向过程编程没什么差别,比如我遇到过这段代码:
整段代码有三层,每一层还有if-else,本身的这段代码的逻辑就够难以理解了,更加恶心的是这个方法的调用方以及调用的其他方法,同样也是这样的if-else嵌套几层;
加之这段代码还有一个很大的问题是传入的参数对象,在内部以及调用的其他方法中被修改多次修改,这样就更难懂了;靠普通人的单核CPU想看懂太难了,维护这段代码我感觉身体被掏空
有时候我们可能会遇到比较复杂的条件逻辑,需要我们想办法把分成若干个小块,让分支逻辑和操作细节分离;看一个程序员的码德如何,先看他的条件表达式是否够简洁易懂;今天我们来分享一下简化条件表达式的常用方法,修炼自己的码德;本文中大部分的例子来源于《重构改善既有代码设计》
分解条件表达式
复杂的条件逻辑是最常导致复杂度上升的地方之一,另外如果分支内部逻辑也很多,最终我们会得到一个很大的函数,一个长的方法可读性本身就会下降,所以我们需要把大的方法才分的多个的方法,为每个方法取一个容易清楚表达实现内部逻辑的方法名,这样可读性就会上大大提高。
举例:
if (date.before (SUMMER_START) || date.after(SUMMER_END)) {
charge = quantity * _winterRate + _winterServiceCharge;
} else {
charge = quantity * _summerRate
}
这种代码很多人可能都觉得没必要去提取方法,但是如果我们想要看懂这段代码,还是必须的去想想才知道在做什么;接下来我们修改一下
if (notSummer(date)) {
charge = winterCharge(quantity);
} else {
charge = summerCharge(quantity);
}
private boolean notSummer(Date date){
date.before (SUMMER_START) || date.after(SUMMER_END)
}
private double summerCharge(int quantity) {
return quantity * _summerRate;
}
private double winterCharge(int quantity) {
return quantity * _winterRate + _winterServiceCharge;
}
这样修改之后是不是很清楚,好的代码本身不需要写注释(代码具有自说明性),更不需要在方法内部写任何注释,有时候我们会看到有同学会在方法内部隔几行就会写一点注释,这说明本身代码的自说明性不够好,可以通过刚才这个例子的方式提高代码的可读性
合并条件表达式
当遇到一段代码多个if条件判断,但是条件内部的逻辑缺类似,我们可以把条件合并在一起,然后抽取方法。
举例1:
double disabilityAmount () {
if(_seniortiy <2 )
return 0;
if(_monthsDisabled > 12)
return 0;
if(_isPartTime)
return 0;
// 省略...
}
这里的条件返回的结果都是一样的,那么我们先把条件合并起来
double disabilityAmount () {
if(_seniortiy <2 || _monthsDisabled > 12 || _isPartTime) {
return 0;
}
// 省略...
}
接下来我们再来把判断条件判断条件抽取成方法提高可读性
double di