Clean Code that Works.

Design Patten/리팩토링 +1
리팩토링은 코드의 품질을 향상시키기 위한 강력한 기법이다.
다른 모든 강력한 도구들처럼, 리팩토링도 만약 잘못 사용된다면 이롭기보다는 해를 끼칠 수 있다.
다음에 소개하는 몇 가지 간단한 지침들이 리팩토링의 실수들을 예방할 수 있다.

리팩토링을 시작하는 코드를 저장한다.
 - 리팩토링을 시작하기 전에, 여러분이 시작한 코드를 얻을 수 있도록 한다. 변경 사항 관리 시스템에 저장하거나 정확한 파일들을 백업디렉토리에 복사한다.
 
작동중인 시스템을 여는 것은 싱크대를 열어서 세면대를 교체하는 것과 같이 간단하고 쉬운 일이 아니라, 인간의 뇌를 열고 뇌의 신경 세포들을 교체하는 것과 같다. 만약 "소프트웨어 뇌수술"과 같은 용어를 사용했다면 유지 보수 작업이 더 쉬워질까?
                                                                                                        - Gerald Weinberg

리팩토링을 작게 유지한다.
 - 어떤 리팩토링들은 다른 것보다 크며, 정확하게 무엇이 "하나의 리팩토링"을 구성하는지는 분명하지 않을 수 있다. 리팩토링을 작게 유지하여 여러분이 변경한 것들이 미치는 모든 영향을 완전하게 이해하고 있어야 한다. Refactoring(Fowler 1999)에서 설명하고 있는 상세한 리팩토링들은 여러분이 이를 어떻게 처리할 것인지에 대한 여러가지 좋은 예제들을 제공하고 있다.

리팩토링은 한 번에 하나만 수행한다.
 - 어떤 리팩토링들은 다른 것보다 복잡하다. 매우 간단한 리팩토링을 제외하고는, 리팩토링을 한 번에 하나만 수행하고, 다음 리팩토링을 하기 전에 재 컴파일하고 다시 테스트 한다.

여러분이 취할 단계에 대한 목록을 만든다.
 
- 여러분이 A 위치에서 B 위치로 가기 위한 리팩토링 목록을 작성하는 것은 의사코드 프로그래밍 프로세스를 확장한 개념이다. 목록을 작성하면 상황에 맞게 변경하는데 도움을 준다.

주차장을 만든다.
 - 여러분이 리팩토링을 수행하고 있을 때, 때로는 다른 리팩토일을 해야 할 필요가 있을 것이다. 또 새로운 리팩토링을 수행하고 있을 때, 또 다른 리팩토링이 도움이 된다는 것을 발견하게 될 것이다. 지금 당장 필요하지 않은 변경을 위해서 "주차장"을 만들어 놓는다. 즉, 지금 당장은 변경해야 할 필요가 없지만 어느 시점에서 변경해야 하는 변경사항에 대한 목록을 만들어둔다.

빈번하게 체크 포인트를 설정한다.
 - 리팩토릭을 하다보면 코드가 갑자기 엉뚱한 방향으로 가기쉽다. 여러분이 시작한 코드를 저장하는 것뿐만 아니라, 리팩토링을 하면서 여러 곳에 체크 포인트를 저장하여 막다른 골목에 갔을 때, 작동하는 프로그램으로 돌아올 수 있도록 한다.

컴파일러의 경고를 활용한다.
 - 컴파일러는 슬그머니 지나가는 작은 오류들을 만들기가 쉽다. 컴파일러의 경고 수준을 가장 까다롭게 설정하면 많은 오류들을 즉시 잡는 데 도움이 될 것이다.

다시 테스트한다.
 - 변경된 코드에 대한 컴토는 반드시 재테스트를 통해서 보완되어야 한다. 물론, 이것은 처음부터 좋은 테스트 케이스를 갖고 있는지에 의존한다.

테스트 케이스를 추가한다.
 - 이전 테스트로 다시 테스트할 뿐만 아니라, 새로운 코드를 살펴보기 위한 새로운 단위 테스트를 추가한다. 리팩토링으로 인해서 더 이상 사용되지 않은 테스트 케이스들은 제거한다.

변경 사항을 컴토한다.
 - 만약 컴토가 처음부터 중요하다면, 나중에 코드를 변경할 때에는 더욱 중요하다.

리팩토링의 위험 수준에 따라서 접근 방법을 조절한다.
 - 어떤 리팩토링들은 다른 리팩토링보다 위험하다. "매직 넘버를 명명된 상수로 대체한다"와 같은 리팩토링은 상대적으로 위험 요소가 없다. 클래스나 루틴의 인터페이스를 변경하거나, 데이터베이스 스키마를 변경하거나, 불린 테스트를 변경하는 리팩토링은 다른 리팩토링들보다 위험하다. 쉬운 리팩토링의 경우에는 한 번에 하나 이상의 리팩토링을 하기 위해서 리팩토링 프로세스를 능률적으로 처리할 수 있으며, 공식적으로 검사를 거치지 안혹 간단하게 재테스트할 수 있다.

좀 더 위험한 리팩토링에 대해서는 상당히 주의해야 한다. 리팩토링을 한 번에 하나만 수행한다. 일반적인 컴파일러 검사와 단위 테스트뿐만 아니라, 리팩토링을 한 결과를 다른 사람들이 검토하도록 하거나 리팩토링을 위해서 짝 프로그래밍을 사용한다.

from COME COMPLETE 2/E