【问题标题】:Which design pattern suits this situation?哪种设计模式适合这种情况?
【发布时间】:2023-03-10 17:08:01
【问题描述】:

到目前为止,我一直在处理的大多数对象看起来都非常类似于它们所基于的数据库表。所以我有一个映射 db.fish 表的 fish 对象和一个映射 db.fish_transfer 表的 fish_transfer 对象等。

现在我正在研究一个类Provenance,它管理不容易映射到单个数据库表的数据。情况如下:

每条鱼都有一个出处,即关于它在进入我们系统之前的位置的信息。有 4 种来源:“未知”、“交付”、“现场培育”、“重复使用”。所有出处都有一个 fish_id 和一个相关的日期,除了“现场繁殖”之外的所有来源都需要立即设置计数。除此之外,它们在与之关联的数据以及在创建/删除或更改时必须执行的操作方面存在很大差异。

我曾想过将出处类型存储在 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 除外)?

【问题讨论】:

  • 将其视为一系列问题可能会有所帮助:1.如何在域模型中表示实体Provenance, delivered`等? 2.如何在数据库中表示那些实体? 3.如何同步两个表示之间的变化?问题1和2其实是相互独立的,可以分开考虑。

标签: php oop design-patterns


【解决方案1】:

拥有一个 ProvenanceBase 类怎么样,它有一个复制构造函数。
这样,您的工厂可以有一个 morph 方法(类似于您编写的第二个项目符号),它只是从现有的 派生 对象创建一个新的 派生 对象。

【讨论】:

  • 复制构造函数中有所有与数据库相关的逻辑吗?我是唯一觉得危险的人吗? :)
  • 为什么在地狱你的模型层会有任何与数据库相关的逻辑????我从来没有说过这样的话!!该死,我希望我知道如何在这里制作东西,甚至 更大胆...
  • 好吧,如果你确实有一些数据库抽象层或 ORM - 你肯定不需要模型层中的任何数据库相关逻辑 - 它由 ORM/DBAL 管理。但是没有提到有关 DBAL 或 ORM 的问题。那么,您认为与数据库相关的逻辑在哪里? :)
  • 如果你需要数据库逻辑代码——你需要一个 DAL。如果没有数据访问层,那么比继承/工厂等问题要大得多。
【解决方案2】:

我不想建议重新映射您所做的一切,但是您是否考虑过使用类表继承。

见:http://martinfowler.com/eaaCatalog/classTableInheritance.html

因此,在您的示例中,您的 Provenance 表,您可以使用您的鉴别器列来识别该类处于哪个状态。

【讨论】:

  • 我确实考虑过。但是Provenance 表基本上由fish_idtypedate 组成。 Provenance 的各个子类必须处理的所有其他数据都在其他表中,并由其他类建模。因此,例如,Prov_Reuse 有一个 Fish_Transfer 对象,其中包含 fish_transfer 表中的日期和计数以及各种其他信息,但 Prov_BredOnsite 有一个 Cross 对象。
猜你喜欢
  • 2012-10-29
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多