코드 조각을 찾아 무슨 일을 하는지 파악한 다음, 독립된 함수로 추출하고 목적에 맞는 이름을 붙인다.
코드를 언제 독립된 함수로 묶어야 할지에 관한 의견은 수없이 많다. 먼저, 길이를 기준으로 삼을 수 있다. 가령 함수 하나가 한 화면을 넘어가면 안 된다는 규칙을 떠올릴 수 있다. 재사용성을 기준으로 할 수도 있다. 두 번 이상 사용될 코드는 함수로 만들고, 한 번만 쓰이는 코드는 인라인 상태로 놔두는 것이다.하지만 내 눈에는 '목적과 구현을 분리'하는 방식이 가장 합리적인 가준으로 보인다. 코드를 보고 무슨 일을 하는지 파악하는 데 한참 걸린다면 그 부분을 함수로 추출한 뒤 '무슨 일'에 걸맞는 이름을 짓는다. 이렇게 해두면 나중에 코드를 다시 읽을 때 함수의 목적이 눈에 확 들어오고, 본문 코드(그 함수가 목적을 이루기 위해 구체적으로 수행하는 일)에 대해서는 더 이상 신경 쓸 일이 거의 없다.
function printOwing(invoice){
let outstanding = 0;
console.log("**************");
console.log("****고객채무****");
console.log("**************");
//미해결채무(outstanding) 계산
for(const o of invoice.orders) {
outstanding += o.mount;
}
//마감일(dueDate)기록
const today = Clock.today;
invoice.dueDate = new Date(today.getFullYear(), today.getMonth()),
today.getDate() + 30);
// 세부사항 출력
console.log(`고객명: ${invoice.customer}`);
console.log(`채무액: ${outstanding}`);
console.log(`마감일: ${invoice.dueDate.toLocalDateString()}`);
}
function printOwing(invoice){
printBanner();
const outstanding = calculateOutstanding();
recordDueDate(invoice);
printDetails(outstanding);
function printBanner() {
console.log("**************");
console.log("****고객채무****");
console.log("**************");
}
function calculateOutstanding(invoice) {
let result = 0;
for(const o of invoice.orders) {
result += o.mount;
}
return result;
}
function recordDueDate(invoice) {
const today = Clock.today;
invoice.dueDate = new Date(today.getFullYear(), today.getMonth()),
today.getDate() + 30);
}
function printDetails(nvoice,outstanding) {
console.log(`고객명: ${invoice.customer}`);
console.log(`채무액: ${outstanding}`);
console.log(`마감일: ${invoice.dueDate.toLocalDateString()}`);
}
function printDetails(i) {
console.log(`고객명: ${invoice.customer}`);
console.log(`채무액: ${outstanding}`);
}
}
마틴 파울러 저 리팩터링 2판