✏️1.5 중간 점검: 난무하는 중첩 함수

1.5 중간 점검: 난무하는 중첩 함수

리팩터링 결과를 살펴보자

function statement(invoice, plays) {
  let result = `청구 내역(고객명): ${invocie.customer})\n`;
  
  for (let perf of invoice.performaces) {
    // 청구 내역을 출력한다.
    result += ` ${playFor(perf).name}: ${usd(amountFor(perf))} ($perf.audience}석)\n`;
  
  result += `총액: ${usd(totalAmount())}\n`;	
  result += `적립 포인트: ${totalVolumeCredits()}점\n`;
  return result;
}    
  
function totalAmount() {	
  let result = 0;	
for (let perf of invoice.performaces) {
	totalAmount += amountFor(perf);
}
  return result;
}
  
// 중첩 함수 시작
function totalVolumeCredits() {
  let voluemCredits = 0;
  for (let perf of invoice.performances) {
    volumeCredits += volumeCreditsFor(perf);
  }
  return volulmeCredits;
}
  
function usd(aNumber) {	
  return new Intl.NumberFormat("en-US", 
                 { style: "currency", currency: "USD", 
          		   minimumFractionDigits: 2 }).format(aNumber/100);
}

function volumeCreditsFor(aPerformance) { 
  let result = 0;
  volumeCredits += Math.max(aPerformance.audience - 30, 0);
  if ("comedy" === playFor(aPerformance).type) 
    volumeCredits += Math.Floor(aPerformance.audience / 5 );
  return result;
}

function playFor(aPerformance) {
  return plays[aPerformance.playID];
}

  
function amountFor(aPerformance) {	
  let result = 0;
      switch (playFor(aPerfomance).type) { 
      case "tragedy":
        result = 40000;
        if (perf.audience > 30) {
          result += 1000 * (perf.audience - 30);
        }
        break;
      case "comedy":
        result = 30000;
        if (perf.audience > 20) {
          result += 1000 + 500 * (perf.audience - 20);
        }
        result += 300 * perf.audience
        break;
      default:
        throw new Error(`알 수 없는 장르: ${playFor(aPerfomance).type}`);
      }
	  return result;
	}
}

최상위 statement() 함수는 일곱줄 뿐이며, 출력할 문장을 생성하는 일만 한다. 계산하는 로직은 모두 여러 개의 보조 함수로 빼냈다. 결과적으로 각 계산 과정은 물론 전체 흐름을 이해하기가 훨씬 쉬워졌다.

Last updated