노트『리팩터링 2판』 개요
Refactoring: Improving the Design of Existing Code (2nd Edition)
설계#refactoring#book · 연결된 개념 8개
쉽게 말하면
이 책은 좋은 코드란 고치기 쉬운 코드이고, 아주 작은 단계로 나눠 정리할수록 오히려 더 빨리 간다고 말하는 책이에요. 깔끔함이라는 도덕이 아니라 개발 속도라는 경제 문제로 리팩터링을 설명해요.
비유가 깨지는 곳 작게 나누면 느릴 것 같지만 각 단계에서 코드가 깨지지 않으니 되돌아갈 일이 줄어요. 그래서 기능을 넣기 어려운 구조라면 먼저 넣기 쉽게 리팩터링하고 그다음 기능을 넣으라고 해요.
마틴 파울러가 리팩터링 기법을 JavaScript 예제로 다시 정리한 책. 1판(Java)의 카탈로그를 다듬고, 클래스 없이 함수만으로도 쓸 수 있는 기법을 많이 담았다.
책의 흐름은 크게 세 덩어리다.
- 예시로 시작: 공연료 청구서를 출력하는 긴 함수를 작은 단계로 쪼개 가며 함수 추출, 단계 쪼개기, 다형성까지 이어지는 과정을 보여 준다
- 원칙과 판단 기준: 리팩터링의 정의와 시점, 코드에서 나는 악취, 리팩터링의 전제인 자가 테스트 코드
- 카탈로그: 기본 기법, 캡슐화, 기능 이동, 데이터 조직화, 조건부 로직, API, 상속 순으로 기법을 모았다(리팩터링 기법 카탈로그)
기억에 남는 메시지:
- 좋은 코드인지는 "얼마나 수정하기 쉬운가"로 가늠한다
- 단계를 잘게 나눌수록 오히려 더 빨리 간다. 각 단계에서 코드가 깨지지 않기 때문이다
- 기능을 추가하기 어려운 구조라면 먼저 추가하기 쉽게 리팩터링하고, 그다음 기능을 추가한다
- 리팩터링은 경제적인 이유로 한다
같은 계열의 더 작은 단위 이야기는 『켄트 벡의 Tidy First?』 개요에서 이어진다.
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com 카탈로그
연결된 개념
이 노트를 가리키는 문서
아직 없습니다.
뜻이 가까운 노트
- 조건문 분해·통합
복잡한 조건문의 조건식과 각 분기 본문에 의도를 드러내는 이름을 붙이는 리팩터링(분해, Decompose Conditional), 그리고 결과가 같은 여러 조건 검사를 하나로 묶는 리팩터링(통합, Consolidate Conditional Expression). 조건 코드는 무엇이 일어나는지는 말하지만 왜 그런지는 잘 말하지 않는데, 이름이 그 "왜"를 채운다.
- 반복문을 파이프라인으로 바꾸기
for 반복문을 filter·map·reduce 같은 컬렉션 연산의 연쇄, 즉 컬렉션 파이프라인(Collection Pipeline)으로 바꾸는 리팩터링. 각 원소가 어떤 단계를 거치는지가 위에서 아래로 읽힌다.
- 함수·필드 옮기기
함수나 필드를 더 자연스러운 맥락(모듈·클래스)으로 옮기는 리팩터링. 좋은 설계의 핵심인 모듈성(Modularity), 즉 어딘가를 고칠 때 관련된 작은 부분만 이해하면 되게 하는 능력을 키운다.
- 섣부른 최적화
"섣부른 최적화는 모든 악의 근원이다." 도널드 크누스(Donald Knuth)가 1974년 글 「Structured Programming with go to Statements」에서 쓴 말이다. 원문의 맥락은 작은 효율은 대부분(약 97%)의 경우 잊으라는 것이고, 정말 중요한 3%는 놓치지 말라는 말이 이어진다.
- 문장 슬라이드하기
관련된 코드끼리 가까이 모이도록 문장의 위치를 옮기는 리팩터링. 그 자체로도 읽기 쉬워지지만, 대개 함수 추출의 준비 단계로 쓴다.