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

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

! 관련 리팩토링

댓글 없음:

댓글 쓰기

블록체인 개요 및 오픈소스 동향

블록체인(block chain) 블록체인은 공공 거래장부이며 가상 화폐로 거래할때 발생할때 발생할 수 있는 해킹을 막는 기술. 분산 데이터베이스의 한 형태로, 지속적으로 성장하는 데이터 기록 리스트로서 분산 노드의 운영자에 의한 임의 조작이 불가...