我什么时候应该使用属性而不是对象引用?

时间:2009-12-12 11:52:48

标签: class-design

例如,如果我有一个Author类和一个book类独立。我们都知道作者会写一本书。

我最想知道什么时候最好将这本书作为参考对象包含在作者类中,或者只包括书名?

此问题的原因主要与灵活性易于维护有关。

更新

我应该阅读哪些与此类问题相关的设计模式?

8 个答案:

答案 0 :(得分:2)

我通常会存储对该书的引用,因此可以从作者那里轻松访问该书籍对象。如果在此方案中存储属性(名称),则会出现以下问题:

  1. 这个名字是唯一的吗?
  2. 从作者那里检索图书是否代价高昂(例如,您是否必须访问数据库)?
  3. 如果您不希望整本书籍对象在内存中(可能存储所有书籍的所有作者都会消耗大量资源),那么您可能想要一本书中提到的占位符对象类。该占位符将存储该书的唯一键,并可根据需要检索该书。它可以实现书籍界面,因此与真实书籍无法区分。缺点是该书仍然需要在信息请求之前或之前填充。

答案 1 :(得分:1)

这个名字是一个非常糟糕的主意;两本不同的书很可能拥有相同的标题。

我会使用对象引用(当然,在某种集合中,因为作者可以编写多本书) - 这就是它们的用途。这当然是灵活和可维护的。

可能会出现导致问题的特殊情况,只有这样我才能考虑保留某种独特的身份证明(如果是书籍,ISBN将是主要候选人),而不是参考。

答案 2 :(得分:1)

这取决于作者是否需要访问超出标题的书籍信息。如果真的没有,那么好吧也许你只需要标题作为字符串。但是,如果可能需要其他书籍信息,您需要考虑如何访问它。在这种情况下,使用书类可能是有意义的。

答案 3 :(得分:1)

如果一本书有很多作者,那么将书名称放在作者对象中会产生重复。如果您需要修改图书名称,那么您将需要浏览所有作者集合以确定您需要更改的位置。

让所有作者引用一个书籍对象非常简单。只需在一个地方更改书名即可。

In do not think易于维护或灵活的结构与不需要的重复。

编辑:通过复制名称,您也可以解决不一致问题。试想一下,如果一本书的标题(有两位作者)只为一位作者修改了它的名字会发生什么。

答案 4 :(得分:0)

这取决于您想要对信息做什么。有时候,您可能更容易将书名列表存储在作者中,有时您可能需要完整的书籍信息(ISBN,出版商等)。

在数据库中,您将拥有一个包含所有详细信息的Author表,以及一本包含该书详细信息的书籍表,然后可能是一个多对多关系表,用于将书籍与作者联系起来,反之亦然。< / p>


哦,属性/对象引用并不是真正相互排斥的。属性可以是对象引用。这听起来更像是在询问您是否应该存储完整的对象信息,或者只是存储您可能需要的信息。

答案 5 :(得分:0)

选项B.避免使用这样的引用 - 它会很快将程序变成一堆依赖项。保持这两个概念是独立的,如果需要,可以在两者之间建立一些高阶抽象。

你的问题是一个复杂的传奇故事的一部分,被称为“对象 - 关系映射”,在网络上有很多关于设计模式的材料。

答案 6 :(得分:0)

面向对象,每个对象都引用了最好的朋友 - 而不是他们的名字。它有一些缺点,例如:很难跟踪反向引用。

然而,问题需要比最佳实践模式更通用的解决方案。

只要您使用OO来设计应用程序,我就会选择保持一致并直接引用您的对象。

答案 7 :(得分:0)

这实际上取决于您的域名。大多数书店数据库在书籍之间的作者名称之间存在一些差异,并且没有关于给定名称是否由多个作者共享的信息。因此,一本书将有一个作者姓名列表,并且没有对象标识映射到该数据。

另一方面,如果您的域名是出版社,您非常清楚哪个作者John Smith(客户编号19024982),J。Henry Smith(客户编号19024982)和John Smith(客户编号773829) )是相同或不同的作者,以及这两位作者创作的书籍,因此使用对象参考作者和书籍身份将是一个良好的域映射。