노트

리팩터링 기법 카탈로그

Catalog of Refactorings

설계#refactoring · 연결된 개념 27개

쉽게 말하면

리팩터링 기법 카탈로그는 공구함 칸막이처럼 기법을 '무엇을 정리하느냐'로 나눠 둔 지도예요. 메서드 구성, 기능 이동, 데이터 조직화 같은 칸을 보고 지금 필요한 도구를 꺼내 쓰면 돼요.

비유가 깨지는 곳 공구와 달리 기법 대부분은 추출과 인라인, 올리기와 내리기처럼 반대 방향 짝이 있어서 상황에 따라 양쪽으로 오가요. 어디서 시작할지는 코드 냄새에서 출발하면 고르기 쉬워요.

리팩터링 기법을 무엇을 정리하는지에 따라 묶어 본 지도. 기법마다 거의 항상 반대 방향 기법이 짝으로 있어서(추출↔인라인, 올리기↔내리기) 상황에 따라 양쪽으로 오간다. 아래 묶음은 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

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 반복문을 파이프라인으로 바꾸기

    for 반복문을 filter·map·reduce 같은 컬렉션 연산의 연쇄, 즉 컬렉션 파이프라인(Collection Pipeline)으로 바꾸는 리팩터링. 각 원소가 어떤 단계를 거치는지가 위에서 아래로 읽힌다.

보기 옵션