리팩터링의 정의
- 리팩터링[명사]: 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법
- CHAPTER 01에서의
함수 추출하기와 조건부 로직을 다형성으로 바꾸기가 이 정의에 해당
- 리팩터링[동사]: 소프웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩터링 기법을 적용해서 소프웨어를 재구성하다
- 코드를 정리하는 작업을 전부 리팩터링이라고 표현하는 경향이 있는데, 특정한 방식에 따라 코드를 정리하는 것을 리팩터링이라고 한다
- 동작을 보존하는 작은 단계들을 거쳐 코드를 수정하고, 이러한 단계들을 순차적으로 연결하여 큰 변화를 만들어내는 일
- 리팩터링은 성능 최적화와 비슷하다. 단지 목적이 다를 뿐
- 리팩터링의 목적은 코드를 이해하고 수정하기 쉽게 만드는 것. 프로그램 성능은 좋아질 수도 나빠질 수도 있다.
- 성능 최적화는 오로지 속도 개선에만 집중. 목표 성능에 반드시 도달해야 한다면 코드는 다루기 더 어렵게 바뀔 수도 있음을 각오해야 함
리팩터링하는 이유
- 소프트웨어 설계가 좋아진다.
- 소프트웨어를 이해하기 쉬워진다.
- 버그를 쉽게 찾을 수 있다.
- 프로그래밍 속도를 높일 수 있다.
- 내부 품질이 뛰어난 코드베이스는 새 기능 구축을 돕는 견고한 토대가 됨
- 설계 지구력 가설: 내부 설계에 심혈을 기울이면 소프웨어의 지구력이 높아져서 빠르게 개발할 수 있는 상태를 더 오래 지속할 수 있다
언제 리팩터링을 해야 할까?
- 준비를 위한 리팩터링: 기능을 쉽게 추가하게 만들기
- 함수 매개변수화 하기
- 오류를 일으키는 코드들 한 곳으로 합치기
- 질의 코드에 섞여 있는 갱신 로직 분리
- 이해를 위한 리팩터링: 코드를 이해하기 쉽게 만들기
- 코드의 의도가 더 명확하게 드러나도록 리팩터링할 여지는 없는지 찾아보기
- 리팩터링하면 머리로 이해한 것을 코드에 옮겨 담을 수 있다
- 쓰레기 줍기 리팩터링
- 비효율적으로 처리하는 모습을 발견할 때, 간단히 수정할 수 있는 것은 즉시 고치고 시간이 걸리는 일은 짦은 메모를 남긴 후 하던 일을 끝내고 나서 처리하는데 이것이 이해를 위한 리팩터링의 변형인 쓰레기 줍기 리팩터링이다
리팩터링 시 고려할 문제
- 새 기능 개발 속도 저하
- 리팩터링의 궁극적인 목적은 개발 속도를 높여서, 더 적은 노력으로 더 많은 가치를 창출하는 것
- 코드 소유권