【问题标题】:UML and Implementation: Associating Classes through IDsUML 和实现:通过 ID 关联类
【发布时间】:2016-01-07 19:16:33
【问题描述】:

我最近正在学习一门在线课程。建议为了减少耦合,我们可以简单地将 ID 从客户对象传递给 Order 对象。这样,Order 就不必完整引用 Customer 类。

这个想法当然看起来很简单,如果你不需要它的所有属性,为什么要传递整个对象呢?

1) 你觉得这个想法怎么样? 2)如果只传递一个ID,我将如何在UML中表达Customer类和Order类之间的关系。这不仅仅是聚合的一个例子吗?组合和聚合不只需要传递一个值吗?

谢谢!

【问题讨论】:

  • 1) 订单需要对 Customer 对象做什么? 2)你用UML做什么?是记录域模型吗?是用来生成代码的吗?

标签: uml aggregation composition


【解决方案1】:

首先,您需要清楚 UML 究竟是什么。一方面你有一个想法,另一方面有一些代码硬件上运行。理想情况下,后者以一种为idea 的用户带来附加价值的方式支持第一个。现在,描述从ideacode方式有很多可能性。 UML 就是其中之一。可以用这种方式 描述每个步骤,但出于实用的原因,UML 停留在代码 的边界,即编程语言。

现在给你一个具体的问题:任何对象都可以被视为一个实例。那是一些具有固定地址的具体内存分区。编程语言通过分配内存和使用起始地址作为参考来实现实例。并且由于这个引用不会改变对象,所以可以通过它的地址来识别。显然,关联将只是一个指针。并且一个关联类将持有两个(或更多)这样的指针。

老实说,当我第一次开始使用 OO 时,我也很困惑,并认为传递那些大对象是浪费资源。但是由于它只是一个指针,所以它真的很容易。

同样,如果您需要持久化对象,事情会变得更加困难。在这种情况下,您需要一个可以与对象一起保存的人工密钥,并且您可能需要将人工密钥映射到具体实例地址的表。

【讨论】:

    【解决方案2】:

    这个问题的答案取决于许多因素,我开始在附在您问题的评论中列出这些因素。我将假设您正在使用 UML 创建域模型,或者您正在描述使用静态类型语言完成的实现。

    如果您使用 UML 创建域模型,那么当您使用 ID 来“链接”类时,就会混淆语义。只需绘制并注释关联即可。

    如果您描述的是使用静态类型语言完成的实现 - 类型的存在是有原因的。使用通用 ID 链接事物意味着系统最需要的信息变得更加间接,因此更加不透明(这很糟糕)。在您的情况下,Order 对象仍然必须获取对 Customer 对象的类型化引用才能对其执行任何操作。

    例如,Order 可以通过按 ID 调用查找来获取对 Customer 的引用,但 它必须将引用转换为适当的类型才能调用 Customer 对象上的任何内容。所以你没有减少从订单到客户的耦合。你只是把它埋在别的地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 1970-01-01
      • 2019-04-15
      相关资源
      最近更新 更多