반응형
여러 겹의 조건문을 감시 절로 전환 (Replace Nested Conditional with Guard Clauses)
메서드에 조건문이 있어서 정상적인 실행 경로를 파악하기 힘들 땐 모든 특수한 경우에 감시 절을 사용하자.
조건식은 주로 두 가지 형태를 띤다. 첫째는 어느 한 경로가 정상적인 동작의 일부인지 검사하는 형태이고, 둘째는 조건식 판별의 한 결과만 정상적인 동작을 나타내고 나머지는 비정상적인 동작을 나타내는 형태다.
만약 둘다 정상 동작의 일부분이라면 if 절과 else 절로 구성된 조건문을 사용하고, 조건문이 특이한 조건이라면 그 조건을 검사해서 조건이 true 일 경우 반환하자. 이런 식의 검사를 감시절이라고 한다.
여러 겹의 조건문을 감시 절로 전환기법의 핵심은 강조 부분이다. if-then-else 문을 사용하면 if 절과 else 절의 비중이 동등하다. 따라서 코드를 보는 사람은 if 절과 else 절의 비중이 같다고 판단하게 된다. 그와 달리, 감시 절은 "이것은 드문 경우이니 이 경우가 발생하면 작업을 수행한 후 빠져나와라" 하고 명령한다.
before
public class ReplaceNestedConditionalWithGuardClauses_before {
static class Capital {
public Capital(double _capital, double _intRate, double _income, double _duration) {
super();
this._capital = _capital;
this._intRate = _intRate;
this._income = _income;
this._duration = _duration;
}
private static final double ADJ_FACTOR = 0.9;
private double _capital;
private double _intRate;
private double _income;
private double _duration;
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;
}
}
public static void main(String[] args) {
Capital capital = new Capital(250000, 1.5, 50000, 36);
System.out.println(capital.getAdjustedCapital());
}
}
after
public class ReplaceNestedConditionalWithGuardClauses_before {
static class Capital {
public Capital(double _capital, double _intRate, double _income, double _duration) {
super();
this._capital = _capital;
this._intRate = _intRate;
this._income = _income;
this._duration = _duration;
}
private static final double ADJ_FACTOR = 0.9;
private double _capital;
private double _intRate;
private double _income;
private double _duration;
public double getAdjustedCapital() {
if (isAdjusted()) return 0.0;
return (_income / _duration) * ADJ_FACTOR;
}
public boolean isAdjusted() {
if(_capital <= 0.0 || _intRate <= 0.0 || _duration <= 0.0) return true;
return false;
}
}
public static void main(String[] args) {
Capital capital = new Capital(250000, 1.5, 50000, 36);
System.out.println(capital.getAdjustedCapital());
}
}
반응형
'Design Architecture > Refactoring' 카테고리의 다른 글
Replace Parameter with Method Call (0) | 2022.04.20 |
---|---|
Separate Query From Modifier (0) | 2022.04.20 |
Decompose Conditional (0) | 2022.04.20 |
Replace Type Code with Subclass (0) | 2022.04.20 |
Replace type Code with Class (0) | 2022.04.20 |