서로 다른 두 가지 일을 한꺼번에 하는 코드를, 중간 데이터 구조를 사이에 둔 연속된 두 단계로 나누는 리팩터링. 고칠 때 한 단계만 생각하면 되게 만든다.
// before: 파싱과 계산이 섞여 있다
const data = orderString.split(/\s+/)
const price = priceList[data[0].split('-')[1]] * parseInt(data[1])
// after
const order = parseOrder(orderString) // 1단계: 문자열 → 레코드
const price = priceOrder(order, priceList) // 2단계: 레코드 → 계산- 흔한 예: 입력 파싱과 처리, 데이터 계산과 렌더링, 컴파일러의 토큰화(Tokenizing)·파싱(Parsing)·코드 생성(Code Generation)
- 두 단계 사이의 중간 데이터는 보통 불변 레코드로 두고 굳이 캡슐화하지 않는다
- 뒤엉킨 변경을 푸는 대표 처방이다
- 프런트엔드에서 서버 데이터를 화면용 모델로 먼저 바꾼 뒤 렌더링하는 구조나, 선언형 렌더링 함수가 계산 결과만 받게 하는 것도 같은 생각이다
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Split Phase