Шаблон псевдо-обратного строителя?

В устаревшей кодовой базе у меня очень большой класс со слишком большим количеством полей/обязанностей. Представьте, что это объект Pizza.

Он имеет очень детализированные поля, такие как:

  • имеетПепперони
  • имеетколбаса
  • имеетBellPeppers

Я знаю, что когда эти три поля соответствуют действительности, у нас есть пицца Supreme. Однако этот класс не открыт для расширения или изменения, поэтому я не могу добавить PizzaType или isSupreme() и т. д. Люди в кодовой базе дублируют одну и ту же логику if(a && b && c) then isSupreme) повсюду. Эта проблема возникает для довольно многих концепций, поэтому я ищу способ разбить этот объект на множество подобъектов, например. псевдо-обратный шаблон Builder.

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

Dough dough = PizzaUnbuilder.buildDough(Pizza);

Это правильный подход? Этот шаблон уже существует?


person Avid Aardvark    schedule 29.04.2010    source источник
comment
Ты когда-нибудь получал удовлетворительный ответ, Авид?   -  person Pureferret    schedule 24.07.2012


Ответы (2)


Как насчет шаблона адаптера?

По сути, это класс-оболочка, который имеет все функции, которые вам действительно нужны, и может легко переходить туда и обратно к классу Pizza.

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();
person Tim Bender    schedule 29.04.2010
comment
У меня также есть аналогичный вопрос, связанный с моделью принципа единой ответственности здесь . Если возможно, не могли бы вы помочь мне там. Любая помощь будет оценена. - person john; 21.04.2015

Я думаю, что это был бы отличный вариант использования функций расширения, которых нет в java. Вместо этого самым простым решением, на мой взгляд, является создание класса и добавление методов, которые будут расширениями, в этот служебный класс в качестве статических методов; PizzaUtils.isSupreme(Pizza pizza).

person Charles Durham    schedule 02.08.2017