【问题标题】:Aggregate Objects聚合对象
【发布时间】:2010-10-22 22:06:12
【问题描述】:

如果你有一个类 A 是 B 类和 C 类的集合,那么它对 A 更好吗

  • 存储 B 和 C 的 ID
  • 为 B 和 C 加载和存储整个对象(通过引用对象 B/C 进行编辑、存储,即实例化对象 B 和 C,而不是为 B 和 C 存储 id。
  • 存储 ID 并提供提取方法 B 和 C 的方法

我假设这取决于性能要求和其他要求,但我只是在寻找任何一般性指导或想法。

【问题讨论】:

  • 你说的是 COM 聚合吗?
  • “商店”是什么意思。如果您有对象,则不需要 ID,因为您有实例。这个数据库是否相关
  • 好吧,我没有使用 COM,但我正在寻找比与特定语言/对象模型相关的更抽象的答案

标签: oop object aggregation


【解决方案1】:

在内存中运行的典型程序中,对象几乎总是通过引用存储为指针,因此您正在存储 B 和 C 的 ID,只是您不自己处理细节,语言将它们隐藏起来你。

加载和存储“整个对象”是一个有问题的概念。我知道您正在尝试独立于语言,但真正帮助我“获得”面向对象的第一件事是几乎每个对象都应该有自己的生命周期。

如果您有“包含”对象 B 的对象 A,并且您将对对象 B 的引用传递给对象 C,那么对象 A 必须知道有关对象 C 的一些信息,这完全不行。释放对象 B 的生命周期,使对象 A 对对象 C 一无所知,这是使 OO 工作的核心概念之一。

因此,如果这就是您存储整个对象的意思,那么不要——永远不要那样做。

数据库和其他存储也是如此。即使一个对象负责销毁另一个对象,它也应该很少包含其他对象的数据。

而且(虽然我认为您的意思是说“拉取对象 B 和 C”,而不是“方法”),能够从另一个对象传递一个对象的概念也非常有用,而且它通常没有任何问题一个警告:

请记住,对象无法控制自身外部发生的事情。它可以被传递,以半随机顺序调用方法等。因此,尽可能保证对象的安全是有帮助的。如果调用顺序错误,或者传入了一个无效变量,或者你发现你不知何故进入了一个无效状态,提前失败,大声失败,让出错的程序员调用它。

您还希望尽可能难以进入非法状态——这意味着让您的对象保持小而简单,尽可能使变量成为最终变量,并尽量不要有太多参数调用顺序很重要的地方。

【讨论】:

  • 感谢您花时间写这篇文章。
  • 对不起,如果我错过了这个问题。我感觉你指的是一些稍微不同的东西,适用于我不使用的某些特定语言/工具包——所以我觉得我可能偏离了基础。
  • 不,我认为你回答得相当好,很难问出这样的问题并且一清二楚
【解决方案2】:

我倾向于加载和存储整个对象(及其子对象)作为我的默认方法。

有时这会导致加载时间长、内存占用量大或两者兼而有之。然后,您需要确定是否所有加载的对象都已被实际使用,或者是否创建了许多对象但从未访问过。

如果使用了所有对象,则需要一种更具创造性的方法来加载子集、处理这些子集、处置它们,然后加载下一个子集以将所有内容放入内存中 - 或者干脆购买更多内存并将其提供给你的应用程序。

如果许多对象没有被使用,最好的方法是在需要时延迟加载子对象。

【讨论】:

    【解决方案3】:

    这取决于具体情况。如果对象保留在内存中,那么让 A 包含 B 和 C 会更 OO(也更容易)。我发现,如果需要持久化对象,那么 A 存储 ID 会更容易和更有效B 和 C。(这样如果您需要 A 中的数据而不需要 B 和 C 中的数据,则不必将 B 和 C 从数据库、文件等中拉出)

    【讨论】:

      【解决方案4】:

      视情况而定,

      如果 B 和 C 很重且加载和构建成本很高,则可能值得推迟加载它们,直到您确定需要它们(延迟初始化)。

      如果它们简单且轻量级,也许您只想在任何时候构建它们,您会得到 Id。

      【讨论】:

        猜你喜欢
        • 2015-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-22
        • 2011-12-14
        • 2015-02-19
        • 2021-06-21
        相关资源
        最近更新 更多