Ch.14 리팩토링: 기존 코드를 성장시키는 기술
1. 리팩토링 흐름
- 리팩토링
- 실질적 동작 유지하면서 구조만 정리하는 작업
- 실질적 동작이 바뀐다면 리팩토링 아님.
- 실질적 동작 변하지 않았음을 단위 테스트를 통해 확인ㄴ
- 여러가지 리팩토링 사항
- 중첩 제거
- 의미 단위로 로직 정리
- 조건 읽기 쉽게 하기
- 목적 나타내는 메소드로 바꾸기
2. 단위 테스트로 리팩토링 중 실수 방지
- 단위 테스트
- 작은 기능 단위로 동작 검증
- 테스트 프레임워크와 테스트 코드 활용해서 메소드 단위로 동작 검증
- 리팩토링에서 단위 테스트는 필수!
- 테스트 코드 사용한 리팩토링 흐름
- 이상적 구조 클래스 기본 형태 잡기
- 기본 형태 기반으로 테스트 코드 작성
- 테스트 실패시키기
- 테스트 성공시키기 위한 최소한 코드 작성
- 기본 형태 클래스 내부에서 리팩토링 대상 코드 호출
- 테스트 성공할 수 있도록 로직을 이상적 구조로 리팩토링
3. 불확실한 사양을 이해하기 위한 분석 방법
- 테스트가 없는 코드에 테스트를 추가해서 안전하게 리팩토링 할 수 있는 여러 테크닉
사양 분석 방법 1: 문서화 테스트
- 메소드 이름만으로 의도 확인 어려울 때
- 문서화 테스트
- 메소드 사양 분석 방법
- 분석하고 싶은 메소드 테스트를 작성해, 해당 메소드가 어떤 동작하는지 확인
사양 분석 방법 2: 스크래치 리팩토링
- 이상적인 구조 자체 유추 어려울 때
- 스크래치 리팩토링
- 로직 의미, 구조 분석하기 위해 시험 삼아 리팩토링
- 별도 레포지토리 파서 리팩토링 작업
- 가독성 좋아져 로직 사양 이해 도움
- 리팩토링 목표가 보임
- 데드 코드 보임
- 테스트 코드 어떻게 작성할지 보임
4. IDE 리팩토링 기능
이름 변경
메소드 추출
- 로직 일부 메소드 추출
- Extract Method
- command + option + M
5. 리팩토링 시 주의 사항
기능추가와 리팩토링 동시에 하지 않기
- 버그 발생 시, 어떤 부분에서 발생한 버그인지 추적 어려움
작은 단계로 실시하기
- 리팩토링은 작은 단계로 실시하는 것이 좋음
- 여러 번 커밋했다면, 풀 리퀘스트 작성하는 것이 좋음
불필요한 사양은 제거 고려
- 불필요한 사양 있으면 리팩토링 어려움
- 리팩토링 전에 불필요 사양있는지 확인 후 제거
💡 동적 언어 리팩토링
- 정적 언어 리팩토링
- IDE 정적 분석 기능 활용
- 클래스, 메소드 호출 위치 정확하게 추적 가능
- 동적 언어 리팩토링
- 어느정도 호출 위치 추적이 가능하나, 완전하지 못함