내가 생각할때 함수 추출하기라고 불리는 리팩토링 기법은 세부적인 구현에 관한 코드를 함수로 빼서 의미를 부여하는 과정이라고 생각한다. 즉, 다른 동료 개발자들은 세부적인 구현 코드를 알 필요없이 함수의 이름만으로 이 코드가 어떤 동작을 하는 코드인지를 알 수 있는 것이다. 뿐만 아니라, 함수로 추출함으로서 중복되는 코드를 줄일 수도 있다.
어떤 식으로 함수를 추출하는지 아래의 코드에서 확인해보자.
before
function printOwing(invoice) {
let outstanding = 0;
console.log("**");
console.log("**고객채무**");
console.log("**");
for (const o of invoice.orders) {
outstanding += o.amount;
}
const today = Clock.today;
invoice.dueDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 30
);
console.log(`고객명: ${invoice.customer}`);
}
after
function printOwing(invoice) {
printBanner();
let outstanding = calculateOutstanding(invoice);
recordDueDate(invoice);
printDetail(invoice);
function printBanner() {
console.log("**");
console.log("**고객채무**");
console.log("**");
}
function calculateOutstanding(invoice) {
let result = 0;
for (const o of invoice.orders) {
result += o.amount;
}
return result;
}
function printDetail(invoice) {
console.log(`고객명: ${invoice.customer}`);
}
function recordDueDate(invoice) {
const today = Clock.today;
invoice.dueDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 30
);
}
}
자바스크립트에서는 nested function이 허용되기 때문에 함수 본문에서 또 다른 함수를 추출해줬다.
after 코드를 확인해보면 4줄로 코드가 간단히 정리된 것을 알 수 있다. 기본적인 리팩토링 기법이지만 굉장히 유용한 것 같다. 구현이 복잡한 코드는 클라이언트에서 이를 추출해 캡슐화 해주자!