2010-04-29 2 views
2

레거시 코드베이스에서 나는 너무 많은 필드/책임을 가진 매우 큰 클래스를 가지고 있습니다. 이 피자 객체를 상상해보십시오.의사 역방향 작성기 패턴?

그것은 같은 고도로 세분화 된 분야가 있습니다

  • hasPepperoni
  • hasSausage
  • hasBellPeppers

나는이 세 분야에 해당하는 경우, 우리는 최고 피자를 가지고 있음을 알 수있다. 그러나이 클래스는 확장 또는 변경을 위해 열려 있지 않으므로 PizzaType 또는 isSupreme() 등을 추가 할 수 없습니다. 코드베이스의 모든 사람들은 동일한 if(a && b && c) then isSupreme) 로직을 모든 곳에서 복제합니다. 이 문제는 꽤 많은 개념을 다루기 때문에이 객체를 여러 하위 객체로 분해하는 방법을 찾고 있습니다. pseudo-backwards 빌더 패턴.

PizzaType pizzaType = PizzaUnbuilder.buildPizzaType(Pizza); //PizzaType.SUPREME 

Dough dough = PizzaUnbuilder.buildDough(Pizza); 

이 방법이 맞습니까? 이 패턴이 이미 존재합니까?

+0

만족스러운 답변을 얻었습니까? Avid? – Pureferret

답변

3

어댑터 패턴은 어떻습니까?

기본적으로 피자 클래스로 쉽게 이동할 수있는 모든 기능을 갖춘 래퍼 클래스입니다.

MenuPizza myPizza = new MenuPizza(pizza); 
PizzaType pizzaType = myPizza.getPizzaType(); 
DoughType doughType = myPizza.getDoughType(); 

그리고 당신은 반대 기능을 제공 할 수 ...

MenuPizza otherPizza = new MenuPizza(PizzaType.SUPREME, DoughType.SOUR); 
Pizza pizzaPOJO = otherPizza.getPizzaPOJO(); 
+0

나는 또한 단일 책임 원리 모델 [여기] (http://stackoverflow.com/questions/29742523/how-to-follow-single-responsibility-principle-in-my-httpclient-executor)와 관련된 비슷한 질문을 가지고있다. 가능하면저기서 저를 도울 수 있습니까? 어떤 도움이라도 대단히 감사하겠습니다. – john

0

나는이 자바에 존재하지 않는 확장 기능에 대한 좋은 사용 사례가 될 것입니다 생각합니다. 그 대신에 가장 간단한 해결책은 클래스를 생성하고 그 유틸리티 클래스에 확장이 될 메소드를 정적 메소드로 추가하는 것입니다. PizzaUtils.isSupreme(Pizza pizza).