์ž„์‹œ ๋ณ€์ˆ˜ ์ œ๊ฑฐ๋ฅผ ๊ณ„์†ํ•ด๋ณด์ž. ์„ฑ๋Šฅ๊ณผ ๋ฆฌํŒฉํ„ฐ๋ง์˜ ๊ด€๊ณ„๋Š” ์–ด๋–จ๊นŒ?

statement ํ•จ์ˆ˜ ์ชผ๊ฐœ๊ธฐ (๊ณ„์†)

VolumeCredits ๋ณ€์ˆ˜ ์ œ๊ฑฐํ•˜๊ธฐ

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);
    }
}
 
 
  • volumeCredits ๋ณ€์ˆ˜๋Š” ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๋ฉฐ ๊ฐ’์„ ๋ˆ„์ ํ•˜๊ณ  ์žˆ๋‹ค. ์กฐ๊ธˆ๋” ๊นŒ๋‹ค๋กœ์šด ๊ฒฝ์šฐ๋‹ค.
  • ๋ฐ˜๋ณต๋ฌธ ์ชผ๊ฐœ๊ธฐ๋กœ volumeCredits์„ ๋”ํ•˜๋Š” ๋ถ€๋ถ„์„ ๋นผ์ž.
  • ์ด๋Š” ๋™์ž‘ ํ๋ฆ„์„ ๋ช…ํ™•ํžˆ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์ž‘์—…์ด๋‹ค.
function statement(invoice, plays) {
    let totalAmount = 0;
    let volumeCredits = 0;
    let result = '์ฒญ๊ตฌ ๋‚ด์—ญ (๊ณ ๊ฐ๋ช…: ${invoice.customers})\n';
 
    for (let perf of invoice.performances) {
        //์ฒญ๊ตฌ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.
        result += '${playFor(perf).name}: ${usd(amountFor(perf))} (${perf.audience}์„)\n';
        totalAmount += amountFor(perf);
    }
    for (let perf of invoice.performances) {
        volumeCredits += volumeCreditsFor(perf);
    }
    
    result += '์ด์•ก: ${usd(totalAmount)}\n';
    result += '์ ๋ฆฝ ํฌ์ธํŠธ: ${volumeCredits)์  \n';
    ";
    return result;
}
  • ๋‹ค์‹œ ๋˜ ์ปดํŒŒ์ผ - ํ…Œ์ŠคํŠธ - ์ปค๋ฐ‹ํ•œ๋‹ค.
  • ๊ทธ ๋‹ค์Œ์œผ๋กœ ๋ฌธ์žฅ ์Šฌ๋ผ์ด๋“œ๋ฅผ ์ ์šฉํ•ด์„œ volumeCredits ๋ณ€์ˆ˜๋ฅผ ๋ฐ˜๋ณต๋ฌธ ์•ž์œผ๋กœ ์˜ฎ๊ฒจ๋ณด์ž.
  • ๋ณ€์ˆ˜ ์„ ์–ธ๊ณผ ๋™์ž‘์€ ์ˆ˜์ง ์œ„์น˜๊ฐ€ ๊ฐ€๊นŒ์šธ ์ˆ˜๋ก ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค.
function statement(invoice, plays) {
    let totalAmount = 0;
    let result = '์ฒญ๊ตฌ ๋‚ด์—ญ (๊ณ ๊ฐ๋ช…: ${invoice.customers})\n';
 
    for (let perf of invoice.performances) {
        //์ฒญ๊ตฌ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.
        result += '${playFor(perf).name}: ${usd(amountFor(perf))} (${perf.audience}์„)\n';
        totalAmount += amountFor(perf);
    }
    let volumeCredits = 0;
    for (let perf of invoice.performances) {
        volumeCredits += volumeCreditsFor(perf);
    }
    
    result += '์ด์•ก: ${usd(totalAmount)}\n';
    result += '์ ๋ฆฝ ํฌ์ธํŠธ: ${volumeCredits)์  \n';
    ";
    return result;
}
  • ๋‹ค์‹œ ์ปดํŒŒ์ผ - ํ…Œ์ŠคํŠธ - ์ปค๋ฐ‹ํ•œ๋‹ค.
  • volumeCredits ๋ณ€์ˆ˜ ์—ญ์‹œ ์ž„์‹œ ๋ณ€์ˆ˜์ด๋‹ค. ์ด๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ๋ฅผ ์ ์šฉํ•ด๋ณด์ž.
    • ํ˜น์€ ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์งˆ์˜ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๊ธฐ๋กœ ์ƒ๊ฐํ•  ์ˆ˜๋„ ์žˆ๊ฒ ๋‹ค.
function statement(invoice, plays) {
    let totalAmount = 0;
    let result = '์ฒญ๊ตฌ ๋‚ด์—ญ (๊ณ ๊ฐ๋ช…: ${invoice.customers})\n';
 
    for (let perf of invoice.performances) {
        //์ฒญ๊ตฌ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.
        result += '${playFor(perf).name}: ${usd(amountFor(perf))} (${perf.audience}์„)\n';
        totalAmount += amountFor(perf);
    }
    let volumeCredits = totalVolumeCredits();
    result += '์ด์•ก: ${usd(totalAmount)}\n';
    result += '์ ๋ฆฝ ํฌ์ธํŠธ: ${volumeCredits)์  \n';
    ";
    return result;
 
    function totalVolumeCredits() {
        let volumeCredits = 0;
        for (let perf of invoice.performances) {
            volumeCredits += volumeCreditsFor(perf);
        }
        return volumeCredits;
    }
}
  • ๋‹ค์‹œ ์ปดํŒŒ์ผ - ํ…Œ์ŠคํŠธ - ์ปค๋ฐ‹ํ•œ๋‹ค.
  • ๋˜ ์ž„์‹œ ๋ณ€์ˆ˜(volumeCredits)๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€์ˆ˜ ์ธ๋ผ์ธํ•˜๊ธฐ๋ฅผ ์ ์šฉํ•ด๋ณด์ž.
function statement(invoice, plays) {
    let totalAmount = 0;
    let result = '์ฒญ๊ตฌ ๋‚ด์—ญ (๊ณ ๊ฐ๋ช…: ${invoice.customers})\n';
 
    for (let perf of invoice.performances) {
        //์ฒญ๊ตฌ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.
        result += '${playFor(perf).name}: ${usd(amountFor(perf))} (${perf.audience}์„)\n';
        totalAmount += amountFor(perf);
    }
    result += '์ด์•ก: ${usd(totalAmount)}\n';
    result += '์ ๋ฆฝ ํฌ์ธํŠธ: ${totalVolumeCredits())์  \n';
    ";
    return result;
 
    ...
 
    function totalVolumeCredits() {
        let volumeCredits = 0;
        for (let perf of invoice.performances) {
            volumeCredits += volumeCreditsFor(perf);
        }
        return volumeCredits;
    }
}
  • ๋‹ค์‹œ ์ปดํŒŒ์ผ - ํ…Œ์ŠคํŠธ - ์ปค๋ฐ‹ํ•œ๋‹ค.
  • ์ž, ์ž ๊น ์ƒ๊ฐํ•ด๋ณด์ž. ์šฐ๋ฆฌ๋Š” for๋ฌธ์„ ๋‘๊ฐœ ๋งŒ๋“ค์—ˆ๋‹ค. 2๋ฐฐ์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ƒ๊ฒผ๋‹ค ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ์ด์ •๋„ ์ค‘๋ณต์€ ์„ฑ๋Šฅ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์ด ๋ฏธ๋ฏธํ•  ๋•Œ๊ฐ€ ๋งŽ๋‹ค.
  • ๋˜‘๋˜‘ํ•œ ์ปดํŒŒ์ผ๋Ÿฌ๋“ค์€ ์ตœ์‹  ์บ์‹ฑ ๊ธฐ๋ฒ•์œผ๋กœ ๋ฌด์žฅํ•˜๊ณ  ์žˆ์–ด ์ง๊ด€์„ ์ดˆ์›”ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.
  • ๋ฌผ๋ก  ๋•Œ๋•Œ๋กœ ๋ฆฌํŒฉํ† ๋ง์ด ์„ฑ๋Šฅ์— ์ƒ๋‹นํ•œ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ๋„ ํ•œ๋‹ค.
  • ํ•˜์ง€๋งŒ ๊ทธ๋Ÿผ์—๋„ ๋ฆฌํŒฉํ† ๋ง ํ•œ๋‹ค.
  • ์ž˜ ๋‹ค๋“ฌ์–ด์ ธ ์žˆ๋‹ค๋ฉด ์„ฑ๋Šฅ ๊ฐœ์„ ๋„ ์ˆ˜์›”ํ•˜๋‹ค.

๋ฆฌํŒฉํ„ฐ๋ง์œผ๋กœ ์ธํ•œ ์„ฑ๋Šฅ ๋ฌธ์ œ๋Š” ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ์ผ๋‹จ ๋ฌด์‹œํ•ด๋ผ.

TotalAmount ๋ณ€์ˆ˜ ์ œ๊ฑฐํ•˜๊ธฐ

  • ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•˜์ž.
  • ๋ฐ˜๋ณต๋ฌธ์„ ์ชผ๊ฐœ๊ณ , ์ดˆ๊ธฐํ™” ๋ฌธ์žฅ์˜ ์œ„์น˜๋ฅผ ์˜ฎ๊ธฐ๊ณ , ํ•จ์ˆ˜๋ฅผ ์ถ”์ถœํ•˜์ž.
  • ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ totalAmount๋ผ๋Š” ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋ ค ํ–ˆ์œผ๋‚˜, ์ด๋ฏธ ๊ฐ™์€ ์ด๋ฆ„์˜ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋‹ค.
  • ์ด๋Ÿฐ ๊ฒฝ์šฐ ์ž„์‹œ ์ด๋ฆ„์„ ๋ถ™์—ฌ์ค€๋‹ค.
function statement(invoice, plays) {
    let result = '์ฒญ๊ตฌ ๋‚ด์—ญ (๊ณ ๊ฐ๋ช…: ${invoice.customers})\n';
 
    for (let perf of invoice.performances) {
        //์ฒญ๊ตฌ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.
        result += '${playFor(perf).name}: ${usd(amountFor(perf))} (${perf.audience}์„)\n';
    }
    result += '์ด์•ก: ${usd(appleSauce())}\n';
    result += '์ ๋ฆฝ ํฌ์ธํŠธ: ${totalVolumeCredits())์  \n';
    ";
    return result;
 
    ...
 
    function appleSauce() {
        let totalAmount = 0;
        for (let perf of invoice.performances) {
            totalAmount += amountFor(perf);
        }
        return totalAmount;
    }
}
  • ๋‹ค์‹œ ์ปดํŒŒ์ผ - ํ…Œ์ŠคํŠธ - ์ปค๋ฐ‹ํ•œ๋‹ค.
  • ์ผ๋‹จ ์ด๋ ‡๊ฒŒ ํ•ด๋†“๊ณ , ํ•จ์ˆ˜์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•œ๋‹ค.
function statement(invoice, plays) {
    let result = '์ฒญ๊ตฌ ๋‚ด์—ญ (๊ณ ๊ฐ๋ช…: ${invoice.customers})\n';
 
    for (let perf of invoice.performances) {
        //์ฒญ๊ตฌ ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•œ๋‹ค.
        result += '${playFor(perf).name}: ${usd(amountFor(perf))} (${perf.audience}์„)\n';
    }
    result += '์ด์•ก: ${usd(totalAmount())}\n';
    result += '์ ๋ฆฝ ํฌ์ธํŠธ: ${totalVolumeCredits())์  \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);
    }
 
    function totalVolumeCredits() {
        let volumeCredits = 0;
        for (let perf of invoice.performances) {
            volumeCredits += volumeCreditsFor(perf);
        }
        return volumeCredits;
    }
 
    function totalAmount() {
        let totalAmount = 0;
        for (let perf of invoice.performances) {
            totalAmount += amountFor(perf);
        }
        return totalAmount;
    }
}
 

Reference