2011년 5월 26일 목요일

Replace Conditional with Polymorphism

double getSpeed() {
switch (_type) {
case EUROPEAN:
return getBaseSpeed();
case AFRICAN:
return getBaseSpeed() - getLoadFactor() * _numberOfCoconuts;
case NORWEIGIAN_BLUE:
return (_isNailed) ? 0 : getBaseSpeed(_voltage);
}
throw new RuntimeException ("Should be unreachable");
}

객체의 타입에 따라 다른 동작을 선택하는 조건문을 가지고 있는 경우 조건문의 각 부분을 서브클래스에 있는 오버라이딩 메소드로 옮겨라 그리고 원래 메소드를 abstract 로 만들어라

! 동기
  • 타입 코드에 따라서 분기하는 switch 문, 또는 타입 문자열에 따라 분기하는 if-then-else 문이 객체지향 프로그램에서는 일반적이지 않다는 것을 알게 될것이다.

! 절차
  • 조건문이 좀더 큼 메소드의 한 부분이라면, 그 조건문 부분을 취해서 Extract Method를 사용한다.
  • 필요하다면 Move Method를 사용하여 조건문을 상속 구조의 제일 위에 위치 시킨다.
  • 서브 클래스 중에 하나를 선택하여 조건문 메소드를 오버라이드 하는 서브클래스 메소드를 만든다. 조건문에서 필요한 부분을 서브클래스에 복사하고 적절히 수정한다.
  • 조건문의 모든 조건 부분이 서브클래스 메소드로 바뀔 때까지 이 작업을 계속한다.
  • 수퍼 클래스 메소드를 abstract 로 만든다.

댓글 없음:

댓글 쓰기

ETL 솔루션 환경

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