개발관련 도서/Refactoring

01 리팩터링: 첫 번째 예시

prden 2022. 8. 29. 22:44

1. 원칙 :

프로그램이 새로운 기능을 추가하기에 편한 구조가 아니라면, 먼저 기능을 추가하기 쉬운 형택로 구조를 바로 잡은 후에 원하는 기능을 추가해야한다. 

 

2. 단계

1) 테스트 코드짜기  

2) 동작의 각 부분을 확인해서 함수를 쪼갠다.

 

3. 소스코드 

function statement(invoice, plays){
	let totalAmount =0;
    let volumeCredits = 0;
    let result =`청구 내역 ( 고객명: ${invoice.customer})\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;
        
        switch (play.type) {
        case "tragedy": // 비극
        	thisAmount = 40000;
            if(perf.audience > 30) {
            	thisAmount +=1000*(pefr.audience -30);
                }
                break;
        case "comedy": // 희극
        	thisAmount = 30000;
            if(perf.audience>20) {
            	thisAmount +=10000+500*(pefr.audience -20);
                }
                thisAmount +=300*perf.audience;
                break;
        default:
        	throw new Error(`알 수 없는 장르: ${play.thpe}`);
        }
        
        // 포인트를 적립한다. 
        volumeCredits += Math.max(perf.audience -30, 0);
        //희극 관객 5명마다 추가 포인트를 제공한다. 
        if("comedy" ===paly.type) volumeCredits += Math.floor(perf.audience / 5);
        
        //청구 내역을 출력한다. 
        result += `${play.name}: ${format(thisAmount/100)} (${perf.audience}석\n`;
        totalAmount += thisAmount;
       }
       
       result +=`총액: ${format(totalAmount/`00)}\n`;
       result += `적립 포인트: ${volumeCredits}점\n`;
       return result;
   }

 

 

 

 

 

참고 : Refactoring 리팩터링 2판, 코드 구조를 체계적으로 개선하여 효율적인 리팩터링 구현하기 (저자 : 마틴파울러)