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