Какой шаблон дизайна подходит для этой ситуации? - PullRequest
3 голосов
/ 31 августа 2011

Пока что большинство объектов, с которыми я имел дело, очень похоже на таблицы базы данных, на которых они основаны.Итак, у меня есть объект fish, который отображает таблицу db.fish, и объект fish_transfer, который отображает таблицу db.fish_transfer и т. Д.

Теперь я работаю над классом Provenance, который управляет данными, которые нене легко сопоставить с одной таблицей базы данных.Вот ситуация:

Каждая рыба имеет происхождение, то есть информацию о том, где она находилась до того, как попала в нашу систему.Существует 4 вида происхождения: «неизвестно», «доставлено», «разведено на месте», «повторно использовано».У всех происхождений есть fish_id и связанная дата, и все, кроме 'bred onsite', требуют, чтобы счет был установлен немедленно.Кроме этого, они довольно сильно отличаются в данных, связанных с ними, и действиях, которые должны произойти при их создании / удалении или изменении.

Я думал сохранить тип провенанса в объекте fish.Таким образом, при создании экземпляра fish вызовет ProvenanceFactory::make($this->fish_id, $this->ptype) и получит объект происхождения $prov правильного подкласса.Так что же произойдет, если тип провенанса отредактирован?

Возможности:

  • вызов $this->prov->delete(), а затем $this->prov=ProvenanceFactory::make($this->fish_id, $newtype); $this->prov->setall($data);
  • вызов ProvenanceFactory::morph(&$this->prov,$newtype); $this->prov->setall($data);
  • вызов $this->prov->morph($newtype); $this->prov->setall($data);
  • вызов $this->prov->morph($newtype, $data);
  • ??

Во всех случаях редактирование типа провенанса приводит к обновлению или удалению наборастроки базы данных в различных таблицах, относящихся к подклассу Provenance, а затем создание другого набора строк в различных других таблицах.

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

Ответы [ 2 ]

1 голос
/ 31 августа 2011

как насчет класса ProvenanceBase, который имеет конструктор копирования.
Таким образом, ваша фабрика может иметь метод morph (похожий на 2-й маркер, который вы написали), который просто создает новый производный объект из существующего производного объекта.

0 голосов
/ 31 августа 2011

Я не хочу предлагать переназначить все, что вы сделали, однако рассматривали ли вы возможность использования наследования таблиц классов.

См .: http://martinfowler.com/eaaCatalog/classTableInheritance.html

Итак, в вашем примере ваша таблица Provenance, и вы можете использовать колонку дискриминатора для определения состояния класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...