컴퓨터/이론 및 tools 사용

[리팩토링 refactoring] Moving Features between Objects 객체간의 기능 이동 - Move Field 필드이동

review777777 2017. 1. 24. 17:14
반응형

Move Field 필드 이동

Problem & Solution

필드가 정의된 클래스보다 다른 클래스에서 더 많이 사용된다면 필드를 더 많이 사용되는 다른 클래스로 옮기고필드를 사용하는 모든 사용자들을 변경한다






종종 필드는 추출 클래스 기술의 일부로 이동된다. 필드를 떠날 클래스를 결정하는 것은 어려울 수 있다. 

경험에 의해서 필드를 사용하는 메소드와 동일한 위치에 필드를 둔다. (또는 대부분의 메소드가있는 곳).
이 규칙은 필드가 단순히 잘못된 위치에있을 때 도움이된다.



Problem



class Account {
  // ...
  private AccountType type;

  public double interestForAmount_days(double amount, int days) {
    return getInterestRate() * amount * days / 365.0;
  }
  public double interestForBigFamily(double familySize) {
    return getInterestRate() / familySize;
  }

  // other 10 methods, which use getInterestRate()

  private double getInterestRate() {
    return type.getInterestRate();
  }
  private void setInterestRate(double arg) {
    type.setInterestRate(arg);
  }
}

class AccountType {
  // ...
  private double interestRate;

  public double getInterestRate() {
    return interestRate;
  }
  public void setInterestRate(double arg) {
    interestRate = arg;
  }
}



Solution


class Account {
  // ...
  private AccountType type;
  private double interestRate;

  public double interestForAmount_days(double amount, int days) {
    return interestRate * amount * days / 365.0;
  }
}

class AccountType {
  // ...
}





절차

필드가 public이라면 Encapsulate Field를 사용한다.

컴파일 및 테스트

타겟 클래스에 해당 필드에 해당 get/set 메소드를 만든다.

소스 클래스에 타겟 객체를 참조하는 방법을 결정한다.

소스 클래스에 있는필드 제거

소스 필드를참조하는 방법을 결정한다.

소스 클래스에서 필드를 제거

소스 필드를 참조하고 있는 모든 부분을 타겟 클래스에 있는 메소드를 참조하도록 수정

컴파일 및 테스트.


리팩토링 하는 방법


1. 필드가 공용 인 경우 필드를 비공개로 설정하고 공용 액세스 방법을 제공하면 리팩토링이 훨씬 쉽다.

 (이 경우 캡슐화 필드 사용 가능).


2.받는 사람 클래스의 액세스 메서드를 사용하여 같은 필드를 만든다.


3.받는 사람 클래스를 어떻게 참조 할 것인지 결정한다. 적절한 객체를 반환하는 필드 나 메서드가 이미있다

그렇지 않은 경우에는받는 사람 클래스의 개체를 저장하기 위해 새 메서드 나 필드를 작성해야한다.


4.받는 사람 클래스의 메서드에 대한 적절한 호출을 사용하여 이전 필드에 대한 모든 참조를 바꾼다. 필드가 private가 아닌 경우, 수퍼 클래스와 서브 클래스에서 이것을 처리한다.


원본 클래스의 필드를 삭제한다.



반응형