对象关系

时间:2009-06-09 11:35:00

标签: language-agnostic oop

假设你有两个对象,Person和Address并且它们有一个关系,那就是Person有一个地址。显然person对象有一个对地址对象的引用,但地址对象是否真的必须知道Person对象?是什么赋予它必须是一种双向关系?

谢谢!

9 个答案:

答案 0 :(得分:2)

在这种情况下,看起来你的Address对象不需要与Person对象有关系。

作为一项规则,您可以考虑一个对象是否“需要知道”另一个对象才能工作。一个人需要知道它的地址,而一个地址不需要知道它所属的人。

“需要知道”这里反映了在方法中与对象进行交互的必要性。

答案 1 :(得分:1)

这一切都取决于对象的使用。如果您遇到必须携带地址并展示(或使用)其人(或多人)的情况,那将是双向关系。但是如果你永远不需要访问给定地址的人,那么你就不需要双向关系了。

其他示例:如果这些对象与数据库表关联,并且这些表具有关系(比如Person.id == Address.IdPerson),那么在类中进行插入和更新的双向关系将非常有用。

答案 2 :(得分:1)

我能想到的唯一一种情况是,如果你有一个地址的外部引用,你想知道谁住在那里,这将是有益的。即便如此,我认为一个单独的关联数据结构映射地址 - >人是一个更好的设计。

除此之外,在你描述的关系中,没有理由它必须是双向关系。没有规则说地址需要引用一个人。

答案 3 :(得分:1)

他们认为我的对象依赖是否存在属性。所以在这个特定的场景中,Person 依赖在一个地址上,因此它需要知道地址细节。另一方面,地址不是依赖,因此可以在不知道该人的情况下存在。

如果您需要通过地址访问此人,我建议您在地址对象中实现一个可以调用的函数,该函数将检索与该特定地址相关的人员。

詹姆斯。

答案 4 :(得分:0)

在我看来,Address对象根本不知道Person对象 如果确实如此,则会将coupling引导至系统 如果您必须通过它的地址找到一个人,您可以创建一个Pepole contianer,它具有一个按地址搜索的查找方法。

答案 5 :(得分:0)

地址不必知道人的存在,我认为这不是现实世界中的逻辑:地址只是一组信息(比如街道,城镇等),它可以被一封信或一个人,但在每种情况下,它仍然保持原样,不知道它的周围环境。 它应该只关心与他严格相关的信息。

答案 6 :(得分:0)

  

是什么让它必须是双向的   关系?

我能想出的唯一一件事是,如果你处于急需缓存,地址就会知道其他对象。假设您有某种形式的应用程序,一直在进行搜索。但这就是它。

答案 7 :(得分:0)

此问题的复杂性取决于业务领域和地址的含义。在大多数系统中,这被简化为一个人对象,他与地址对象有关系,代表他们留在哪里,如果两个人住在同一个地址,他们的地址将被复制。

如果您想拥有更复杂的真实世界模型,请考虑将术语更改为位置(甚至可以在空间上表示)。

考虑

  • 一个人可能与零个或多个地点有关(考虑夏季和冬季住所)
  • 无论是否有与之相关的人员,都存在位置
  • 如果一个人搬家,请考虑改变关系(过去常住)而不是位置。这为未来提供了很大的灵活性
  • 多人可以与同一位置相关联。这使得找到目前(或以前)住在某个地点的每个人都非常简单

存储位置和关系提供了极大的灵活性,但它带来了开销,因此您需要确定您的设计是否需要这种灵活性。

答案 8 :(得分:0)

在这种情况下,我将首先定义一个包含人员列表和地址列表的根对象。允许每个人和地址访问此根(父)对象。每个Person对象还包含一个指向地址的链接。要查找居住在该地点的所有人的地址,我会转到根对象并过滤所有链接到该地址的人员的人员列表。

但如果一个人住在两个地址怎么办?或者没有地址? : - )

顺便说一下,如果您使用root / parent类,那么您可以创建一个链接到“Parent”的基类“Child”,并从该子类继承“Person”和“Address”。

相关问题