哪种设计模式适用于这种情况?

3
到目前为止,我所处理的大部分对象看起来非常像它们所基于的数据库表。因此,我有一个映射db.fish表的fish对象和一个映射db.fish_transfer表的fish_transfer对象等等。
现在我正在开发一个名为Provenance的类,用于管理不易映射到单个数据库表的数据。以下是情况:
每条鱼都有一个来源,即关于它进入我们系统之前的信息。有4种来源:未知、交付、现场繁殖、重复使用。所有来源都与fish_id和日期相关联,除了“现场繁殖”外,所有来源都需要立即设置计数。除此之外,在它们创建/删除或更改时,它们在关联的数据和操作方面都有很大不同。
我曾想将来源类型存储在fish对象中。因此,在实例化时,fish将调用ProvenanceFactory::make($this->fish_id, $this->ptype)并获取一个正确子类的provenance对象$prov。那么如果编辑了来源类型会发生什么呢?
可能性如下:
1. 调用$this->prov->delete(),然后调用ProvenanceFactory::make($this->fish_id, $newtype); $this->prov->setall($data);
2. 调用ProvenanceFactory::morph(&$this->prov,$newtype); $this->prov->setall($data);
3. 调用$this->prov->morph($newtype); $this->prov->setall($data);
4. 调用$this->prov->morph($newtype, $data);
5. ??
在所有情况下,编辑来源类型都会导致更新或删除特定于Provenance子类的各种表中的一组数据库行,然后在各种其他表中创建另一组行。
哪种上述可能性(或其他)是最好的选择?我应该尝试实现哪些设计模式(除了工厂模式)?

这是关于编程的内容,以下是翻译:可以将其视为一系列问题:1.如何在领域模型中表示实体“Provenance”,“delivered”等?2.如何在数据库中表示这些实体?3.如何在两个表示之间同步更改?问题1和2实际上是相互独立的,可以分别考虑。 - J. Ed
2个回答

1
如何创建一个具有复制构造函数的ProvenanceBase类呢?这样,您的工厂就可以拥有一个变形方法(类似于您所写的第二个要点),该方法只需从现有的派生对象中创建一个新的派生对象即可。

把所有与数据库相关的逻辑都放在复制构造函数中?难道我是唯一一个觉得这很危险的人吗? :) - J0HN
你为什么会在你的模型层中有任何与数据库相关的逻辑???我从未说过这样的话!!该死,我希望我知道如何使这里的东西更加粗体... - J. Ed
如果您有一些数据库抽象层或ORM,那么您肯定不需要在模型层中编写任何与数据库相关的逻辑 - 这由ORM / DBAL管理。但是问题中没有提到DBAL或ORM。那么,你从哪里想到数据库相关的逻辑呢? :) - J0HN
如果你需要数据库逻辑代码,你需要一个数据访问层(DAL)。如果没有数据访问层,那么继承/工厂等问题就不是最大的问题了。 - J. Ed

0

我确实考虑过这个问题。但是,“Provenance”表基本上由“fish_id”,“type”和“date”组成。各种“Provenance”子类必须处理的所有其他数据都在其他表中,并由其他类建模。例如,“Prov_Reuse”有一个“Fish_Transfer”对象,其中包含来自“fish_transfer”表的日期、计数和各种其他信息,但是“Prov_BredOnsite”则使用“Cross”对象。 - dnagirl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接