개요
반복문 하나에 두 가지 일을 수행하는 모습을 꽤 자주보게 된다.
이렇게 되면 변경이 가해질 때 두 가지를 모두 고려해야 한다.
반면에 각각으로 분리되어 있다면, 수정할 곳만 확인하면 된다.
예시
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);; } } |
'IT책, 강의 > 리팩터링' 카테고리의 다른 글
09 - 데이터 조직화 - 변수 쪼개기 (0) | 2023.08.14 |
---|---|
08 - 기능이동 - 죽은 코드 제거하기 (0) | 2023.08.13 |
08 - 기능이동 - 문장 슬라이드하기 (0) | 2023.08.08 |
08 - 기능이동 - 인라인 코드를 함수 호출로 바꾸기 (0) | 2023.08.07 |
08 - 기능이동 - 문장을 호출한 곳으로 옮기기 (0) | 2023.08.06 |