【问题标题】:Object Composition - Should a Constituent Know the Composing Object?对象组合 - 成分是否应该知道组合对象?
【发布时间】:2016-12-29 22:15:24
【问题描述】:

我正在构建一个包含报告的应用程序,每个报告都包含多个结果。这绝对是报表和结果之间的HAS-A组合类型关系。

我的问题是:结果是否应该知道它属于哪个报告?

方法 A(结果不知道它属于哪个报告):

Report:
    name
    id
    results[]


Result:
    value
    type
    id

方法 B(结果知道它属于哪个报告,但报告不包含结果):

Report:
    name
    id

Result:
    value
    type
    id
    report_id

【问题讨论】:

  • 这完全取决于您的域,因此社区无法回答。
  • 我要补充一点,它还取决于我们正在谈论的对象模型的类型 - 业务模型?演示模型 ?持久性模型 ?可以修改对象吗?等等。

标签: oop design-patterns aggregation composition


【解决方案1】:

我认为用给出的信息来回答这个问题是不可能的,所以我们不要直接回答,而是看看可能影响决定的事情:

你需要反向引用吗?显然,如果你不需要它,就不要创建它。如果您确实需要它,但您仍然可以使用某种存储库查找来替换它,例如:ReportRepository.findReport(Result)

反向引用的成本与没有反向引用的成本是多少?如果您包含反向引用,如果所有权发生变化(在您的情况下可能不会发生),两个引用需要保持同步。如果您没有反向引用但需要朝这个方向导航,则必须跳过额外的障碍。当保持双向关系时,JPA 映射之类的事情变得更加复杂。当您需要以某种方式序列化结果时,同样的事情可能适用。

查看Aggregate pattern from DDD 可能也是值得的,尽管它似乎不适用于您的情况。

【讨论】:

  • 当关联是双向时,您需要在引用之间进行同步是对的,但在 OP 的示例中似乎并非如此。
  • @guillaume31 这就是为什么我写“在你的情况下可能不会发生”
  • 然而,您似乎在谈论所有权变更的可能性很小,而不是存在双向关系的可能性很小......
猜你喜欢
  • 2011-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多