컴퓨터/이론 및 tools 사용

[리팩토링 refactoring] Dealing with Generalisation 일반화 처리 - Pull Up Constructor Body 생성자 내용 상향

review777777 2017. 1. 27. 02:34
반응형

Problem

class Manager extends Employee {
  public Manager(String name, String id, int grade) {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
  //...
}

Solution

class Manager extends Employee {
  public Manager(String name, String id, int grade) {
    super(name, id);
    this.grade = grade;
  }
  //...
}

Pull Up Method와 차이점

1. 자바에서는 하위 클래스가 생성자를 상속받을 수 없으므로 하위 클래스 생성자에 Pull Up Method를 적용하고 수퍼 클래스에 대한 모든 생성자 코드를 제거한 후 삭제할 수 없다. 수퍼 클래스에 생성자를 만드는 것 외에도 수퍼 클래스 생성자에 대한 간단한 위임을 통해 하위 클래스에 생성자가 있어야한다.


2. C ++과 Java에서 (명시 적으로 수퍼 클래스 생성자를 호출하지 않은 경우) 수퍼 클래스 생성자는 서브 클래스 생성자보다 먼저 자동으로 호출되므로 하위 클래스 생성자의 시작 부분에서만 공통 코드를 이동해야한다. (이후 서브 클래스 생성자의 임의의 위치로부터 슈퍼 클래스 생성자를 호출 할 수 없다.).


3. 대부분의 프로그래밍 언어에서 서브 클래스 생성자는 수퍼 클래스의 매개 변수와 다른 자체 매개 변수 목록을 가질 수 있다. 따라서 실제로 필요한 매개 변수 만 사용하여 수퍼 클래스 생성자를 만들어야한다..


리펙토링 하는 방법


1. 수퍼 클래스에서 생성자를 생성
2. 각 서브 클래스의 생성자 시작 부분에서 수퍼 클래스 생성자로 공통 코드를 추출

그렇게하기 전에 가능한 한 많은 공통 코드를 생성자의 시작 부분으로 이동
3. 하위 클래스 생성자의 첫 번째 행에 수퍼 클래스 생성자에 대한 호출을 배치


Example


Before
class Employee {
  // ...
  protected String name;
  protected String id;
  protected Employee(String name, String id) {
    this.name = name;
    this.id = id;
  }
}
   
class Manager extends Employee {
  // ...
  private int grade;
  public Manager(String name, String id, int grade) {
    super(name, id);
    this.grade = grade;
  }
}

After
class Employee {
  // ...
  protected String name;
  protected String id;
}
   
class Manager extends Employee {
  // ...
  private int grade;
  public Manager(String name, String id, int grade) {
    this.name = name;
    this.id = id;
    this.grade = grade;
  }
}


반응형