임시 변수를 없애는 방법을 알아보자.
function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\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;
thisAmount = amountFor(perf, play);
//포인트를 적립한다.
volumeCredits += Math.max(perf audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === play.type) volumeCredits += Math.floor(perf.audience / 5);
//청구 내역을 출력한다.
result += '${play.name}: ${format(thisAmount / 100)} (${perf.audience}석)\n';
totalAmount += thisAmount;
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
func amountFor(aPerformance, play) {
let result = 0;
switch (play.type) {
case "tragedy": // 비극
result = 40000;
if (aPerformance.audience > 30) {
result += 1000 * (aPerformance.audience - 30);
}
break;
case "comedy": // 희극
result = 30000;
if (aPerformance.audience > 20) {
result += 10000 + 500 * (aPerformance.audience - 20);
}
result += 300 * aPerformance.audience;
break;
default:
throw new Error('알 수 없는 장르: ${play.type}');
}
return result;
}
}
amountFor
함수의 인자를 보던 도중, play
가 필요없다는 것을 알게 되었다.aPerformance
에서 얻을 수 있다.function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
const format = new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format;
for (let perf of invoice.performances) {
const play = playFor(perf);
let thisAmount = 0;
thisAmount = amountFor(perf, play);
//포인트를 적립한다.
volumeCredits += Math.max(perf audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === play.type) volumeCredits += Math.floor(perf.audience / 5);
//청구 내역을 출력한다.
result += '${play.name}: ${format(thisAmount / 100)} (${perf.audience}석)\n';
totalAmount += thisAmount;
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
func amountFor(aPerformance, play) {
let result = 0;
switch (play.type) {
case "tragedy": // 비극
result = 40000;
if (aPerformance.audience > 30) {
result += 1000 * (aPerformance.audience - 30);
}
break;
case "comedy": // 희극
result = 30000;
if (aPerformance.audience > 20) {
result += 10000 + 500 * (aPerformance.audience - 20);
}
result += 300 * aPerformance.audience;
break;
default:
throw new Error('알 수 없는 장르: ${play.type}');
}
return result;
}
func playFor(aPerformance) {
return plays[aPerformance.playID];
}
}
play
-> playFor(perf)
로 변경한다.function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
const format = new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format;
for (let perf of invoice.performances) {
let thisAmount = 0;
thisAmount = amountFor(perf, playFor(perf));
//포인트를 적립한다.
volumeCredits += Math.max(perf audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === playFor(perf).type) volumeCredits += Math.floor(perf.audience / 5);
//청구 내역을 출력한다.
result += '${playFor(perf).name}: ${format(thisAmount / 100)} (${perf.audience}석)\n';
totalAmount += thisAmount;
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
func amountFor(aPerformance, play) {
let result = 0;
switch (playFor(aPerformance).type) {
case "tragedy": // 비극
result = 40000;
if (aPerformance.audience > 30) {
result += 1000 * (aPerformance.audience - 30);
}
break;
case "comedy": // 희극
result = 30000;
if (aPerformance.audience > 20) {
result += 10000 + 500 * (aPerformance.audience - 20);
}
result += 300 * aPerformance.audience;
break;
default:
throw new Error('알 수 없는 장르: ${playFor(aPerformance).type}');
}
return result;
}
func playFor(aPerformance) {
return plays[aPerformance.playID];
}
}
amountFor
함수의 play
인자는 더 이상 필요없다는 것을 알 수 있다.function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
const format = new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format;
for (let perf of invoice.performances) {
let thisAmount = 0;
thisAmount = amountFor(perf);
//포인트를 적립한다.
volumeCredits += Math.max(perf audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === playFor(perf).type) volumeCredits += Math.floor(perf.audience / 5);
//청구 내역을 출력한다.
result += '${playFor(perf).name}: ${format(thisAmount / 100)} (${perf.audience}석)\n';
totalAmount += thisAmount;
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
func amountFor(aPerformance) {
let result = 0;
switch (playFor(aPerformance).type) {
case "tragedy": // 비극
result = 40000;
if (aPerformance.audience > 30) {
result += 1000 * (aPerformance.audience - 30);
}
break;
case "comedy": // 희극
result = 30000;
if (aPerformance.audience > 20) {
result += 10000 + 500 * (aPerformance.audience - 20);
}
result += 300 * aPerformance.audience;
break;
default:
throw new Error('알 수 없는 장르: ${playFor(aPerformance).type}');
}
return result;
}
func playFor(aPerformance) {
return plays[aPerformance.playID];
}
}
statement
에서 play
를 얻어서 amountFor
에게 전달했었는데, 이제는 amountFor
가 play
를 얻어서 사용하고 있다."amountFor
함수에 필요한 인자를 모두 처리했으니, 이걸 호출했던 친구를 보자.thisAmount = amountFor(perf);
이렇게 사용하고 있고, 이건 단순히 값을 더하기 위해 사용중이다.thisAmount
변수를 제거하고, amountFor
함수의 결과를 바로 대입하자.function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
const format = new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format;
for (let perf of invoice.performances) {
//포인트를 적립한다.
volumeCredits += Math.max(perf audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === playFor(perf).type) volumeCredits += Math.floor(perf.audience / 5);
//청구 내역을 출력한다.
result += '${playFor(perf).name}: ${format(amountFor(perf) / 100)} (${perf.audience}석)\n';
totalAmount += amountFor(perf);
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
}
function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
const format = new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format;
for (let perf of invoice.performances) {
//포인트를 적립한다.
volumeCredits += Math.max(perf.audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === playFor(perf).type)
volumeCredits += Math.floor(perf.audience / 5);
//청구 내역을 출력한다.
result += '${playFor(perf).name}: ${format(amountFor(perf) / 100)} (${perf.audience}석)\n';
totalAmount += amountFor(perf);
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
}
volumeCredits
계산)function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
const format = new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format;
for (let perf of invoice.performances) {
volumeCredits += volumeCreditsFor(perf);
//청구 내역을 출력한다.
result += '${playFor(perf).name}: ${format(amountFor(perf) / 100)} (${perf.audience}석)\n';
totalAmount += amountFor(perf);
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
}
...
function volumeCreditsFor(perf) {
let volumeCredits = 0;
//포인트를 적립한다.
volumeCredits += Math.max(perf.audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === playFor(perf).type)
volumeCredits += Math.floor(perf.audience / 5);
return volumeCredits;
}
volumeCreditsFor
함수 내부 변수를 result
로 고치자.function volumeCreditsFor(perf) {
let result = 0;
//포인트를 적립한다.
result += Math.max(perf.audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === playFor(perf).type)
result += Math.floor(perf.audience / 5);
return result;
}
function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
const format = new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format;
for (let perf of invoice.performances) {
volumeCredits += volumeCreditsFor(perf);
//청구 내역을 출력한다.
result += '${playFor(perf).name}: ${format(amountFor(perf) / 100)} (${perf.audience}석)\n';
totalAmount += amountFor(perf);
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
function amountFor(aPerformance) {
let result = 0;
switch (playFor(aPerformance).type) {
case "tragedy": // 비극
result = 40000;
if (aPerformance.audience > 30) {
result += 1000 * (aPerformance.audience - 30);
}
break;
case "comedy": // 희극
result = 30000;
if (aPerformance.audience > 20) {
result += 10000 + 500 * (aPerformance.audience - 20);
}
result += 300 * aPerformance.audience;
break;
default:
throw new Error('알 수 없는 장르: ${playFor(aPerformance).type}');
}
return result;
}
function playFor(aPerformance) {
return plays[aPerformance.playID];
}
function volumeCreditsFor(perf) {
let result = 0;
//포인트를 적립한다.
result += Math.max(perf.audience - 30, 0);
//희극 관객 5명마다 추가 포인트를 제공한다.
if ("comedy" === playFor(perf).type)
result += Math.floor(perf.audience / 5);
return result;
}
}
format
이다.function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
for (let perf of invoice.performances) {
volumeCredits += volumeCreditsFor(perf);
//청구 내역을 출력한다.
result += '${playFor(perf).name}: ${format(amountFor(perf) / 100)} (${perf.audience}석)\n';
totalAmount += amountFor(perf);
}
result += '총액: ${format (totalAmount/100)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
function amountFor(aPerformance) {
let result = 0;
switch (playFor(aPerformance).type) {
case "tragedy": // 비극
result = 40000;
if (aPerformance.audience > 30) {
result += 1000 * (aPerformance.audience - 30);
}
break;
case "comedy": // 희극
result = 30000;
if (aPerformance.audience > 20) {
result += 10000 + 500 * (aPerformance.audience - 20);
}
result += 300 * aPerformance.audience;
break;
default:
throw new Error('알 수 없는 장르: ${playFor(aPerformance).type}');
}
return result;
}
function playFor(aPerformance) {
return plays[aPerformance.playID];
}
function format(aNumber) {
return new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format(aNumber);
}
}
format
이라는 이름은 너무 일반적이다.usd
로 변경하자. 또한 변환 로직(/100
)도 usd
함수 안으로 옮기자.function statement(invoice, plays) {
let totalAmount = 0;
let volumeCredits = 0;
let result = '청구 내역 (고객명: ${invoice.customers})\n';
for (let perf of invoice.performances) {
volumeCredits += volumeCreditsFor(perf);
//청구 내역을 출력한다.
result += '${playFor(perf).name}: ${usd(amountFor(perf))} (${perf.audience}석)\n';
totalAmount += amountFor(perf);
}
result += '총액: ${usd(totalAmount)}\n';
result += '적립 포인트: ${volumeCredits)점 \n';
";
return result;
function amountFor(aPerformance) {
let result = 0;
switch (playFor(aPerformance).type) {
case "tragedy": // 비극
result = 40000;
if (aPerformance.audience > 30) {
result += 1000 * (aPerformance.audience - 30);
}
break;
case "comedy": // 희극
result = 30000;
if (aPerformance.audience > 20) {
result += 10000 + 500 * (aPerformance.audience - 20);
}
result += 300 * aPerformance.audience;
break;
default:
throw new Error('알 수 없는 장르: ${playFor(aPerformance).type}');
}
return result;
}
function playFor(aPerformance) {
return plays[aPerformance.playID];
}
function usd(aNumber) {
return new Intl.NumberFormat("en-Us", {
style: "currency",
currency: "USD",
minimumFractionDigits: 2
}).format(aNumber / 100);
}
}