Consolidate Conditional Expression(合并条件式)

你有一系列条件测试,都得到相同结果。

将这些测试合并为一个条件式,并将这个条件式提炼成为一个独立函数。

double disabilityAmount() {
if (_seniority < 2) return 0;
if (_monthsDisabled > 12) return 0;
if (_isPartTime) return 0;
// compute the disability amount

==〉

double disabilityAmount() {
if (isNotEligableForDisability()) return 0;
// compute the disability amount

动机

有时你会发现这样一串条件检查,检查条件各不相同,最终行为却一致。如果发现这种情况,就应该使用logical-AND和logical-OR将它们合并为一个条件式。

之所以要合并条件代码,有两个重要原因。首先,合并后的条件代码会告诉你[实际上只有一次条件检查,只不过有数个并列条件需要检查而已],从而使这一次检查的用意更清晰。当然,合并前和合并后的代码有着相同的效果。但原先代码传达出的信息却是[这里有一些独立条件测试,它们只是恰好同时发生];其次,这项重构往往可以为你使用Extract Method做好准备。[将检查条件提炼成一个独立函数],对理清代码意义非常有用,因为它把描述[做什么]的语句换成了[为什么这样做]。

作法

条件语句的[合并理由],也同时指出了[不要合并]的理由。如果你认为这些检查的确彼此独立,的确不应该被视为同一次检查,那么就不要使用本项重构,因为在这种情况下,你的代码已经清楚表达出自己的意义。

作法

1. 确定这些条件语句都没有副作用(连带影响)

如果条件式有副作用,你就不能使用本项重构。

2. 使用适当的逻辑操作符,将一系列相关条件式合并为一个

3. 编译、测试

4. 对合并后的条件式实施Extract Method

 

Ors

请看下列代码

double disabilityAmount() {
if (_seniority < 2) return 0;
if (_monthsDisabled > 12) return 0;
if (_isPartTime) return 0;
// compute the disability amount
...

在这段代码中,我们看到一连串的条件检查,它们都做同一件事,对于这样的代码,上述的代码等价于一个以Logic-OR连接起来的语句

double disabilityAmount() {
if ((_seniority < 2) || (_monthsDisabled > 12) || (_isPartTime))
return 0;
// compute the disability amount
...

现在,我可以观察这个新的条件式,并运用Extract Method将它提炼成一个独立函数,以函数名称表达该语句所检查的条件。

double disabilityAmount() {
if (isNotEligibleForDisability()) return 0;
// compute the disability amount
...
}
boolean isNotEligibleForDisability() {
return ((_seniority < 2) || (_monthsDisabled > 12) ||
(_isPartTime));
}

 

Ands

上面示例展示了Logical-OR的用法,下列代码展示Logical-AND的用法。

if (onVacation())
if (lengthOfService() > 10)
                return 1;
return 0.5;

这段代码可以变成

if (onVacation() && lengthOfService() > 10) return 1;
else return 0.5;

你可能还会发现,某些情况下需要同时使用Logical-AND,Logical-OR,Logical-NOT,最终得到的条件式可能很复杂,所以我会先使用Extract Method将表达式的一部分提炼出来,从而使整个表达式变得简单一些。

如果我所观察的部分,只是对条件进行检查并返回一个值,我可以使用三元操作符将这一部分变成一条return语句。因此,下列代码

if (onVacation() && lengthOfService() > 10) return 1;
else return 0.5;

变成了

return (onVacation() && lengthOfService() > 10) ? 1 : 0.5;

 

 

你可能感兴趣的:(重构方法)