共计 1800 个字符,预计需要花费 5 分钟才能阅读完成。
download:拉钩 -Java 工程师待业急训营
下崽 ZY:https://www.zxit666.com/4265/
1 动机
有时发现这样一串条件查看:查看条件各不相同,最终行为却统一。
这时就该应用“逻辑或”和“逻辑与”将它们合并为一个条件表达式:
合并后的条件代码会表述“实际上只有一次条件查看,只不过有多个并列条件须要查看,从而使这一次查看的用意更清晰。当然,合并前和合并后的代码有着雷同的成果,但原先代码传播出的信息却是“这里有一些各自独立的条件测试,它们只是恰好同时产生”
这项重构往往能够为应用【提炼函数】做好筹备。将查看条件提炼成一个独立的函数对于厘清代码意义十分有用,因为它把形容“做什么”的语句换成了“为什么这样做”。
条件语句的合并理由也同时指出不要合并的理由:若我认为这些查看确实彼此独立,确实不应该被视为同一次查看,我就不会应用本项重构。
2 做法
确定这些条件表达式都没有副作用。
若某个条件表达式有副作用,可先用【将查问函数和批改函数拆散】解决。
应用适当的逻辑运算符,将两个相干条件表达式合并为一个。程序执行的条件表达式用逻辑或来合并,嵌套的 if 语句用逻辑与来合并。
测试。
反复后面的合并过程,直到所有相干的条件表达式都合并到一起。
能够思考对合并后的条件表达式施行【提炼函数】。
3 案例
案例一:逻辑或
public int disabilityAmount(Employee anEmployee) {
if (anEmployee.seniority < 2) {
return 0;
}
if (anEmployee.monthsDisabled > 12) {
return 0;
}
if (anEmployee.isPartTime) {
return 0; // compute the disability amount
}
}
复制代码
这里有一连串的条件查看,都指向同样的后果。既然后果雷同,就应该把这些条件查看合并成一条表达式。对这样程序执行的条件查看,能够用逻辑或运算符合并。
public int disabilityAmount(Employee anEmployee) {
if ((anEmployee.seniority < 2) || (anEmployee.monthsDisabled > 12)) {
return 0;
}
if (anEmployee.isPartTime) {
return 0;
}
return 1;
}
复制代码
而后把下一个条件查看也合并进来:
public int disabilityAmount(Employee anEmployee) {
if ((anEmployee.seniority < 2) || (anEmployee.monthsDisabled > 12) || (anEmployee.isPartTime)) {
return 0;
}
return 1;
}
复制代码
合并实现后,再对这句条件表达式应用【提炼函数】
public int disabilityAmount(Employee anEmployee) {
if (isNotEligableForDisability(anEmployee)) {
return 0;
}
return 1;
}
public boolean isNotEligableForDisability(Employee anEmployee) {
return ((anEmployee.seniority < 2) || (anEmployee.monthsDisabled > 12) || (anEmployee.isPartTime));
}
复制代码
案例二:逻辑与
例如,嵌套 if 语句的状况:
public double disabilityAmount(Employee anEmployee) {
if (anEmployee.onVacation) {
if (anEmployee.seniority > 10) {return 1;}
}
return 0.5;
}
复制代码
能够用逻辑与运算符将其合并:
public double disabilityAmount(Employee anEmployee) {
if ((anEmployee.onVacation) && (anEmployee.seniority > 10)) {
return 1;
}
return 0.5;
}
复制代码
如果原来的条件逻辑混淆这两种状况,我也会依据须要组合应用逻辑与和逻辑或运算符。这时,代码很可能变得凌乱,所以我会频繁应用【提炼函数】,把代码变得可读。