【问题标题】:Class Diagram Multiplicity and Dependency implementation类图多重性和依赖实现
【发布时间】:2021-01-07 13:58:54
【问题描述】:

我目前正在学习创建uml图,尤其是类图,在理解一些概念的过程中遇到了一些多重困难,这里是问题

  1. 多重性总是2面的吗?就像当我有这个类时,PP 类是买家类,而 Cart 是保存买家订单信息的类,我分配 1 - 1 的多重性,因为 1 个买家总是有 1 个购物车,反之亦然,在 Cart 中明确定义(在我的代码中)我有一个类型为 PP 的变量,但在类 PP 中根本没有购物车变量,所以多重性错误吗?我应该只在 PP 中分配 1 边多重性,而在购物车中没有吗?还是在类中拥有变量并不重要?我对理解这一点感到很困惑

  1. 关于依赖关系,如果我有这个类里面有变量 shippingAddress 并且在某些函数中使用数据类型 ShippingAddress 作为参数的 PP 类,我应该使用依赖关系还是关联

非常感谢

【问题讨论】:

    标签: oop uml class-diagram


    【解决方案1】:

    qwerty_so 已经提供了简洁准确的答案。不过,我想补充一些想法来完成这幅画。


    1

    在一个关联中总是至少有 2 个边,并且每边都有一个多重性:第一个图表明一个 PP 总是有 1 个购物车,而购物车总是有 1 个 PP。如果您的意思是“有时”而不是总是,请将其更改为 0..1

    n-ary association 中可以有超过 2 个边:那么你将有 n 个多重性。

    如果在图表的一侧没有表示多重性,这并不意味着没有多重性,而是我们不知道多重性是什么(或者它对于我们想要显示的内容并不重要图中)。

    现在你关于多重性以及如何实现它的问题引发了另一个话题:

    明确定义(在我的代码中)我有一个类型为 PP 的变量,但在类 PP 中根本没有购物车变量,所以多重性是否错误?

    这是navigability 的问题:如果在Cart 的实现中您有一个PP 变量,这意味着您可以轻松地从给定的Cart 导航到关联的PP。如果PP实现中没有Cart变量,则很难找到对应的Cart,因此无法导航。可导航性以空心箭头显示。

    多重性和可导航性是两个正交的概念。


    2

    如果您同时具有依赖项和关联,则通常会显示关联。不需要也显示依赖关系,因为它是由关联隐含的。但是,如果您想同时显示两者(但使用虚线和空心箭头)(例如,如果您想为每个都添加一些解释性 cmets),这并没有错。

    现在如果在PP 实现中你有一个ShippingAddress,这不仅是可导航性的问题,而且还是关联端的所有权问题。所以你可以使用ShippingAddress旁边的dot notation

    如果您没有关联,但使用另一个类作为参数或操作的返回类型,那么您可能希望显示 s simpe «use» dependency

    【讨论】:

    • 谢谢你这么清楚的回答,导航部分真的让我很着迷,所以在我的情况下,我需要使用指向 PP 的箭头? ,如果我的 PP 类有 shippingaddress 作为属性,我仍然不太了解关联端的所有权,它是否也算作可导航性?为什么是所有权?对不起,我还不能完全掌握这个概念
    • 确实,关联端的所有权意味着可导航性。关联端的所有权是关于语义的。可导航性是运行时效率的保证。这是关于两个不同的问题,它们并不相互排斥。
    【解决方案2】:
    1. 在需要的地方定义多重性。如果没有给出,那么它是未定义的,可以是从零到无穷大的任何值。这取决于你是否定义。一个原因是简单,如果您只想显示“它是关联的”。对于一个完整的模型(如果需要),您必须在所有边上指定多重性。

    2. 依赖只是一个弱关系。如果您仅在参数中使用某些类或作为传递,则使用依赖关系。您的第二张图片将是错误的,因为您应该向下绘制依赖项(带空心箭头的虚线),因为 PP 使用/依赖于 ShippingAddress 而不是相反。

    【讨论】:

    • 非常感谢您的回答,所以对于第一个答案,我可能被误解的是关联的含义是什么?就像在我的类购物车代码中我有变量 PP ,但在我的类 PP 中我没有变量知道 PP 与购物车相关联,这是否被认为与多重性 1-1 相关联?对于第二个问题,PP 类实际上在内部具有 Shipping address 的属性,并且还在函数内部将 Shippingaddress 作为参数传递,我应该为此使用依赖关系还是关联?
    • 没有也没有。 Cart 既没有命名属性,ShippingAddress 也没有命名属性。添加属性或使用角色名称。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 1970-01-01
    • 2010-10-27
    • 2011-07-14
    相关资源
    最近更新 更多