stepan_sib
@stepan_sib
head, hands, hard working, contracts

Как правильно порождать объекты?

Всем доброго вечера!

Итак, вопрос, который мучает меня уже относительно давно, но ответ так и не найден.
Пример, есть две сущности: Transport и Wheel. (Транспорт и Колесо)
Между ними установлена связь: один-ко-многим, т.е. у одного транспортного средства может быть много колес.

Как правильней порождать новые Wheel?
По идее, я могу генерировать новый объект Wheel:
  1. Обычными вызовам
    $wheel = new Wheel();
    И далее выставлять все свойства вручную
  2. Через фабрику как сервис, например, /model/WheelFactory
    $wheel = $wheelFactory->createWheel($someKindOfTransport);
  3. Через реализацию метода createWheel в классе Transport
    $car = new Transport();
    $wheel = $car->createWheel();

Вопрос - как логичней это делать? Учитывая то, что в сущности Wheel по-умолчанию нужно установить нек-рые параметры, к-рые зависят от параметров родителя, т.е. сущности Transport.

Согласно паттерну Creator из принципов GRASP, объект Transport является контейнером для коллекции объектов Wheel и обладает данными для их инициализации.
Соответственно, третий вариант подходит как никогда более. Не пересекается ли он с какими-либо бэст практисес или иными подхдами?
  • Вопрос задан
  • 530 просмотров
Пригласить эксперта
Ответы на вопрос 1
27cm
@27cm
TODO: Написать статус
1. Норм.
2. Норм.
3. Плохо, транспорт не должен создавать колёса.

Вопрос - как логичней это делать? Учитывая то, что в сущности Wheel по-умолчанию нужно установить нек-рые параметры, к-рые зависят от параметров родителя, т.е. сущности Transport.


Сперва создаёте колесо (через new или через фабрику, как удобнее) и настраиваете параметры, не зависящие от транспорта:
$wheel = new Wheel();

Затем добавляете колесо к транспорту:
$transport->addWheel($wheel);

Параметры Wheel, которые зависят от Transport, определяются в методе Transport::addWheel() или Wheel::setTransport():
public function addWheel(Wheel $wheel)
{
    $wheel->setTransport($this);
    $this->getWheelsCollection()->add($wheel);
}
Ответ написан
Ваш ответ на вопрос

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

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