Post
KO

코드속 나쁜냄새

코드속의 나쁜냄새

        - kent beck, Martin fowler

앞에서 리팩토링을 언제 시작하고, 언제 끝낼지를 결정하는 것은 리팩토링을 어떤 절차에 따라 해야 하는지를 아는 것만큼 중요하다. 하지만 이는 곧 딜레마에 빠지게 된다. 인스턴스 변수를 하나를 삭제하거나 클래스 구조를 만드는 것에 대해 설명하는 것은 쉽다. 하지만 이런 것들은 쉬운 문제다. 이런 작업을 언제 해야 할지를 설명하는 것이 쉽지 않다. 프로그래밍 미학(aestheics) 같은 모호한 개념에 호소하기 보다는 좀더 구체적인 것을 원한다.

 어떤 리팩토링을 해야 할지 확신이 없을 때, 이 장과 책 표지 안쪽에 있는 표를 보고 영감을 얻을 수 있다.

이 책에서 제안하는 리팩토링은 도움이 될만하다. 정확히 찾을 수 없을지는 몰라도, 제대로 된 방향을 제시할 수는 있을 것이다.

중복된코드  (Duplicated Code)**

​만약 한 곳 이상에서 중복된 코드 구조가 나타난다면, 그것을 합쳐서 프로그램을 개선할 수 있다.

중복된 코드의 가장 단순한 경우는 한 클래스의 서로 다른 두 메소드 안에 같은 코드가 있는 경우이다. 이런 경우 해야 할 것은 Extract Method(136)이고, 뽑아낸 메소드를 그 두곳에서 호출하도록 하는 것이다.

 서로 관계가 없는 두 클래스에서 중복된 코드가 있을 경우에는, 한쪽 클래스에서 Extract Class를 사용한 다음 양쪽에서 이 새로운 클래스를 사용하도록 하는 것을 고려하라. 다른 가능성은 메소드가 클래스 중 하나에 포함되어 있고, 다른 클래스에서 호출되어야 하거나 또는 세 번째 클래스에 속하는 그 메소드가 원래 두 클래스에서 참조되어야 하는 경우이다. 이런 경우 메소드가 어디에 있는 것이 적당한지 결정해야 하고, 다른 곳이 아닌 적절한 곳에 위치하도록 해야 한다.

긴 메소드 (Long Method)**

​ 최적의 상태로 가장 오래 살아 남는 개체 프로그램은 메소드의 길이가 짧다. 객체를 처음 접하는 프로그래머는 작업이 어디에서도 일어나는 것 같지 않고ㅡ 객체 프로그램이 끝없이 다른 객체에 작업을 위임하는 것처럼 느낄 때가 많다. 그러나 이런 프로그램을 몇 년 다루다 보면, 이런 작은 메소드가 얼마나 중요한지 알게 된다. 인디렉션(indirection)의 이점은 모두 짧은 메소드에 의해 제공되는 것이다.

짧은 메소드로 된 코드를 이해하기 쉽게 하려면 무엇보다도 이름을 잘 지어야 한다. 메소드 이름을 잘 지어놓으면 메소드의 내용을 들여다 볼 필요가 없다.

따라서 메소드를 분해하는데 훨씬 더 공격적이어야 한다. 우리가 따르는 방법은, 어떤 것에 대해 주석을 달아야 할 필요를 느낄 때마다 대신 메소드를 작성하는 것이다. 이와 같은 메소드는 주석을 달아야 할 코드를 포함하고 있지만, 그것을 어떻게 처리하는지 보다는 그 코드의 의도를 잘 나타내는 이름을 지어야 한다. 이 작업은 여러 줄 또는 단지 한 줄의 코드에도 적용할 수 있다.

메소드 호출이 원래 코드보다도 더 길어지는 경우라 할지라도, 메소드 이름이 코드의 목적을잘 설명할 수 있다면, 이 작업을 해야 한다.

여기에서 핵심은 메소드의 길이가 아니라 메소드가 하는 일과 일을 처리하는 방법 사이의 의미적 거리(semantic distance)이다.

This article is licensed under CC BY 4.0 by the author.