【问题标题】:How to represent a C# property in UML?如何在 UML 中表示 C# 属性?
【发布时间】:2009-01-22 17:33:28
【问题描述】:

不完全是属性,也不完全是方法。刻板印象? <<get>><<set>>?


我正在对现有系统进行逆向建模,所以我需要清楚地反映这与只读字段或方法对不同(不管 IL 说什么),所以我认为我'我会接受刻板印象,但我会接受独立于语言的 get_set_ 作为一般解决方案。感谢大家的理智测试。

【问题讨论】:

    标签: c# .net properties uml


    【解决方案1】:

    我通常在 Visio 中准备我的 UML 图(我知道,我知道;但是你要做什么?)。

    当绘制属性图表时,它们最终是这样的:

    +------------------------+
    | MyClass                |
    |------------------------|
    | - _foo : int           |
    |------------------------|
    | «property» + Foo : int |
    +------------------------+
    

    «property» 是从 «operator» 派生的自定义构造型。

    丑陋,我知道。但它有效,而且很清楚。我用同样的方式做构造函数。

    【讨论】:

    • 这基本上是我要做的,但构造函数的约定只是类名作为你知道的方法:)
    • 这不会显示是否设置了 get methodset method 或两者。还是我错过了什么?
    • @Subomi:自从我以这种方式建模属性以来,已经有好几年了。但是,当我这样做时,> 表示一个读写属性(get 和 set)。额外的构造型,例如 >,将指示只有一个 getter 的属性。我从未见过只有 setter 的属性的用途。
    【解决方案2】:

    属性只是编写get_MyValue()set_MyValue(value) 的便捷方式,允许赋值而不是正常的方法调用(使用括号)。

    您访问的实际上是一个 .NET 属性,C# 有自己的语法来访问这些属性。由于在皮肤下创建了真正的 get_set_ 方法,因此您可以简单地显示这些方法(使您的 UML 语言独立 - 例如使您的 UML 同样适用于 VB.NET 开发人员)

    ...或者按照您的建议,介绍您自己的刻板印象!

    【讨论】:

      【解决方案3】:

      您可以像字段一样表示属性。要指定其他信息,例如只读或只写,您可以使用

      +名称:字符串 {READONLY}

      【讨论】:

        【解决方案4】:

        我一直在属性名称旁边使用<<get>><<set>> 构造型,因此它们看起来像字段,但允许您区分getset 的访问修饰符:

        +=============================+
        | ClassName                   |
        +-----------------------------+
        | +<<get>> Id : int           |
        | -<<set>> Id : int           |
        | +<<get>> IsSomething : bool |
        +-----------------------------+
        | + Method1(arg1 : string)    |
        +=============================+
        

        或者,如果您不希望某个属性出现多次,这也可以:

        +=============================+
        | ClassName                   |
        +-----------------------------+
        | +<<get>> -<<set>> Id : int  |
        

        为了减少混乱,如果getset 具有相同的访问修饰符:

        +====================================+
        | ClassName                          |
        +------------------------------------+
        | +<<get, set>> Description : string |
        | +<<get>> -<<set>> Id : int         |
        

        这清楚地传达了属性是否具有 get 或 set,以及它是否是只读的(通过在类图中不存在 &lt;&lt;set&gt;&gt;)。所以基本上你在问题中所说的。

        虽然属性是 getter 和 setter 方法的语法糖,但它们应该感觉像字段,我相信 UML 图应该反映这一事实,同时也传达什么是公共的,什么是私有的,以及setter 是否存在。


        更新:我已经使用这种表示法有一段时间了,并做了一些细微的修改。

        只读属性

        +<<get>> IsVisible : bool
        

        获得没有集合意味着:

        public bool IsVisible => // logic goes here
        

        带有只读支持字段的自动属性

        +<<get>> Id : int {readonly}
        

        暗示:

        public int Id { get; }
        

        【讨论】:

          【解决方案5】:

          我会将它们作为 UML 中的公共字段,因为这就是它们的概念。 UML 不是您的编程语言的语法(尽管一些工具供应商声称它是)。

          关于您的实现语言如何处理属性的详细信息不需要在 UML 中显示。这完全违背了使用 UML 作为一种抽象实现细节并让您专注于设计的工具的意义。

          如果属性在某些方面是特殊的,例如它是派生的或只读的,您可以使用构造型注释进行标记。

          【讨论】:

            【解决方案6】:

            嗯,我只是把它作为我的伪 UML 图中的一种方法。 :-)

            【讨论】:

              【解决方案7】:

              属性是用更好的语法包装的 Get/Set 方法。只需将它们作为方法放入,或者为它们创建一些新的 UML 语法 :)

              【讨论】:

                【解决方案8】:

                将属性描述为单个字段的问题在于,对于使用 2.0 框架及更高版本的 C#,get 和 set 可以具有不同的访问修饰符。

                【讨论】:

                  【解决方案9】:

                  我同意workmad3。属性只是使 get/set 方法更好一点的技巧。出于这个原因,我认为它应该保存为两种不同的方法。更重要的是,在这种情况下,您可以为他们设置不同的访问权限

                  【讨论】:

                    【解决方案10】:

                    您可以对类图中的字段使用称为“property”的构造型(例如> PropertyName)。构造型用于扩展 UML 表示法。

                    【讨论】:

                      【解决方案11】:

                      我是这样用的

                      -memberThePropertyWillExpose
                      +memberThePropertyIsExposing
                      

                      好吧,如果这是正确的方法,欢迎 cmets !

                      【讨论】:

                        【解决方案12】:

                        在 Visio 中,您可以为属性创建一个 > 构造型,并为每个只读属性使用此构造型。只写也一样。它会告诉你一个很好的符号:

                        <<readonly>> +PropertyName : int
                        

                        没有什么丑陋的。标准 Visio 的 Changeable 选项更难看,因为它没有任何可视化表示,您实际上需要打开每个属性的属性才能看到它,没有机会在打印的图表上看到它。

                        【讨论】:

                          猜你喜欢
                          • 2015-05-23
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          • 2013-11-30
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多