함수나 필드를 더 자연스러운 맥락(모듈·클래스)으로 옮기는 리팩터링. 좋은 설계의 핵심인 모듈성(Modularity), 즉 어딘가를 고칠 때 관련된 작은 부분만 이해하면 되게 하는 능력을 키운다.
- 기능 편애(Feature Envy): 자기 모듈보다 다른 모듈의 데이터와 더 많이 대화하는 함수. 그 데이터 곁으로 옮겨 준다. 일부만 편애한다면 그 부분만 추출해서 옮긴다
- 어디로 옮길지 애매하면 가장 많은 데이터를 가진 쪽으로 간다
- 옮길 때는 새 위치에 복사하고, 옛 함수가 새 함수를 부르게 바꾼 뒤 테스트하고, 마지막에 옛 함수를 인라인할지 정한다
- 필드 옮기기(Move Field): 함수를 호출할 때마다 다른 레코드의 필드를 함께 넘기거나, 한 레코드를 바꿀 때 다른 레코드도 바꿔야 한다면 필드 위치가 잘못된 것이다. 올바른 데이터 구조를 고르면 동작 코드는 저절로 단순해진다
- 문장 몇 줄을 함수 안으로 넣거나(Move Statements into Function, 중복 제거) 호출한 곳으로 꺼내는(Move Statements to Callers, 변형이 생겼을 때) 것도 같은 축의 기법이다
전략 패턴(Strategy Pattern)이나 방문자 패턴(Visitor Pattern)처럼 일부러 이 규칙을 거스르는 구조도 있다. 핵심 원칙은 "함께 바뀌는 것을 한데 모은다"이고, 이는 곧 응집도를 높이고 결합도를 낮추는 일이다. 산탄총 수술과 뒤엉킨 변경의 주된 처방이기도 하다.
출처: 『리팩터링 2판』 마틴 파울러 (원서 Refactoring, 2nd Edition) · refactoring.com: Move Function · refactoring.com: Move Field · Refactoring.Guru: Move Method · Refactoring.Guru: Feature Envy