Decompose Conditional, 조건문 분해하기를 알아보자.

요약

코드

if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd))
  charge = quantity * plan.summerRate;
else
  charge = quantity * plan.regularRate + plan.regularServiceCharge;
if (summer())
  charge = summerCharge();
else
  charge = regularCharge();

배경

  • 복잡한 조건부 로직은 프로그램을 읽기 어렵게 만든다.
  • 긴 함수도 어려운데, 거기에 조건문까지 추가되면 더욱 어려워진다.
  • 무슨일이 일어나는지는 설명해주지만, “왜”일어나는지는 제대로 말해주지 않을 때가 많다.
  • 이는 곧 맥락이 반영되어 있지 않은 코드를 말한다.
  • 조건문을 분리하고, 해체된 코드 덩어리들에 의도를 살린 이름을 붙여 함수로 바꿔주자.

절차

  • 조건식과 조건식에 딸린 조건절 각각을 함수로 추출한다.

예시

if (!aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd))
  charge = quantity * plan.summerRate;
else
  charge = quantity * plan.regularRate + plan.regularServiceCharge;
  • 여름 철이면 할인율이 달라지는 코드이다.
if (summer())
    charge = quantity * plan.summerRate;
else
    charge = quantity * plan.regularRate + plan.regularServiceCharge;
 
function summer() {
    return !aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd);
}
  • summer() 함수를 만들어서 조건문을 분리했다.
if (summer())
    charge = summerCharge();
else
    charge = regularCharge();
 
function summer() {
    return !aDate.isBefore(plan.summerStart) && !aDate.isAfter(plan.summerEnd);
}
 
function summerCharge() {
    return quantity * plan.summerRate;
}
 
function regularCharge() {
    return quantity * plan.regularRate + plan.regularServiceCharge;
}
  • 나머지 함수들도 모두 추출했다.

Reference