부수효과가 있는 코드를 슬라이드하거나 부수효과가 있는 코드를 건너뛰어야 한다면 훨씬 신중해야 함. 또 상태 갱신에 특히나 신경 써야 하기 때문에 상태를 갱신하는 코드 자체를 최대한 제거하는 게 좋음
슬라이드 후 테스트가 실패했을 때 가장 좋은 대처는 더 작게 슬라이드해보는 것이 좋음
더 읽을거리
문장 교환하기라는 이름의 거의 똑같은 리팩터링 방법은 인접한 코드 조각을 이동하지만, 문장 하나짜리 조각만 취급함
따라서 이동한 조각과 건너뛸 조각 모두 단일 문장으로 구성된 문장 슬라이드로 생각해도 됨
8.7 반복문 쪼개기
종종 반복문 하나에서 두 가지 일을 수행하는 모습을 보게 됨. 이렇게 하면 반복문을 수정할 때마다 두 가지 일 모두를 잘 이해하고 진행해야 함
반복문을 분리하면 사용하기가 쉬워짐. 한 가지 값만 계산하는 반복문이라면 그 값만 곧바로 반환할 수 있음
절차
반복문을 복제해 두 개로 만듦
반복문이 중복되어 생기는 부수효과를 파악해서 제거함
테스트함
완료됐으면, 각 반복문을 함수로 추출할지 고민해봄
예시
// beforelet 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}`;
// afterlet 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}`;// 각 반복문을 각각의 함수로 추출하고, 반복문을 파이프라인으로 바꿀 수 있음functiontotalSalary(){return people.reduce((total, p)=> total + p.salary,0);}functionyoungestAge(){return Math.min(...people.map((p)=> p.age));}
8.8 반복문을 파이프라인으로 바꾸기
컬렉션 파이프라인을 이용하면 처리 과정을 일련의 연산으로 표현할 수 있음
절차
반복문에서 사용하는 컬렉션을 가리키는 변수를 하나 만듦
반복문의 첫 줄부터 시작해서, 각각의 단위 행위를 적절한 컬렉션 파이프라인 연산으로 대체. 이때 컬렉션 파이프라인 연산은 1에서 만든 반복문 컬렉션 변수에서 시작하여, 이전 연산의 결과를 기초로 연쇄적으로 수행됨. 하나를 대체할 때마다 테스트함.