๋งˆ์ง€๋ง‰์œผ๋กœ ๋ณ€๊ฒฝ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉฐ ์ƒ๊ฐํ•ด๋ณด์ž.

์ƒํƒœ ์ ๊ฒ€: ๋‹คํ˜•์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ƒ์„ฑํ•˜๊ธฐ

// createStatementData.js
 
function createPerformanceCalculator(aPerformance, aPlay) {
    switch(aPlay.type) {
        case "tragedy":
            return new TragedyCalculator(aPerformance, aPlay);
        case "comedy":
            return new ComedyCalculator(aPerformance, aPlay);
        default:
            throw new Error('์•Œ ์ˆ˜ ์—†๋Š” ์žฅ๋ฅด: ${aPlay.type}');
    }
}
 
class TragedyCalculator(aPerformance, aPlay) {
 
    get amount() {
        let result = 40000;
        if (this.performance.audience > 30) {
            result += 1000 * (this.performance.audience - 30);
        }
        return result;
    }
    
}
 
class ComedyCalculator(aPerformance, aPlay) {
 
    get amount() {
        let result = 30000;
        if (this.performance.audience > 20) { 
            result += 10000 + 500 * (this.performance.audience - 20);
        }
        result += 300 * this.performance.audience;
        return result;
    }
 
    get volumeCredits() {  // ๋ณ€๊ฒฝ๋จ
        super.volumeCredits + Math.floor(this.aPerformance.audience / 5);
    }
 
}
 
class PerformanceCalculator {
 
    constructor(aPerformance, aPlay) { 
        this.performance = aPerformance;
        this.play = aPlay; 
    }
 
    get amount() {
        throw new Error('์„œ๋ธŒํด๋ž˜์Šค์—์„œ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');
    }
 
    get volumeCredits() {
        Math.max(this.aPerformance.audience - 30, 0);
    }
 
}
 
export default function createStatementData(invoice, plays) {
    const statementData = {};
    statementData.customer = invoice.customer;
    statementData.performances = invoice.performances.map(enrichPerformance);
    statementData.totalAmount = totalAmount();
    statementData.totalVolumeCredits = totalVolumeCredits();
    return statementData;
 
    function enrichPerformance(aPerformance) { 
        const calculator = createPerformanceCalculator(aPerformance, playFor(aPerformance)); 
        const result = Object.assign({}, aPerformance);
        result.play = calculator.play; 
        result.amount = calculator.amount();
        result.volumeCredits = calculator.volumeCredits();
        return result;
    }
 
    function playFor(aPerformance) {
        return plays[aPerformance.playID];
    }
 
    function totalAmount(data) {
        return data.performances
            .reduce((total, p) => total + p.amount, 0);
    }
 
    function totalVolumeCredits(data) {
        data.performances
            .reduce((total, p) => total + p.volumeCredits, 0); 
    }
    ...
}
  • ์ด๋ฒˆ ์ˆ˜์ •์œผ๋กœ ์—ฐ๊ทน ์žฅ๋ฅด๋ณ„ ๊ณ„์‚ฐ ์ฝ”๋“œ๋“ค์„ ํ•จ๊ป˜ ๋ฌถ์—ˆ๋‹ค.
  • ์ƒˆ๋กœ์šด ์žฅ๋ฅด๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์„œ๋ธŒํด๋ž˜์Šค ์ž‘์„ฑ ํ›„ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์— ์ถ”๊ฐ€๋งŒ ํ•˜๋ฉด ๋œ๋‹ค.

๋งˆ์น˜๋ฉฐ

  • ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋ฒ•์„ ์ ์šฉํ•ด๋ดค๋‹ค.
    • ํ•จ์ˆ˜ ์ถ”์ถœํ•˜๊ธฐ: ๋กœ์ง์„ ์ผ๋‹จ ๊ทธ๋Œ€๋กœ ๋–ผ์„œ ํ•จ์ˆ˜๋กœ ๋บŒ
    • ๋ณ€์ˆ˜ ์ธ๋ผ์ธ ํ•˜๊ธฐ: ์ž„์‹œ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์•Š๊ณ  ํ•จ์ˆ˜ ์ž์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ๋ณ€๊ฒฝ
    • ํ•จ์ˆ˜ ์˜ฎ๊ธฐ๊ธฐ: ๋” ์ข‹์€ ์œ„์น˜์˜ ๋ชจ๋“ˆ๋กœ ์ด๋™
    • ์กฐ๊ฑด๋ถ€ ๋กœ์ง์„ ๋‹คํ˜•์„ฑ์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
  • ์ข‹์€ ์ฝ”๋“œ๋ฅผ ๊ฐ€๋Š ํ•˜๋Š” ํ™•์‹คํ•œ ๋ฐฉ๋ฒ•์€ ์–ผ๋งˆ๋‚˜ ์ˆ˜์ •ํ•˜๊ธฐ ์‰ฌ์šด๊ฐ€์ด๋‹ค.
  • ์ด๋ฒˆ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ๋ฆฌํŒฉํ„ฐ๋ง ํ•˜๋Š” ๋ฆฌ๋“ฌ์„ ๋ฐฐ์› ์œผ๋ฉด ํ•œ๋‹ค.
  • ๋‹จ๊ณ„๋ฅผ ์ƒ๊ฐ๋ณด๋‹ค ๊ต‰์žฅํžˆ ์ž‘๊ฒŒ ๋‚˜๋ˆ„์—ˆ๋‹ค.
  • ์—ฌ๋Ÿฌ๊ฐœ์˜ ๋‹จ๊ณ„๋ฅผ ๋„˜๊ธฐ๊ณ  ํ•œ๋ฒˆ์— ์ฒ˜๋ฆฌํ•˜๋ ค๋Š” ์œ ํ˜น์„ ์ค„์ด๊ณ , ๋‹จ์ˆœํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ–ˆ๋‹ค.
  • ์˜คํžˆ๋ ค ๋” ์ž˜๊ฒŒ ๋‚˜๋ˆ ์•ผ ๋นจ๋ฆฌ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ด ์ž‘์€ ๋‹จ๊ณ„๋“ค์ด ๋ชจ์—ฌ ํฐ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด ์ ์„ ๋ช…์‹ฌํ•˜์ž.

Reference