1

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

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

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

4

4 回答 4

3

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

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

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

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

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

而且(尽管我认为您的意思是说“拉对象 B 和 C”,而不是“方法”),能够从另一个对象传递一个对象的概念也非常有用,并且通常没有任何问题需要注意:

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

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

于 2009-04-30T17:27:13.537 回答
2

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

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

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

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

于 2009-04-30T17:15:48.417 回答
1

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

于 2009-04-30T17:05:09.643 回答
1

这取决于,

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

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

于 2009-04-30T17:07:29.607 回答