컴퓨터/이론 및 tools 사용

[리팩토링 refactoring] Moving Features between Objects 객체간의 기능이동 - Introduce Local Extension 국소적 상속확장 클래스 사용

review777777 2016. 11. 24. 02:55
반응형


Introduce Local Extension 국소적 상속확장 클래스 사용


사용중인 클래스에 필요한 메소드가 없다.

더 나쁜 것은 클래스가 타사 라이브러리에 있기 때문에 이러한 메서드를 추가 할 수 없다는 것이다.

이때 두 가지 방법이 있다.
•관련 클래스에서 하위 클래스를 만들고 메서드를 포함하고 부모 클래스의 다른 모든 것을 상속한다

이 방법은 더 쉽지만 때로는 유틸리티 클래스 자체에 의해 차단된다.(결함 때문에).
• 모든 새 메서드를 포함하고 다른 곳에서 유틸리티 클래스의 관련 객체에 위임 할 래퍼 클래스를 만든다.

이 메소드는 랩퍼와 유틸리티 오브젝트 사이의 관계를 유지 보수하도록 코드 할뿐만 아니라 유틸리티 클래스의 공용 인터페이스를에 D 레이트하기 위해 많은 수의 단순 위임 메소드를 필요로하므로 더 많은 작업이 필요하다.


Problem & Solution



사용하고 있는 서버 클래스에 여러 개의 메소드를 추가할 필요가 있지만 서버 클래스를 수정할 수 없는 경우, 필요한 추가 메소드를 포함하는 새로운 클래스를 만들어라. 이 확장 클래스를 원래 클래스의 서브클래스 또는 래퍼(wrapper) 클래스로 만들어라.사용하고 있는 서버 클래스에 메소드를 추가 하고 싶지만 추가를 못할 경우 적당한 장소에 메소드를 모아 놓으면 된다. 객체지향기술인 서브클래싱과 래핑을 사용한다.

extension에 있어야 하는 코드를 계속해서 다른 클래스에 놓아 둔다면, 결국에 다른 클래스들은 복잡해지고 이 메소드를 재사용하기는 어렵다.

 





Problem



class Account {
  // ...
  double schedulePayment() {
    Date paymentDate = new MfDateSub(previousDate).nextWeek();

    // Issue a payment using paymentDate.
    // ...
  }
}

// Local extension class.
class MfDateSub extends Date {
  public MfDateSub(String dateString) {
    super(dateString);
  }
  public MfDateSub(Date arg) {
    super(arg.getTime());
  }
  public Date nextWeek() {
    return new Date(getYear(), getMonth(), getDate() + 7);
  }
}



Solution



class Account {
  // ...
  double schedulePayment() {
    Date paymentDate = nextWeek(previousDate);

    // Issue a payment using paymentDate.
    // ...
  }

  /**
   * Foreign method. Should be on Date.
   */
  private static Date nextWeek(Date arg) {
    return new Date(arg.getYear(), arg.getMonth(), arg.getDate() + 7);
  }
}







절차

원 클래스의 서브클래스나 래퍼 클래스로 확장 클래스를 만든다.

변환 생성자를 확장 클래스에 추가한다.

새로운 기능을 확장 클래스에 추가한다.

필요한 곳에서 원래 클래스를 확장 클래스로 대체한다.

이 클래스에 대해 정의된 외래 메소드를 모두 확장 클래스로 옮긴다.

 

Benefits

분리된 확장 클래스(래퍼 또는 하위클래스)에 추가 메소드를 이동함으로써 맞지 않은 코드의 클라이언트 클래스를 망치는 것을 피할 수 있다.프로그램 구성요소는 더 일관성있고 재사용 할 수 있다.

 

 

 리팩토링 하는 방법

1. 새로운 확장 클래스 생성 :
• 옵션 A : 유틸리티 클래스의 하위로 만듦
• 옵션 B : 래퍼를 만들기로 결정한 경우 위임 할 유틸리티 클래스 개체를 저장하기위한 필드를 만듦

이 옵션을 사용하는 경우 유틸리티 클래스의 공용 메서드를 반복하고 유틸리티 개체의 메서드에 간단한 위임을 포함하는 메서드를 만들어야한다.

유틸리티 클래스의 생성자 매개 변수를 사용하는 생성자를 만듦.


3. 또한 매개 변수에서 원래 클래스의 개체 만 가져 오는 대체 "변환"생성자를 만든다.

이렇게하면 원래 클래스의 객체를 확장자로 대체하는 데 도움이된다.


4. 클래스에서 새로운 확장 메소드를 작성한다.

다른 클래스에서이 클래스로 외부 메서드를 이동하거나 해당 기능이 이미 확장에있는 경우 외부 메서드를 삭제한다.


기능이 필요한 곳에서 유틸리티 클래스를 새로운 확장 클래스와 함께 사용.



반응형