2009-04-30 90 views
1

如果你有一个A类即类B和C的集合体,是它为更好甲聚合对象

  • 存储ID,用于B和C
  • 加载和存储整个对象B和C(编辑,通过参考存储到对象B/C,即实例化对象B和C相对于存储的ID为B和C.
  • 商店的ID和提供的方法来拉方法B和C

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

+0

你在说COM聚合吗? – dirkgently 2009-04-30 17:00:46

+0

“商店”是什么意思。如果你有对象,你不需要ID,因为你有实例。这个数据库相关 – 2009-04-30 17:02:07

回答

3

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

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

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

所以,如果这就是你的意思是通过存储整个对象,那么不 - 不要这样做。

数据库和其他存储也是如此。即使一个对象负责销毁另一个对象,它也很少包含其他对象的数据。(虽然我认为你的意思是说“拉对象B和C”,而不是“方法”),但是能够从另一个对象传递对象的概念也非常有用,并且通常没有任何问题有一个注意事项:

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

你也想尽可能地让它进入一个非法的状态 - 这意味着保持你的对象小而简单,尽可能使得变量最终,并尽量不要让参数调用顺序很重要的地方太多。

1

这取决于具体情况。如果这些对象留在内存中,那么让A包含B和C就更有OO了(并且更容易)。但是,我发现如果对象需要被持久化,它使A更容易和更高效地存储ID B和C.(如果你需要直接在A而非B和C中的数据,这样,你就不必拉B和C移出数据库,文件等)

1

这取决于

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

如果它们很简单,很轻便,也许你只是想在每次构建它们,你会得到Ids。

2

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

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

如果使用的所有对象,更具创意的方式,将需要加载一个子集,处理这些,处理它们,然后加载下一个子集,以适应一切到内存中 - 或者干脆买更多的内存,并使其可到您的应用程序。

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