聚合对象

时间:2009-04-30 16:58:51

标签: oop object aggregation

如果您的A类是B类和C类的聚合,那么A

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

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

4 个答案:

答案 0 :(得分:3)

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

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

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

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

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

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

请记住,对象无法控制外部发生的事情。它可以传递,以半随机顺序调用的方法等。因此,保持对象尽可能安全是有帮助的。如果以错误的顺序调用某些内容,或者传入了无效的变量,或者您发现某种程度上您已进入无效状态,请提前失败并使LOUD失败,以便制作错误的程序员调用它。

您还希望尽可能地使其陷入非法状态 - 这意味着保持您的对象小而简单,尽可能使变量最终,并尽量不要让参数调用顺序过多的地方。< / p>

答案 1 :(得分:2)

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

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

如果使用了所有对象,则需要更有创意的方法来加载子集,处理它们,处理它们,然后加载下一个子集以使所有内容适合内存 - 或者只是购买更多内存并使其可用于你的应用。

如果不使用许多对象,最好的方法是在需要时懒洋洋地加载子对象。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

取决于,

如果B和C很重并且需要加载和构建,那么推迟加载它们可能是值得的,直到你确定需要它们为止(Lazy Initialize)。

如果它们简单轻巧,你可能只想构建它们,你就得到了它们。