Refactoring이 동작하는 매커니즘을 아는 것 만큼 중요한 것은, 언제 Refactoring을 적용할까 하는 것이다.
여기서 딜레마가 온다. 어떻게 인스턴스 변수를 삭제하거나 클래스 계증구조를 만드는가를 표현하는 것은 쉽다. 그건 사소한 문제들이다. 하지만 언제 이러한 것들을 해야 할 것인지 표현하는 것은 쉽지 않다. 나는 (여기서의 I는 Martin Fowler) 프로그래밍 미학이라는 모호한 표현으로 얼버무리지 않고 좀 더 확실한 것을 원했다.
내가 이 문제로 Kent Beck 을 방문했을 때 그는 "언제" 를 설명하기 위해서 "Smell" 이라는 표현을 사용했다. 우리는 많은 코드들을 보았고, 그것들을 보면서 Refactoring이 적용가능한 어떤 구조를 발견했다.
여기에서 우리는 Refactoring이 적용가능한 아주 정확한 척도를 제공하려고는 하지 않을 것이다. 경험상, 어떠한 측정도구들도 숙련된 인간의 직관의 경쟁상대가 될 수는 없었다. 우리가 하려는 것은 Refactoring에 의해 해결될 수 있는 문제들이 있는 몇몇 부분을 지적하려는 것이다.
어떠한 Refactoring을 해야 할 지 확신할 수 없을때 이 부분을 읽어라. 정확하게 똑같은 Smell을 발견할 순 없더라도 Refactoring에 대한 올바른 방향을 가리켜 줄 지침이 될 것이다.
Divergent Change ¶
하나의 클래스가 각각 다른 이유들로 인해서 다른 방식으로 자주 변경될 때.
다른 클래스들이 바뀔 때마다 매번 수정되는 부분.
Parallel Inheritance Hierarchies ¶
병렬 상속 구조. shotgun surgery의 특별 케이스가 된다. -_-a
Temporary Field ¶
특별한 상황에서만 세팅되는 변수를 가진 객체.
Message Chains ¶
객체를 부르고 그 객체가 다른 객체를 부르고, 그 다른 객체는 또 또 다른 객체를 부르고.. --
Inappropriate Intimacy ¶
사적인 부분(?)에 대해서 지나치게 관심을 기울이는 위험한(?) 클래스들.
Alternative Classes with Different Interfaces ¶
같은 일을 하지만 다른 signature를 가진 메서드들.
Incomplete Library Class ¶
라이브러리에서 제공하는 메서드들이 불충분할 때.
Data Class ¶
필드, getter, setter만을 가진 어린아이와 같은 클래스.
Refused Bequest ¶
서브클래스가 부모의 behavior는 재사용하나 부모의 인터페이스를 지원하기를 원하지는 않을 때.
Comments ¶
나쁜 냄새를 가리기 위한 방향제로 사용되는 주석. --;
주석을 쓸 필요가 있다는 느낌이 들때 일단 코드를 리펙토링 하면 주석을 많이 쓸 필요가 없음을 알게 된다.
주석을 이용할 좋은 시기는 도대체 무엇을 해야 할 지 모르겠을 때 이다. 무엇을 할 것인지 주석으로 먼저 서술함으로서 주석은 프로그래머가 무엇을 해야 할 지 확신할 수 없을 때 좋은 지침서가 된다. 주석은 ' 왜 당신이 이것을 하는가' 를 말하기 위한 좋은 장소이다.
전에
JuNe 형이 최한기의 신기통을 언급하면서 Metaphor 로서 'Smell' 이 잘 맞아떨어짐을 이야기하던게 생각. '냄새란 일단 그 자체로 악취를 풍길 뿐만 아니라, 밖으로 점차적으로 퍼지고, 사람에게 배어들 수 있으며, 사람에게 배어들고 나면 그 사람이 냄새에 대해 인식을 하지 못한다.'. Smell 에 민감한 사람들은 작은 Refactoring 도 잘 해낼 수 있다. --
1002