Пока что большинство объектов, с которыми я имел дело, очень похоже на таблицы базы данных, на которых они основаны.Итак, у меня есть объект 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) я должен пытаться реализовать?