Как я могу быть уверенным, что подкласс задает свойство (обязательное) в его конструкторе?

У меня есть базовый класс ProductRepository, и есть другие классы, которые его расширяют; таких как PushProductRepository или SocialProductRepository.

class ProductRepository implements ProductRepositoryInterface
{
    private $product;

    public function __construct(Product $product)
    {
        $this->product = $product;
    }

    public function create($name, $language, $type)
    {
        $this->product->create([
            'name' => $name,
            'language' => $language,
            'type' => $type
        ]);
    }
}

Как вы видите, в функции create есть параметр type . Это могут быть такие ценности, как «толчок» или «социальный». Он будет принимать значение из классов, которые его расширят. Вместо отправки его в качестве параметра; Я хочу иметь другой подход. Я создам свойство в ProductRepository, например тип, и использую $ this-> type в функции create.

Но я хочу быть уверенным, что каждый класс, который расширяет ProductRepository, должен установить это свойство в своем собственном классе (возможно, в его конструкторе)

Как я могу быть уверенным, что каждый класс, который расширяет ProductRepository, будет устанавливать тип в его конструкторе? Есть ли лучший способ достичь этого? Это что-то нарушает? Если это так, как я могу предотвратить это?

3 голоса | спросил Bold P. 27 WedEurope/Moscow2017-12-27T17:38:51+03:00Europe/Moscow12bEurope/MoscowWed, 27 Dec 2017 17:38:51 +0300 2017, 17:38:51

1 ответ


3

Не вникая в хороший или плохой подход и просто отвечая на вопрос how?, я бы сделал ProductRepository, с абстрактным методом getType(). Таким образом, это будет выглядеть следующим образом:

abstract class ProductRepository
{
    private $product;

    public function __construct(Product $product)
    {
        $this->product = $product;
    }

    public function create($name, $language, $type)
    {
        $this->product->create([
            'name' => $name,
            'language' => $language,
            'type' => $this->getType()
        ]);
    }

    abstract protected function getType();
}

Насколько я могу судить, тип имеет какое-то отношение к самому продукту, то есть к домену, поэтому я буду препятствовать построению этой логики в репозитории. Как насчет создания продукта с определенным свойством type? Для меня это выглядит более чистым - по крайней мере, доменная логика находится в домене. И я не понимаю, почему метод create принадлежит product. Вероятно, вы должны иметь ProductRepository, который выглядит так:

class ProductRepository
{
    private $dataStorage;

    public function __construct(DataStorage $dataStorage)
    {
        $this->dataStorage = $dataStorage;
    }

    public function add(Product $product)
    {
        $this->dataStorage
            ->insert(
                $product->getName(),
                $product->getLanguage(),
                $product->getType()
            )
        ;
    }
}
ответил Zapadlo 27 WedEurope/Moscow2017-12-27T17:59:42+03:00Europe/Moscow12bEurope/MoscowWed, 27 Dec 2017 17:59:42 +0300 2017, 17:59:42

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132