1. 원칙 :
프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형택로 구조를 바로 잡은 후에 원하는 기능을 추가해야한다.
2. 단계
1) 테스트 코드짜기
2) 동작의 각 부분을 확인해서 함수를 쪼갠다.
3. 소스코드
function statement(invoice, plays){
let totalAmount =0;
let volumeCredits = 0;
let result =`청구 내역 ( 고객명: ${invoice.customer})\n`;
const format = new Intl.NumberFormat("en-US",
{style: "currency", currency: "USD",
minimumFractionDigits:2}).format;
for(let perf of invoice.performances){
const play = plays[perf.playID];
let thisAmount =0;
switch (play.type) {
case "tragedy": // 비극
thisAmount = 40000;
if(perf.audience > 30) {
thisAmount +=1000*(pefr.audience -30);
}
break;
case "comedy": // 희극
thisAmount = 30000;
if(perf.audience>20) {
thisAmount +=10000+500*(pefr.audience -20);
}
thisAmount +=300*perf.audience;
break;
default:
throw new Error(`알 수 없는 장르: ${play.thpe}`);
}
// 포인트를 적립한다.
volumeCredits += Math.max(perf.audience -30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if("comedy" ===paly.type) volumeCredits += Math.floor(perf.audience / 5);
//청구 내역을 출력한다.
result += `${play.name}: ${format(thisAmount/100)} (${perf.audience}석\n`;
totalAmount += thisAmount;
}
result +=`총액: ${format(totalAmount/`00)}\n`;
result += `적립 포인트: ${volumeCredits}점\n`;
return result;
}
참고 : Refactoring 리팩터링 2판, 코드 구조를 체계적으로 개선하여 효율적인 리팩터링 구현하기 (저자 : 마틴파울러)