Martin Fowler의 [Refactoring - Improving the design of existing code]는 재미없는 책입니다. 하지만 꼭 소장해야하는 책입니다. 이책의 추천사(Forward)도 Erich Gamma가 썼습니다.
Refactoring에 대한 Martin Fowler의 정의는 다음과 같습니다.
Refactoring (noun) : a change made to the internal structure of software to make it easier to understand and cheaper to modify without changing its observable behavior
Refactoring (verb) : to restructure software by applying a series of refactorings without changing it obsevable behavior.
Refactoring의 전제조건(Precondition)은 동작하는 코드입니다. 이런 이유로 Refactoring은 Design By UML보다는 Test-Driven Development과 궁합이 맞습니다. 동작하는 코드를 이해하기 쉽고 수정 비용이 최소화 되도록 "깨끗하게" 변경하는 것이 Refactoring입니다. 그리고 Refactoring의 완료조건(Postcondition)도 동작하는 코드입니다. 깨끗하지만 동작하지 않는 코드는 아무짝에도 쓸모가 없으니...
즉 이런 전제조건(동작하는 코드)과 완료조건(동작하는 코드)이 담보되기 위해서 필요한 것이 바로 자동화된 테스트 케이스입니다. Refactoring의 진행되는 과정과 완료 후에 현재 코드가 동작한다는 것을 간단한 마우스 클릭으로 알 수 있어야 하기 때문입니다. 예를 들면, JUnit Framework가 이런 자동화된 단위 테스트를 제공하는 툴입니다.
Refactoring 과정에서 필요한 두번째는 Refactoring 자체를 자동화해주는 Refactoring Browser의 필요성입니다. Intellij IDEA가 현재의 브랜드 파워를 갖추게된 가장 큰 동인이 Refactoring Browser의 개념을 Java 환경에서 현실화해했기 때문입니다. 자동화된 Refactoring은 수동으로 하는 Refactoring 시 발생할 수 있는 에러를 최소화하고, 지루한 단순반복 작업을 없애줍니다. 결과적으로 개발자가 용기를 가지고 과감하게 자주 Refactoring을 할 수 있게 합니다.
[Rename Method]는 클래스의 메소드 이름을 변경하는 간단한 Refactoring 입니다. 이를 수동적으로 처리할 때 개발자가 해야 하는 일은 다음과 같습니다.
1. Check to see whether the method signature is implemented by a superclass or subclass. If it is, perform these steps for each implementation.
2. Declare a new method with the new name. Copy the old body of code over to the new name and make any alterations to fit.
3. Compile
4. Chagne the body of the old method so that it calls the new one.
5. Compile and test.
6. Find all references to the old method name, and change them to refer to the new one. Comile and test after each change.
7. Remove the old method.
8. Compile and test.
Refactoring Broswer를 사용하면 위의 단계를 간단한 마우스 클릭으로 수행할 수 있습니다. 메소드의 이름을 변경하는 것을 막말로 이젠 껌입니다.
P.S. 현재 시중에 나와 있는 IDE들이 모든 Refactoring Catalog를 지원하지는 못하고 있습니다. 하지만 자주 사용되는 것들에 대한 지원은 충분하다고 생각합니다.
No comments:
Post a Comment