Design Architecture/Refactoring

Replace Nested Conditional With Guard Clauses

lipnus 2022. 4. 20. 10:53
반응형

여러 겹의 조건문을 감시 절로 전환 (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