리팩터링. 조건문 분해하기 (Decompose Conditional)
"조건문 분해하기(Decompose Conditional)"는 긴 조건문을 작은 부분으로 분해하여 코드의 가독성과 유지보수성을 높이는 리팩터링 기법입니다.
보통 긴 조건문은 가독성을 해치며, 조건문이 하나 추가될 때마다 코드가 복잡해져 유지보수성이 떨어지는 문제가 있습니다.
이 때문에 조건문을 작은 부분으로 분해하여 의도를 분명히 하고, 코드를 간결하게 만들어 유지보수성을 높이는 것이 좋습니다.
"조건문 분해하기"를 적용하려면 다음과 같은 단계를 따를 수 있습니다.
- 복잡한 조건문을 찾습니다.
- 조건문의 각 부분을 분해하고 의미 있는 이름을 부여합니다.
- 조건문의 각 부분을 함수로 추출합니다.
- 분해된 조건문을 새로 작성한 함수를 이용해 다시 작성합니다.
다음은 "조건문 분해하기"를 적용한 예시입니다.
다음 코드는 고객의 연체 기간에 따라 요금을 계산하고, 프리미엄 고객인지 여부에 따라 할인을 적용하는 charge 함수입니다.
void charge(int amount, bool isPremiumCustomer, int monthsOverdue) {
if (isPremiumCustomer) {
if (monthsOverdue <= 0) {
amount *= 0.5;
}
else if (monthsOverdue <= 1) {
amount *= 0.7;
}
else if (monthsOverdue <= 2) {
amount *= 0.8;
}
else {
amount *= 0.9;
}
}
else {
if (monthsOverdue <= 1) {
amount *= 0.8;
}
else {
amount *= 0.9;
}
}
doSomething(amount);
}
위 코드에서는 "isPremiumCustomer"와 "monthsOverdue"에 따라 긴 조건문이 나타나고 있습니다.
이를 "조건문 분해하기"를 이용해 간단하게 만들면 다음과 같습니다.
void charge(int amount, bool isPremiumCustomer, int monthsOverdue) {
if (isPremiumCustomer) {
amount = calculatePremiumAmount(amount, monthsOverdue);
}
else {
amount = calculateRegularAmount(amount, monthsOverdue);
}
doSomething(amount);
}
int calculatePremiumAmount(int amount, int monthsOverdue) {
if (monthsOverdue <= 0) {
return amount * 0.5;
}
else if (monthsOverdue <= 1) {
return amount * 0.7;
}
else if (monthsOverdue <= 2) {
return amount * 0.8;
}
else {
return amount * 0.9;
}
}
int calculateRegularAmount(int amount, int monthsOverdue) {
if (monthsOverdue <= 1) {
return amount * 0.8;
}
else {
return amount * 0.9;
}
}
charge 함수를 프리미엄 고객과 일반 고객의 할인율을 계산하는 두 개의 보조 함수인 calculatePremiumAmount와 calculateRegularAmount로 나누었습니다.
프리미엄 고객인 경우 calculatePremiumAmount 함수를 호출하여 할인된 요금을 계산하고, 일반 고객인 경우 calculateRegularAmount 함수를 호출하여 요금을 계산합니다.
마지막으로, 계산된 요금을 doSomething 함수를 호출하여 처리합니다.
이렇게 조건문의 각 부분을 분해하고 의미 있는 이름을 부여하여 전체적인 의도가 확실히 들어난 코드를 작성할 수 있습니다.