코드 조각에 목적을 드러내는 이름을 붙여 독립된 함수로 빼는 리팩터링. "어떻게"와 "무엇을"을 분리한다. 반대 방향인 함수 인라인하기(Inline Function)는 본문이 이름만큼 명확한 함수를 호출부로 다시 녹인다.
- 코드가 무슨 일을 하는지 파악하는 데 시간이 걸리면 추출하고 그 "무슨 일"을 이름으로 쓴다. 주석을 달고 싶은 구간이 좋은 후보다
- 이름이 떠오르지 않는다면 추출하면 안 된다는 신호다
- 추출할 때 지역 변수가 걸림돌이 된다. 임시 변수를 질의 함수로 바꾸기로 변수를 먼저 줄이면 쉬워진다
- 부수 효과가 섞인 조각을 뽑으면 이해가 오히려 어려워진다. 값을 계산하는 쪽과 상태를 바꾸는 쪽을 나눠 뽑는다(명령-질의 분리)
짧게 쪼갠다고 좋은 건 아니다
심플 디자인 관점에서는 중복이 없는 코드를 길이만 보고 쪼개는 추출을 경계한다. 읽는 사람이 함수 사이를 오가는 "맥락의 점프"가 늘고 구성요소만 많아진다. 중복을 없애려고 뽑은 함수는 대개 좋은 함수가 된다.
켄트 벡도 같은 이야기를 한다. 너무 잘게 나뉘어 오히려 이해가 안 되면 먼저 한 덩어리로 인라인한 다음(One Pile, 한국어판 "하나의 더미") 다시 정리하라고 한다(『켄트 벡의 Tidy First?』 개요). 추출과 인라인을 오가며 경계를 다시 긋는 것이 정상적인 흐름이다.
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Extract Function · refactoring.com: Inline Function · Refactoring.Guru: Extract Method · 인프런 『심플 디자인』 박영록 · 『켄트 벡의 Tidy First?』 켄트 벡 (원서 Tidy First?)