for 반복문을 filter·map·reduce 같은 컬렉션 연산의 연쇄, 즉 컬렉션 파이프라인(Collection Pipeline)으로 바꾸는 리팩터링. 각 원소가 어떤 단계를 거치는지가 위에서 아래로 읽힌다.
// before
const names: string[] = []
for (const p of people) {
if (p.job === 'programmer') names.push(p.name)
}
// after
const names = people.filter(p => p.job === 'programmer').map(p => p.name)먼저 반복문 쪼개기(Split Loop)
한 반복문이 두 가지 일(예: 합계와 평균)을 동시에 하면 고칠 때마다 둘 다 이해해야 한다. 반복문을 복제해 하나에 한 가지 일만 시키면, 각 반복문을 함수로 뽑거나 파이프라인으로 바꾸기 쉬워진다.
- 반복을 두 번 돌면 느려질까 걱정되지만 대부분 무시할 수준이다. 리팩터링과 최적화를 구분하고, 정말 병목이면 측정한 뒤 다시 합친다(섣부른 최적화, 핫 패스)
- 다만 큰 데이터에서
map안에find를 넣는 식의 중첩은 복잡도 자체가 커진다(빅오 표기법) - 인덱스 변수가 사라져 구성요소가 줄고, 선언형 코드에 가까워진다
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Replace Loop with Pipeline · refactoring.com: Split Loop · Martin Fowler: Collection Pipeline