Как «красиво» проинициализировать свойство объекта?

Заранее извиняюсь за глупый вопрос, но меня терзают смутные сомнения что я делаю что-то не так, есть такой случай:
class Product {
         //Some properties
        //....

         //  \Models\OptionsInterface
         protected $options;

          //  \Models\PriceInterface
         protected $price;

         protected $type;         

         public function setOptions($options) 
         {
                if($this->type == ...some_condition_a && ...next_condition_a...)
                {
                     $this->options = $this->factory->make('OptionsA', $options);
                }
                elseif($this->type == ...some_condition_b &&  ...next_condition_b ..)
                {
                     //Some options logic
                     $options = ....
                     $this->options =  $this->factory->make('OptionsB', $options);
                }
                //Также объект может и не иметь опций, в этом случае
               //$this->options = null по-дефолту
         }

         public function setPrice($price)
         {
                $this->price = $this->factory->make('Price', $price);
         }
}


class ConcreteProduct extends Product {
    
         public function setOptions($options) 
         {
                if($this->type == ...some_condition_a && ...next_condition_a...)
                {
                     //Some options logic
                     $options = ....
                     $this->options = $this->factory->make('ConcreteOptionsA', $options);
                }
                elseif($this->type == ...some_condition_b && ...next_condition_b...)
                {
                     //Some options logic
                     $options = ....
                     $this->options =  $this->factory->make('ConcreteOptionsB', $options);
                }
         }

          public function setPrice($price) 
          {
                if($this->type == ...some_condition_a)
                {
                      //Some price logic
                     $price = ... 
                     $this->price = $this->factory->make('ConcretePriceA', $price);
                }
                elseif($this->type == ...some_condition_b)
                {
                     $this->price = $this->factory->make('ConcretePriceB', $price);
                }
                else
                {
                      $this->price = $this->factory->make('Price', $price);
                }
         }
}

//Работа с объектом осуществляется в таком роде
$product = new ConcreteProduct();
$product->setOptions($data['options']);
$product->setPrice($data['price']);


Проблема заключается в инициализации свойства $options и $price, количество наследников Product и типов $type может в будущем увеличиться, в следствии чего свойство $options будет иметь множество реализаций. Плодить наследников Product по типам также не очень хочется, как и городить кучу ветвлений. Есть идея создать фабрику для опций, но вот как описать логику выбора нужного класса... еще есть идея создать билдер для продуктов в зависимости от типа, но тут тоже есть сомнения...уже совсем запутался((

Заранее большое спасибо))
  • Вопрос задан
  • 279 просмотров
Пригласить эксперта
Ответы на вопрос 1
Adamos
@Adamos
Просто реализуйте $options и $price отдельными классами.
В Product добавьте члены соответствующих классов и в Product используйте только их обобщенную логику. Все, что может различаться - внутрь самих классов.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы