리팩터링 기법을 무엇을 정리하는지에 따라 묶어 본 지도. 기법마다 거의 항상 반대 방향 기법이 짝으로 있어서(추출↔인라인, 올리기↔내리기) 상황에 따라 양쪽으로 오간다. 아래 묶음은 Refactoring.Guru 카탈로그(1판 기반)의 분류를 따랐고, 기법 이름은 2판 기준으로 적었다.
메서드 구성
긴 절차를 읽기 좋은 작은 단위로 다시 묶는다. 함수 추출하기, 변수 추출하기, 임시 변수를 질의 함수로 바꾸기가 중심이다. 한 변수에 두 가지 뜻을 담았거나 매개변수에 다시 대입한다면 변수를 쪼갠다(Split Variable). 알고리즘 전체를 더 단순한 것으로 갈아 끼우는 알고리즘 교체하기(Substitute Algorithm)도 여기에 든다.
기능 이동
책임을 더 자연스러운 곳으로 옮긴다. 함수·필드 옮기기, 문장 슬라이드하기, 단계 쪼개기, 위임 숨기기·중개자 제거. 존재 이유가 약해진 클래스는 인라인하고, 너무 많은 일을 하는 클래스는 추출한다. 수정할 수 없는 외부 클래스에 필요한 동작을 외부 메서드(Introduce Foreign Method)나 지역 확장(Introduce Local Extension)으로 붙이는 기법은 1판과 Refactoring.Guru에만 있다.
데이터 조직화
값과 참조, 컬렉션, 타입 코드를 더 분명한 모델로 바꾼다. 변수·컬렉션 캡슐화, 기본형을 객체로, 참조와 값, 매직 넘버와 설명 상수. 계산할 수 있는 파생 변수는 질의 함수로 바꾼다(Replace Derived Variable with Query). 인덱스에 의미가 있는 배열을 객체로 바꾸는 기법(Replace Array with Object)은 1판·Refactoring.Guru 이름이다.
조건부 로직
조건문 분해·통합, 보호 구문, 조건부 로직을 다형성으로 바꾸기, 특이 케이스와 널 객체, 어서션.
API
함수 선언 바꾸기, 매개변수 객체 만들기, 명령-질의 분리, 플래그 인수, 오류 코드를 예외로. 생성 후 바뀌면 안 되는 필드는 세터를 없애고(Remove Setting Method), 변수를 고치는 함수는 수정된 값을 반환하게 한다(Return Modified Value). 함수와 명령 객체 사이의 변환은 커맨드 패턴 참고.
상속 다루기
공통 메서드·필드·생성자 본문은 부모로 올리고, 일부 자식만 쓰는 것은 내린다. 슈퍼클래스 추출(Extract Superclass), 의미 없어진 계층 합치기(Collapse Hierarchy), 단순한 차이뿐인 서브클래스를 필드로 되돌리는 서브클래스 제거하기(Remove Subclass)가 있다. 상속이 어색해지면 위임으로 바꾼다. 공통 흐름은 템플릿 메서드 패턴로 묶을 수 있다.
어떤 기법부터 볼지는 코드 냄새의 냄새에서 출발하면 고르기 쉽다.
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com 카탈로그 · Refactoring.Guru: Catalog of Refactoring