어떤 클래스의 인스턴스를 생성할 때 그것이 제공하는 여러 생성자 중 어떤 것을 호출해야 할지 결정하기가 어렵다면, 인스턴스를 생성해 리턴하는 생성 메서드로 각 생성자를 대체하여 그 용도가 명확히 드러나도록 한다.

동기

C++이나 Java 계열의 언어에서는 생성자의 이름이 항상 클래스의 이름으로 고정이다. Python의n의 경우에는 __init__이 생성자의 역할을 대신한다. 특히 C++이나 Java 계열의 언어에서 프로그래머는 생성자가 여러종류일 경우 생성자 코드를 살펴본 후 어떤 생성자를 호출할 지를 정해야한다. 이는 코딩을 할 때 생산성의 저하로 이어지게 된다.

생성자의 시그니처만 보고 용도를 명확히 알기는 어렵다. 생성자가 많을수록 프로그래밍 시 잘못된 생성자를 호출하는 경우도 있다. 극단적인 경우 새로 만들 생성자의 시그니처가 기존 생성자와 같은 경우도 있을 수 있다. 불가능한 선언이 되는것이다.

Creation Method를 이용하여 Constructor를 대체한다면 이러한 문제를 해결할 수 있으며, Creation Method의 이름을 통해 그 역할 또한 명시적으로 전달할 수 있다. Python의 경우에는 class method를 이용하여 구현하면 좋을 것 같다.

절차

  1. 리팩터링할 생성자를 하나 선택하여 이를 호출하는 코드를 확인한다. 이 부분에서 해당 호출부를 Extract Method 리팩터링을 진행한 후 이 메서드를 선언한 클래스로 Move Method 리팩터링을 진행한다.
  2. 선택한 생성자를 사용하는 모든 곳에서 생성자 대신 새로 만든 메서드를 호출하도록 변경한다.
  3. 만약 선택한 생성자가 다른 생성자를 호출하고 있다면, 해당 생성자 대신 호출되는 생성자를 사용하도록 변경한다.
  4. 위의 과정을 반복하여 필요한 모든 생성자를 리팩터링한다.
  5. 마지막으로 클래스의 생성자가 밖에서 사용되지 않는다면 이를 private으로 변경한다.


추가

추상 메서드가 많을 경우 Factory 클래스를 생성하여 생성하는 부분을 위임해도 괜찮다. 취향의 문제이다.

'패턴 공부' 카테고리의 다른 글

Move Creation Knowledge to Factory  (0) 2021.04.07
리팩터링이란?  (0) 2021.04.06
소프트웨어 패턴과 TDD  (0) 2021.04.06
서론  (0) 2021.04.06

+ Recent posts