【问题标题】:OOP Value Objects and Entities in the same class同一类中的 OOP 值对象和实体
【发布时间】:2010-07-29 15:04:43
【问题描述】:

我正在将一个旧的过程式 PHP 网站重构为一个美味的 OOP 应用程序,并添加了少量的领域驱动设计以增加风味。

我经常遇到一些情况,即我需要可以有子类的类,这些子类可以是实体或值对象。

例如一个 url 对象。那里有无数的网址,所以它们都不能真正成为实体。但有些是非常特殊的 url,比如我的主页。那是一个实体。

另一个例子是“配置对象”。我想要一些配置有身份,这样我就可以创建“预设”并通过在线控制面板管理它们。对于那些需要查找器/存储库来找到它们,并且需要 ORM 来管理它们的生命周期。但是,对于其他“非预设”(具有相同的类层次结构),我希望能够使用动态定制且不需要持久化的数据加载它们。

我设想了很多:

class factory { 
 reconstitute($rawdata) {
  if (raw data has identity)
   load up and return entity version of the class 
  else
   load up and return anonymous/value object version of the class

这一切似乎有点奇怪。

是否有任何模式可以讨论处理此问题的最佳方法?

【问题讨论】:

    标签: oop dns domain-driven-design entities value-objects


    【解决方案1】:

    我不确定我是否完全理解你的场景,但是……这真的很重要吗? 根据我对 EFs/ORMs 的经验,做你想做的事情的最好方法(我能想到的)是让你的实体类根据定义的业务规则决定是否从数据库中加载/持久化自身在课堂上。

    $url = new URLClass('KEY_DATA') // returns loaded object url if key if found in database
    $url = new URLClass() // returns new url object
    $url = new URLClass('', '110011000110010001000011101010010100') // returns new url with data loaded from raw data
    

    不确定这是否真的对你有帮助,或者它是否适用。

    【讨论】:

    • 好的,谢谢。那很有帮助。我一直痴迷于让我的实体类放弃任何在没有 id 的情况下创建它们的尝试(否则我看不出它们如何与“身份映射”(PoEAA)一起工作)。所以,我猜你是说放宽这一点,让对象在没有身份的情况下存在——这将解决当前的问题。
    • 是的,我就是这么说的。我经常创建一个可持久类的实例,而无意持久化数据。有些人会争辩说它引入了不必要的开销(这是真的),但有时它并没有那么重要。我还使用过一些使用持久层和哑对象的框架。您不会使用这种方法增加任何额外的开销,您的问题仍然会得到解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 2013-08-03
    相关资源
    最近更新 更多