- 리팩터링 적용 방법을 아는 것과 제때 적용할 줄 아는 것은 다르다. 언제 시작하고 언제 그만할지를 판단하는 일은 리팩터링 작동 원리를 아는 것 못지않게 중요함
1. 기이한 이름
- 코드는 단순하고 명료하게 작성해야 하는데, 이를 표현하는 가장 중요한 요소들 중 하나는
이름이다. 그래서 함수, 모듈, 변수, 클래스 등은 그 이름만 보고도 각각이 무슨 일을 하고 어떻게 사용해야 하는지 명확히 알 수 있도록 엄청나게 신경 써서 지어야 한다.
- 이름을 바꾸는 리팩터링들 중에는
함수 선언 바꾸기, 변수 이름 바꾸기, 필드 이름 바꾸기 등이 있다.
- 이름 바꾸기는 단순히 이름을 다르게 표현하는 연습이 아니다. 마땅한 이름이 떠오르지 않는다면 설계에 근본적인 문제가 숨어있을 가능성이 높기 때문에, 혼란스러운 이름을 잘 정리하다 보면 코드가 훨씬 간결해질 때가 많다
2. 중복코드
- 한 클래스에 두 메서드가 같은 표현식을 사용하는 경우
함수 추출하기를 써서 양쪽 모두 추출된 메서드를 호출하게 바꾼다
- 코드가 비슷하지만 완전 똑같지는 않다면
문장 슬라이드하기로 비슷한 부분을 한 곳에 모아 함수 추출하기를 더 쉽게 적용할 수 있는지 살핀다
- 같은 부모로부터 파생된 서브 클래스들에 코드가 중복되어 있다면 각자 따로 호출되지 않도록
메서드 올리기를 적용해 부모로 옮긴다
3. 긴 함수
- 코드를 이해하고 공유하고 선택하기 쉬워진다는 장점은 함수를 짧게 구성할 때 나오는 것
- 짧은 함수로 구성된 코드를 이해하기 쉽게 만드는 가장 확실한 방법은 결국 좋은 이름이다
- 함수 이름은 동작 방식이 아닌 의도가 드러나게 짓는다. 코드의 목적을 드러내야 함!
- 함수를 짧게 만드는 작업의 99%는
함수 추출하기가 차지. 함수 본문에서 따로 묶어 빼내면 좋을 코드 덩어리를 찾아 새로운 함수로 만드는 것
- 조건문이나 반복문도 추출 대상의 실마리를 제공한다
- 조건문은
조건문 분해하기로 대응
- 거대한 switch문을 구성하는 case문마다
함수 추출하기 를 적용하여 함수 호출문 하나로 바꾸기
- 같은 조건을 기준으로 나누는 switch문이 여러 개라면
조건문을 다형성으로 바꾸기 적용
- 추출한 반복문 코드에 적합한 이름이 떠오르지 않는다면 성격이 다른 두 가지 작업이 섞여 있을 가능성이 있음. 이럴 때 과감히
반복문 쪼개기를 적용
4. 긴 매개변수 목록
- 사용 중인 데이터 구조에서 값들을 뽑아 각각을 별개의 매개변수로 전달하는 코드라면
객체 통째로 넘기기를 적용해 원본 데이터 구조 그대로 전달