이 포스트는 지그송님의 "리팩터링 8장 -2" 를 참고하여 거의 똑같이 타이핑하였습니다.
함수는 코드를 이해하기 쉽게 해주고 중복을 없애준다.
inline 코드를 함수로 치환한 모습이다.
특히 라이브러리가 제공하는 함수로 대체할 수 있다면 더 좋다.
// before
let appliesToMass = false;
for (const s of states) {
if (s === "MA") appliesToMass = true;
}
appliesToMass = states.includes("MA");
하나의 데이터 구조를 이용하는 문장들은 한데 모여 있어야 좋다. 문장 슬라이드하기 리팩터링으로 이런 코드들은 한데 모아 둘 수 있다. 관련 있는 코드들은 명확히 구분되는 함수로 추출하는 것이 좋다.
// before
const pricingPlan = retrievePricingPlan();
const order = retreiveOrder();
const baseCharge = pricingPlan.base;
let charge;
const chargePerUnit = pricingPlan.unit;
const units = order.units;
let discount;
charge = baseCharge + units * chargePerUnit;
let discountableUnits = Math.max(units - pricingPlan.discountThreshold, 0);
discount = discountableUnits * pricingPlan.discountFactor;
if (order.isRepeat) discount += 20;
charge = charge - discount;
chargeOrder(charge);
상태를 갱신하는 코드 자체를 최대한 제거하는 게 좋다.
종종 반복문 하나에서 두 가지 일을 수행하는 모습을 보게 된다. 하지만 이렇게 하면 반복문을 수정할 때마다 두 가지 일 모두를 잘 이해하고 진행해야 한다.
반복문을 분리하면 사용하기가 쉬워진다. 한 가지 값만 계산하는 반목문이라면 그 값만 곧바로 반환할 수 있다.
// before
let youngest = people[0] ? people[0].age : Infinity;
let totalSalary = 0;
for (const p of people) {
if (p.age < youngest) youngest = p.age;
totalSalary += p.salary;
}
return `최연소: ${youngest}, 총 급여: ${totalSalary}`;
// after
let youngest = people[0] ? people[0].age : Infinity;
let totalSalary = 0;
for (const p of people) {
totalSalary += p.salary;
}
for (const p of people) {
if (p.age < youngest) youngest = p.age;
}
return `최연소: ${youngest}, 총 급여: ${totalSalary}`;
각 반복문을 각각의 함수로 추출하고, 반복문을 파이프라인으로 바꿀 수 있다.
function totalSalary() {
return people.reduce((total, p) => total + p.salary, 0);
}
function youngestAge() {
return Math.min(...people.map(p => p.age));
}
컬렉션 파이프라인을 이용하면 처리 과정을 일련의 연산으로 표현할 수 있다.