[리팩터링] Refactoring

저번 포스팅에서 리팩토링했던 코드 중 일부를 다시 리팩토링 했습니다.

그만큼 일부 코드다시 글을 쓰려고 합니다.

1. 공연별 총금액 및 좌석수 표시 기능

getOnePlayInfo

원하는 출력 결과

Hamlet: $650.00 (55석)
As you like it: $580.00 (35석)
Othello: $500.00 (40석)

– 기존 코드(지도로 문자열 추가)

// 출력결과에서 원하는 play 하나의 정보를 print 하는 함수

 const getOnePlayInfo = (performanceInfos) => {
     let result = "";
     performanceInfos.map((performance) =>
         result += `\n${performance.play.name}: ${format(performance.amount / 100)} (${performance.audience}석)`
     )
     return result;
 }

– 사용 코드 줄이기

  • 축소를 사용하여 기존 값을 누적하고 추가합니다. 초기값을 ()로 설정합니다.
  • 배열은 조인으로 결합되지만 기본값은 개행 문자입니다. (기존처럼 추가할 때 줄 바꿈 문자를 생략할 수 있습니다.)
  • 불필요한 변수 결과를 제외합니다.
const getOnePlayInfo = (performanceInfos) => {
    return performanceInfos.reduce((acc, performance) =>
            (...acc, `${performance.play.name}: ${format(performance.amount / 100)} (${performance.audience}석)`)
    , ()).join("\n")
}

2. 서비스 종류별 포인트 적립 기능

– 기존 코드

const getPerformanceVolumeCredit = (performance) => {
    // 포인트 구하기
    let volumeCredits;
    volumeCredits = Math.max(performance.audience - 30, 0);

    if(performance.play.type === "comedy") {
        volumeCredits += Math.floor(performance.audience / 5);
    }
    return volumeCredits;
}

– 리팩토링된 코드

  • 코메디 형식으로 함수에서 분기가 아닌 조건을 분기에 매개변수로 전달하는 방식
  • 포인트 획득 기능은 주어진 계수에 따라 포인트를 계산하는 기능만을 수행하도록 처리됩니다.

let isAdditional = newPerformance.play.type === "comedy";
newPerformance.point = getPerformanceVolumeCredit(newPerformance, isAdditional);



const getPerformanceVolumeCredit = (performance, isAdditional) => {
    // 포인트 구하기
    let volumeCredits;
    volumeCredits = Math.max(performance.audience - 30, 0);

    if(isAdditional) {
        volumeCredits += Math.floor(performance.audience / 5);
    }
    return volumeCredits;
}

함수를 실제 함수처럼 사용할 수 있도록 리팩토링 함수의 중요성을 배웠습니다. 함수는 문자 그대로 받는 인수를 통해서만 함수의 역할을 수행하는 함수형 프로그래밍 개념에 맞게 잘 인식되고 코딩되어야 합니다! 힘들다…