코드 리팩토링

코드 리팩토링은 새로운 모듈이나 기능을 만들지 않고도 코드를 개선하는 직접적인 노력으로, 더욱 사용자 친화적이고 깔끔하며 읽기 쉬운 코드를 만듭니다.

리팩토링 없이 코드를 변경할 때마다 코드 부패는 더욱 심해지고 확산됩니다. 코드 부패는 우리를 좌절시키고, 시간을 낭비하게 하며, 유용한 시스템의 수명을 부당하게 단축시킵니다. 애자일 환경에서는 반복 마감일을 준수하느냐 못하느냐의 차이를 의미할 수 있습니다.

코드 리팩토링은 코드의 부패를 방지하고 유지 관리와 확장을 용이하게 합니다. 이러한 확장성이 바로 리팩토링의 이유이며 성공의 척도입니다. 하지만 이는 단지 "safe"테스트 우선 방식으로 작업할 때처럼 광범위한 단위 테스트 스위트가 있다면 코드를 이렇게 광범위하게 리팩토링할 수 없습니다. 리팩토링의 각 단계마다 테스트를 실행할 수 없다면 버그가 발생할 위험이 있습니다. 디자인이 지속적으로 진화하는 진정한 테스트 주도 개발(TDD)을 한다면, 정기적인 리팩토링을 통해 디자인을 진화시킬 수밖에 없기 때문에 어쩔 수 없습니다.

코드 위생

리팩토링에 대한 흔한 비유는 요리하면서 주방을 청소하는 것입니다. 여러 사람을 위해 하루에 여러 가지 복잡한 요리를 준비하는 주방에서는 일반적으로 청소와 정리가 끊임없이 이루어집니다. 누군가는 접시, 냄비, 주방, 음식, 냉장고를 매 순간 깨끗하고 정돈된 상태로 유지할 책임이 있습니다. 이것이 없다면, 연속적인 요리는 곧 실패할 것입니다. 여러분의 집에서도 설거지를 조금만 미뤄도 적지 않은 효과를 볼 수 있습니다. 그릇에 말라붙은 코코아 크리스피를 긁어내려고 해 본 적이 있나요? 2초 동안 헹굴 기회를 놓치면 10분 동안 과격하게 긁어내야 할 수 있습니다.

특정 "리팩토링"

리팩토링은 코드를 끝없이 수정하는 것과는 정반대입니다. 리팩토링은 정확하고 유한합니다. Martin Fowler의 확실한  이 주제에 대해 72가지 구체적인 "리팩토링"을 이름별로 설명합니다(예: "메서드 추출"은 한 메서드에서 코드 블록을 추출하여 새 메서드를 생성합니다). 각 리팩토링은 코드 섹션(블록, 메서드, 클래스)을 22가지 잘 알려진 "악취 나는" 상태 중 하나에서 더 최적의 상태로 변환합니다. 리팩토링 기회를 인식하고 리팩토링을 제대로 구현하는 법을 배우는 데는 시간이 걸립니다.

패턴으로 리팩토링

리팩토링은 낮은 코드 수준에서만 발생하는 것이 아닙니다. 그의 최근 저서에서 패턴으로 리팩토링하기Joshua Kerievsky는 리팩토링이 "4인조" 디자인 패턴을 코드에 도입하는 데 사용해야 하는 기술이라고 능숙하게 주장합니다. 그는 패턴이 종종 과도하게 사용되고 시스템에 너무 일찍 도입되는 경우가 많다고 주장합니다. 그는 특정 "리팩토링", 즉 코드를 A 지점에서 B 지점으로 옮기는 방법을 보여주고 명명하는 Fowler의 원래 형식을 따릅니다. Kerievsky의 리팩토링은 일반적으로 Fowler의 리팩토링보다 수준이 높으며 종종 Fowler의 리팩토링을 구성 요소로 사용합니다. Kerievsky는 또한 패턴을 "향하여" 리팩토링하는 개념을 소개하며, 얼마나 많은 디자인 패턴이 여러 가지 구현 또는 구현의 깊이를 가지고 있는지 설명합니다. 때로는 다른 때보다 패턴이 더 필요하며, 이 책은 그 길의 일부 또는 전부에 도달하는 방법을 정확하게 보여줍니다.

리팩토링의 흐름

테스트 우선 환경에서 리팩토링은 다른 코드 변경과 동일한 흐름을 따릅니다. 자동화된 테스트가 있습니다. 컴파일, 실행, 그리고 제대로 작동하는 가장 작은 개별 변경을 통해 리팩토링을 시작합니다. 가능한 경우, 기존 코드에 병렬로 코드를 추가하여 변경합니다. 테스트를 실행합니다. 그런 다음, 다음 작은 개별 변경을 수행하고 테스트를 다시 실행합니다. 리팩토링이 완료되고 모든 테스트가 정상적으로 실행되면, 이전의 낡고 냄새 나는 병렬 코드를 제거합니다. 그 후 테스트가 정상적으로 실행되면 작업이 완료된 것입니다.

IDE에서 리팩토링 자동화

리팩토링은 수동으로 하는 것보다 자동으로 하는 것이 훨씬 쉽습니다. 다행히도 점점 더 많은 통합 개발 환경(IDE)에서 자동 리팩토링 지원을 내장하고 있습니다. 예를 들어, Java용으로 널리 사용되는 IDE 중 하나는 다음과 같습니다. , 여기에는 항상 더 많은 자동 리팩토링이 포함됩니다. 또 다른 인기 있는 기능은 다음과 같습니다. IntelliJ IDEA에는 역사적으로 더 많은 리팩토링 기능이 포함되어 있었습니다. .NET 환경에는 Visual Studio 2003용 리팩토링 도구 플러그인이 최소 두 개 있으며, 향후 Visual Studio 버전에서는 리팩토링 지원 기능이 기본 제공될 예정이라고 합니다.

Eclipse나 IDEA에서 코드를 리팩토링하려면 리팩토링할 코드를 선택하고 메뉴에서 필요한 리팩토링을 선택하면 IDE가 나머지 작업을 자동으로 처리합니다. 이름을 지정해야 하는 항목의 새 이름과 유사한 입력을 위한 대화 상자가 적절하게 표시됩니다. 그런 다음 테스트를 즉시 다시 실행하여 변경 사항으로 인해 문제가 발생하지 않았는지 확인할 수 있습니다. 문제가 발생한 경우 리팩토링을 쉽게 취소하고 원인을 조사할 수 있습니다.