【问题标题】:UML help C# Design PrinciplesUML 帮助 C# 设计原则
【发布时间】:2011-06-01 22:06:46
【问题描述】:

我在理解下面的 UML 时遇到问题:

具体来说PersistentSetThirdPartyPersistentSet是什么关系? PersistentObjectThirdPartyPersistentSet是什么关系?

请注意,UML 来自敏捷原则、模式和 C# 实践 作者:Martin C. Robert,Martin Micah,2006 年。第 10 章

提前致谢!

【问题讨论】:

    标签: c# oop uml design-principles


    【解决方案1】:

    具体来说,PersistentSet和ThirdPartyPersistentSet是什么关系?

    实心菱形----->是Composition(“有一个”),当“整体”存在时,“部分”被破坏。在下图中,如果你摧毁一辆汽车,你就摧毁了化油器。

    空菱形----->是Aggregation(“有一个”),其中“部分”可能不会在“整体”被破坏时被破坏。在下图中,如果你摧毁一个池塘,你不一定会摧毁鸭子(如果它们聪明,它们会搬到另一个池塘)。


    (来源:wikimedia.org

    PersistentObject 和 ThirdPartyPersistentSet 是什么关系?

    这是一种依赖关系。请参阅我的回答 here 了解更多信息。

    那么在使用参数传递的时候,依赖关系什么时候会变成关联关系呢?

    如果将参数存储在本地,则它会从依赖关系变为关联关系。如果您只在本地使用该参数,那么它仍然是一个依赖项。

    C#代码示例:

    // Association 
    public class ThirdPartyPersistentSet
    {
        private PersistentObject _object;
        public ThirdPartyPersistentSet(PersistentObject obj)
        {
            _object = obj; // Store it to a local variable.
            // Now ThirdPartyPersistentSet 'knows' about
            // the PersistentObject.
        }
    }
    
    // Dependency
    public class ThirdPartyPersistentSet
    {
        public ThirdPartyPersistentSet(PersistentObject obj)
        {
            obj.GetSomething(); // Do something with obj,
            // but do not store it to a local variable.
            // You only 'use' it and ThirdPartyPersistentSet
            // does not 'know' about it.
        }
    }
    

    【讨论】:

      【解决方案2】:

      PersistentSet 和ThirdPartyPersistentSet 的关系是一种Aggregation,即PersistentSet 包含一个或多个ThridPartyPersistenSet 实例。这是一种“弱”关系,这意味着 ThirdPartyPersistentSet 的实例可以存在于 PersistentSet 之外。

      PersistentObject 和 ThirdPartyPersistentSet 之间的关系是一个依赖关系,这意味着基本上 ThirdPartyPersistentSet 需要一个 PersistentObject 来完成它的工作。

      因此,要将其转换为代码,您的 PersistentSet 将包含如下内容:

      public class PersistentSet
      {
          public List<ThirdPartyPersistentSet> Items { get; }
          ...
      }
      

      您的 ThirdPartyPersistentSet 看起来像这样:

      public class ThirdPartyPersistentSet
      {
          private PersistentObject _object;
          public ThirdPartyPersistentSet(PersistentObject obj)
          {
              _object = obj;
          }
          ...
      }
      

      【讨论】:

      • 您的代码中的 Ckramer ThirdPartyPersistentSet 与 PersistentObject 相关联。依赖是较弱的依赖形式。例如,ThirdPartyPersistentSet 可以接受 PersistentObject 的参数并在本地使用它,这仍然是依赖关系。
      • @proxon - 是的,你是对的,但是由于类图不包含任何方法定义,我不想添加太多额外的东西,以免混淆太多东西。构造函数参数是一个更难的依赖项,但它们也很容易解释。
      • 谢谢你们俩。因此,ThirdPartyPersistentSet 和 PersistentObject 可以通过构造函数参数和方法参数。
      • @Pingpong - 如果您决定以这种方式编码,正如 proxon 所指出的,您可以将 UML 图更改为带箭头的实线(关联)。一旦你存储了一个传入局部变量的参数,它就变成了一个关联。如果您将 PersistentObject 作为参数传递给函数,并且不将其存储在本地,则它是一个依赖项。我添加了一个示例来说明我的意思。
      【解决方案3】:

      具体来说,PersistentSet和ThirdPartyPersistentSet是什么关系?

      PersistentSet 有许多 ThirdPartyPersistentSets

      PersistentObject 和 ThirdPartyPersistentSet 是什么关系?

      ThirdPartyPersistentSet 依赖于(使用-a)PersistentObject

      uml 类图中的所有行都表示一种或另一种依赖关系,除了对注释的虚线(折角框)。没有箭头的实线表示两 (2) 路(双向)依赖关系。

      【讨论】:

        【解决方案4】:

        黑色菱形代表组成,包含(如具有箭头所指类型的字段): PersistentSet 实体包含 ThirdPartyPersistentSet 实体 当 PersistenSet 被销毁时,包含的所有 ThirdPartyPersistenSet 对象也将被销毁。

        虚线表示依赖,如进行函数调用,该函数调用具有箭头所指类型的参数): ThirdPartyPersistentSet 依赖于 PersistentObject

        Look at the Wikipedia entry for more details

        【讨论】:

          【解决方案5】:

          具体来说,PersistentSet和ThirdPartyPersistentSet是什么关系?

          http://en.wikipedia.org/wiki/Class_diagram#Aggregation

          PersistentObject 和 ThirdPartyPersistentSet 是什么关系?

          http://en.wikipedia.org/wiki/Class_diagram#Dependency

          【讨论】:

            猜你喜欢
            • 2018-05-11
            • 2015-09-28
            • 1970-01-01
            • 1970-01-01
            • 2011-01-16
            • 2023-03-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多