2011년 5월 26일 목요일

Move Method


class Project {
 Person[] participants;
}

class Person {
 int id;
 boolean participate(Project p) {
   for(int i=0; i<p.participants.length; i++) {
 if (p.participants[i].id == id) return(true);
   }
   return(false);
 }   
}

... if (x.participate(p)) ...

After applying the move you end up with
class Project {
 Person[] participants;
 boolean participate(Person x) {
   for(int i=0; i<participants.length; i++) {
 if (participants[i].id == x.id) return(true);
   }
   return(false);
 }   
}

class Person {
 int id;
}

... if (p.participate(x)) ...


객체간의 기능 이동
  • 객체 디자인에서 가장 기본이 되는 것은 책임을 어디에 둘지를 결정하는 것이다. àMove Method, Movie Field
  • 너무 많은 책임으로 비대해진다면 à Extract Class
  • 클래스가 하는 일이 별로 없다면 à Inline Class

@ Move Method
메소드가 자신이 정의한 클래스보다 다른 클래스의 기능을 더 많이 사용하고 있다면 이메소드를 가장 많이 사용하고 있는 클래스에 비슷한 몸체를 가진 새로운 메소드로 만들어라. 그리고 이전 메소드는 간단한 위임으로 바꾸거나 완전히 제거한다.
! 동기
  • 클래스가 너무 많은 동작을 가지고 있거나
  • 다른 클래스와 공동으로 일하는 부분이 너무 많아서 단단히 결합되어 있을 때
  • 자신이 속해 있는 클래스 보다 다른 클래스를 더 많이 참조하는 메소드가 있을 때

! 절차
  • 소스 클래스에 정의된 소스 메소드에 의해 사용되는 모든 부분을 조사한다.
  • 소스 클래스의 서브클래스나 수퍼클래스에서 옮기려고 하는 메소드에 대한 다른 선언이 있는지 확인한다.
  • 타겟 클래스에 메소드를 정의한다.
  • 소스 메소드에서 타켓 메소드로 코드를 복사한다.
  • 타켓 클래스에서 동작하도록 메소드를 적절히 수정한다.
  • 소스 클래스에서 적절한 타켓 객체를 참조하는 방법을 결정한다.
  • 소스 메소드를 위임 메소드로 바꾼다.
  • 소스 메소드를 제거한다면 소스 메소드를 참조하고 있는 부분을 타켓 메소드를 참조하도록 수정한다.

! 관련 리팩토링

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

ETL 솔루션 환경 하둡은 대용량 데이터를 값싸고 빠르게 분석할 수 있는 길을 만들어줬다. 통계분석 엔진인 “R”역시 하둡 못지 않게 관심을 받고 있다. 빅데이터 역시 데이터라는 점을 볼때 분산처리와 분석 그 이전에 데이터 품질 등 데이...