1장: 리팩터링 리팩터링하기
리팩터링 구성요소
스킬
어떤 코드가 잘못되었으며, 리팩터링이 필요한지 파악하는 스킬
문화
리팩터링에 시간을 들이는 것을 권장하는 문화와 절차
도구
작업의 안전성을 보장할 무언가. ex)자동화된 테스트
1.1 리팩터링이란 무엇인가?
→ 기능을 변경하지 않고 코드를 변경하는 것
리팩터링을 해야 하는 이유
- 코드를 더 빠르게, 작게 만들기
- 코드를 더 일반적이거나 재사용 가능하게 만들기
- 코드의 가독성을 높이고 유지보수를 용이하게 하기 → 좋은 코드!
좋은 코드란?
→ 사람이 읽기 쉽고, 유지보수가 용이하며, 의도한 대로 잘 동작하는 코드
리팩터링의 장점
- 코드베이스에서 가독성을 높이면, 새로운 기능을 구현하기 위한 시간을 확보할 수 있다!
- 유지보수가 용이해지면 버그가 줄고 수정이 쉽다.
- 좋은 코드베이스는 생각을 편하게 한다.
1.2 스킬: 무엇을 리팩터링할 것인가?
1.2.1 코드 스멜의 예
→ 함수는 한 가지 작업을 수행해야 한다.
→ “한 가지”의 정의가 명확하지 않음!
코드 스멜을 대체할 구체적인 규칙 - 세 가지 추상화 수준
- 매우 구체적인 이름
- 뉘앙스를 더하는 설명
- 해당 코드 스멜의 의도
1.2.2. 규칙의 예
→ 다섯 줄 제한
→ 코드 리팩터링의 시작점을 제시.
1.3 문화: 리팩터링은 언제 할까?
레드-그린-리팩터 작업 절차( 테스트 주도 개발 )
- RED : 항상 실패하는 테스트
- GREEN : 테스트에 통과하는 코드
- REFACTOR : 테스트가 통과하면 코드를 리팩토링
위의 레드 그린 사이클 처럼 우선 테스트를 작성하고 그걸 통과하는 코드를 만들고 해당 과정을 반복하면서 제대로 동작하는지에 대한 피드백을 적극적으로 받는 작업 절차.
프로그래밍 작업으로 문제를 해결할 때 사용하는 6단계 작업 절차
- 탐색: 무엇을 구현할지 실험
- 명세화: ex) 자동화된 테스트
- 구현
- 테스트
- 리팩터링
- 전달
리팩터링 절차
1.3.1 레거시 시스템에서의 리팩터링
우선 변경하기 쉽게 만든 후 변경하라. -켄트 백
→ 구현할 때마다 리팩터링하기!
1.3.2 언제 리팩터링을 하지 말아야 할까?
- 한번 실행하고 삭제할 코드 = 스파이크
- 폐기되기 전 유지보수 모드에 있는 코드
- 임베디드 시스템, 게임 물리엔진 등 엄격한 성능 요구사항이 있는 코드
1.4 도구: (안전한) 리팩터링 방법
의존 가능한 도구
- 상세하고 구조화된 리팩터링 패턴
- 버전 관리
- 컴파일러