개요

반복문 하나에 가지 일을 수행하는 모습을 자주보게 된다.

이렇게 되면 변경이 가해질 가지를 모두 고려해야 한다.

 

반면에 각각으로 분리되어 있다면, 수정할 곳만 확인하면 된다.

 

예시



function example(){
    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}`;
}
하나의 반복문에 서로 다른 가지를 계산하고 있다.


function example(){
    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;
    }
    //먼저 단순한 복사
    for(const p of people){
        if(p.age<youngest) youngest = p.age;
        totalSalary += p.salary;
    }
    return `최연소:${youngest}, 총 급여: ${totalSalary}`;
}


function example(){
    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 example(){
    let totalSalary = 0;
    for(const p of people) totalSalary += p.salary;
    //더 나아가 각 반복문을 각 함수로 만들기, 먼저 근처로 문장 슬라이드
    let youngest = people[0] ? people[0].age : Infinity;
    for(const p of people) if(p.age<youngest) youngest = p.age;
    return `최연소:${youngest}, 총 급여: ${totalSalary}`;
}


function example(){
    return `최연소:${youngestAge()}, 총 급여: ${totalSalary()}`;
    //각각 함수로 추출
    function youngestAge() {
        let youngest = people[0] ? people[0].age : Infinity;
        for (const p of people)
            if (p.age < youngest)
                youngest = p.age;
        return youngest;
    }
    function totalSalary() {
        let totalSalary = 0;
        for (const p of people)
            totalSalary += p.salary;
        return totalSalary;
    }
}


function example(){
    return `최연소:${youngestAge()}, 총 급여: ${totalSalary()}`;
    //알고리즘 교체하기
    function youngestAge() {
        return people.map(p=>p.age).reduce((a1,a2)=>a1<a2?a1:a2, Infinity);
    }
    //파이프라인으로 바꾸기
    function totalSalary() {
        return people.reduce((total, p)=> total+ p.salary,0);;
    }
}

 

+ Recent posts