Skip to main content

重构 01-Replace Nested Conditional with Guard Clauses 以卫语句取代嵌套条件表达式

在函数中,如果嵌套很深的if/else,代码理解起来是比较费力,可以说是bad code。在重构过程中,可以通过谓语句表达式达到同样的效果。如下代码:
[java]
double getPayAmount() {
double result;
if (_isDead) result = deadAmount();
else {
if (_isSeparated) result = separatedAmount();
else {
if (_isRetired) result = retiredAmount();
else result = normalPayAmount();
};
}
return result;
};

double getPayAmount() {
if (_isDead) return deadAmount();
if (_isSeparated) return separatedAmount();
if (_isRetired) return retiredAmount();
return normalPayAmount();
};
[/java]

根据我的经验,条件表达式通常有两种表现形式。第一种形式是:所有分支都属于正常行为。第二种形式则是:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况。

这两类条件表达式有不同的用途,这一点应该通过代码表现出来。如果两条分支都是正常行为,就应该使用形如if…else…的条件表达式;如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为”卫语句”(guard clauses) [Beck]。

Replace Nested Conditional with Guard Clauses (250)的精髓就是:给某一条分支以特别的重视。如果使用if-then-else结构,你对if分支和else分支的重视是同等的。这样的代码结构传递给阅读者的消息就是:各个分支有同样的重要性。卫语句就不同了,它告诉阅读者:”这种情况很罕见,如果它真地发生了,请做一些必要的整理工作,然后退出。”

有时候,将条件反转,利用谓语句结构,可以写出很好理解的代码。如下:
[java]
public double getAdjustedCapital() {
double result = 0.0;
if (_capital > 0.0) {
if (_intRate > 0.0 && _duration > 0.0) {
result = (_income / _duration) * ADJ_FACTOR;
}
}
return result;
}
[/java]

利用谓语句重构这个方法,是不是一下好理解很多!
[java]
public double getAdjustedCapital() {
double result = 0.0;
if (_capital <= 0.0) return result;
if (_intRate > 0.0 && _duration > 0.0) {
result = (_income / _duration) * ADJ_FACTOR;
}
return result;
}
[/java]

引用
Refactor category
重构 改善既有代码的设计重构