'켄트 벡의 구현패턴'에서 나온 메서드 객체에 대한 내용이다.

책 내용을 그대로 옮기고 소스코드만 재구성 하였다.


메소드 객체는 복잡하게 꼬여 있는 메소드를 읽기 쉽고 명확하면서도 세부 구현 전달이 쉽도록 바꿔준다.

이 패턴은 일단 동작하는 코드가 나온 후에 사용하는 것이 보통이며, 코드가 복잡할수록 효과가 크다.

메소드 객체를 생성할 때는 먼저 많은 수의 파라미터와 임시 변수를 사용하는 긴 메소드를 찾아보라.

메소드를 찾았다면 해당 메소드의 일부를 많은 파라미터를 사용하는 서브 메소드로 변환한다.

메소드 객체를 생성하는 순서는 다음과 같다.

1. 메소드 이름을 따서 클래스 이름을 정한다. 예를 들어 complexCalculation()은 ComplexCalculator가 된다.

2. 메소드에서 사용하는 각 파라미터, 지역 변수, 필드에 대해 새로운 객체상의 필드를 생성한다. 일단
 기존에 사용한 이름과 같은 이름을 사용한다. (이름은 나중에 변경 가능)

3. 본래 메소드의 파라미터와 메소드에서 사용하는 필드를 파라미터로 취급하는 생성자를 만든다.

4. 본래 메소드를 새로운 클래스의 calculate()라는 메소드로 복사한다.
 기존 메소드에서 파라미터, 지역 변수, 필드로 사용된 값들은 이제 모두 새로운 객체의 필드가 되었다.

5. 기존 메소드의 본문을 새로운 객체의 인스턴스를 생성한 후 calcutate()를 호출하는 코드로 바꾼다.

위 순서대로 만들어진 코드는 다음과 같다.

<변경 전>

 

<변경 후>
 
 

이렇게 만들어진 새로운 클래스의 코드는 리팩토링하기 쉽다. 메소드의 일부를 새로운 메소드로 분리하더라도

이젠 모든 데이터가 필드에 저장되어 있으므로, 파라미터를 사용할 필요가 없기 때문이다.
( 본 예제에서는 일부 계산식을 externalMethod() 로 분리하였다. )

때로 메소드를 분화해 나가다 보면, 일부 데이터는 필드가 아닌 지역 변수로 바꾸거나 필드를 파라미터로

바꿔도 괜찮은 경우가 있다. 메소드 분화를 시작하면 기존에 분리하기 어려웠던 공통된 부분을 의미 있는

이름을 가진 도우미 메소드로 쉽게 변화시킬 수 있는 경우가 많다.

 때로 메소드 객체를 사용하려 할 때 이미 기존 객체에서 메소드 분화를 상당히 진행해 놓은 경우도 있다.

이런 경우에는 필요한 메소드를 인라인해서 모든 연산을 한 메소드에 몰아 넣은 다음 메소드 객체를

사용해야 한다. 만약 메소드 객체에서 기존 객체의 메소드를 호출한다면, 인라인 작업이 필요하다는

신호이다. 이런 경우 일단 코드를 백업하고 인라인한 후, 메소드 객체 패턴을 적용하라.

Posted by 윤연식
,