Chapter 02. 리팩터링 원칙 (2.1~2.4)

리팩터링 정의

리팩터링[명사]: 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법

리팩터링(하다)[동사]: 소프트웨어의 겉보기 동작은 그대로 유지찬 채, 여러 가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다.

특정한 방식(이 책에 나오는 방법)에 의해 코드를 정리 하는것만이 리팩터링 이다.

누군가 "리팩터링하다가 코드가 깨져서 며칠이나 고생했다"라고 한다면, 십중팔구 리팩터링한 것이 아니다.

나야 나!

리팩터링하는 동안에는 코드가 항상 정상 작동하기때문에 언제든지 멈출수 있다.

나도 코드가 깨진 경험이있었는데 테스트 코드가작성된 곳은 괜찮았다.

리팩터링 과정에서 반결되는 버그는 리팩터링 후에도 그대로 남아 있어야 한다.

2.2 두 개의 모자

기능추가와 리팩터링의 완전히 분리 하여 작업방식에 차이를 두어 인식 해야 한다.

  • 기능추가: 기존 코드는 절대 건드리지 않고 새 기능만 추가. 테스트 케이스를 추가함으로 진척도 파악
  • 리팩터링: 기존 코드 재구성에만 전념. 테스트도 새로 만들지 않음. 인터페이스 변경해야할 때만 테스트 새로 추가. 기능도 추가하지 않는다.

리팩터링 하는 이유

소프트웨어 설계가 좋아 진다.

중복코드 제거 - 모든 코드가 언제나 고유한 일을 수행함을 보장 할 수 있다. 바람직한 설계의 핵심.

여러명이 작업을 할 때는 어떻게?

리팩터링을 하면 소프트웨어를 이해하기 쉬워진다.

리팩터링을 하면 코드의 목적과 나의 의도를 잘 드러내어 명확하게 전달 할 수 있도록 개선할 수 있다.

다른 사람일 수도 있지만 미래의 나를 위함일 수도 있다.

리팩터링을 하면 버그를 쉽게 찾을 수 있다.

코드를 이해하기 쉽다는 말은 버그를 찾기 쉽다는 말. 버그를 찾을 수 있을 만큼 명확해 진다.

켄트 백 왈 : "난 뛰어난 프로그래머가 아니에요. 단지 뛰어난 습관을 지닌 괜찮은 프로그래머일 뿐이에요"

리팩터링하면 프로그래밍 속도를 높일 수 있다.

리팩터링하는데 시간이 소요되어 전체 개발 속도가 느려 질까봐 걱정.

나야 나!

  • 지구력 가설 : 내부 설계를 신경쓰면 소프트웨어의 지구력이 높아져 빠르게 개발 할 수 있는 상태를 더 오래 지속 할 수 있다.

설계를 잘하려면 꼭 코딩을 하기전에 설계를 완벽하게 마쳐야 할 필요는 없다. 리팩터링을 통해 기존 코드의 설계를 얼마 든지 개선할 수 있다.

처음부터 좋은 설계를 마련하기는 매우 어렵다. 빠른 개발이라는 숭고한 목표를 달성하려면 리팩터링이 반드시 필요하다.

2.4 언제 리팩터링해야 할까?

3의 법칙
 1. 처음에는 그냥 한다.
 2. 비슷한 일을 두 번째로 하게 되면 그냥 진행한다.
 3. 비슷한 일을 세번째 하게 되면 리팩터링 한다.
삼진으로 리팩터링

준비를 위한 리팩터링: 기능을 쉽게 추가 하기.

리팩터링을 하기 가장 좋은 시점은 기존 코드에 기능을 추가 하기 직전

이해를 위한 리팩터링: 코드를 이해하기 쉽게 만들기

자잘한 세부 코드에 이해를 위한 리팩터링

  • 이해한 변수의 이름을 변경
  • 긴 함수를 잘게 나누기

쓰레기 줍기 리팩터링

  • 짧게 수정 할 수 있는것은 즉시 고치고 아니라면 짧은 메모만 남긴 다음 진행하던일을 처리 후 리팩터링을 진행 한다.

계획된 리팩터링과 수시로 하는 리팩터링

  • 리팩터링 작업 대부분 드러나지 않게 기회가 될 때마다 해야 한다.
  • 리팩터링 커밋을 분리한다고 해서 좋은것은 아니다. 적합한 방식을 찾아야 한다.

오래 걸리는 리팩터링

  • 주어진 문제를 몇 주에 걸쳐 조금씩 해결해가는 편이 효과적일 떄가 많다.

코드리뷰에 리팩터링 활용하기

  • 리팩터링은 다른이의 코드를 리뷰하는데 도움이 된다.
  • 리팩터링은 코드리뷰의 결과를 더 구체적으로 도출하는데 도움이 된다.
  • PR모델의 코드리뷰에서는 그리 효과적인 방법은 아니다.
  • 코드리뷰가 녹아있는 짝 프로그래밍을 통해서 리뷰를 하게 된다면 매우 좋다.

관리자에게는 뭐라고 말해야 할까?

일정이 최우선인 관리자에게는 리팩터링 한다고 말하지 말고 리팩터링을 하여 일정을 맞추어야 한다. (?)

리팩터링하지 말아야 할 때

  • 내부동작을 이해해야할 시점에 리팩터링해야 효과를 제대로 볼 수 있다.
  • 리팩터링 하는 것보다 처음부터 새로 작성하는게 쉬우면 리팩터링 하지 않는다.

Comments