【发布时间】:2009-01-22 17:33:28
【问题描述】:
不完全是属性,也不完全是方法。刻板印象? <<get>><<set>>?
我正在对现有系统进行逆向建模,所以我需要清楚地反映这与只读字段或方法对不同(不管 IL 说什么),所以我认为我'我会接受刻板印象,但我会接受独立于语言的 get_set_ 作为一般解决方案。感谢大家的理智测试。
【问题讨论】:
标签: c# .net properties uml
不完全是属性,也不完全是方法。刻板印象? <<get>><<set>>?
我正在对现有系统进行逆向建模,所以我需要清楚地反映这与只读字段或方法对不同(不管 IL 说什么),所以我认为我'我会接受刻板印象,但我会接受独立于语言的 get_set_ 作为一般解决方案。感谢大家的理智测试。
【问题讨论】:
标签: c# .net properties uml
我通常在 Visio 中准备我的 UML 图(我知道,我知道;但是你要做什么?)。
当绘制属性图表时,它们最终是这样的:
+------------------------+
| MyClass |
|------------------------|
| - _foo : int |
|------------------------|
| «property» + Foo : int |
+------------------------+
«property» 是从 «operator» 派生的自定义构造型。
丑陋,我知道。但它有效,而且很清楚。我用同样的方式做构造函数。
【讨论】:
get method 或 set method 或两者。还是我错过了什么?
属性只是编写get_MyValue() 和set_MyValue(value) 的便捷方式,允许赋值而不是正常的方法调用(使用括号)。
您访问的实际上是一个 .NET 属性,C# 有自己的语法来访问这些属性。由于在皮肤下创建了真正的 get_ 和 set_ 方法,因此您可以简单地显示这些方法(使您的 UML 语言独立 - 例如使您的 UML 同样适用于 VB.NET 开发人员)
...或者按照您的建议,介绍您自己的刻板印象!
【讨论】:
您可以像字段一样表示属性。要指定其他信息,例如只读或只写,您可以使用
+名称:字符串 {READONLY}
【讨论】:
我一直在属性名称旁边使用<<get>> 和<<set>> 构造型,因此它们看起来像字段,但允许您区分get 或set 的访问修饰符:
+=============================+
| ClassName |
+-----------------------------+
| +<<get>> Id : int |
| -<<set>> Id : int |
| +<<get>> IsSomething : bool |
+-----------------------------+
| + Method1(arg1 : string) |
+=============================+
或者,如果您不希望某个属性出现多次,这也可以:
+=============================+
| ClassName |
+-----------------------------+
| +<<get>> -<<set>> Id : int |
为了减少混乱,如果get 和set 具有相同的访问修饰符:
+====================================+
| ClassName |
+------------------------------------+
| +<<get, set>> Description : string |
| +<<get>> -<<set>> Id : int |
这清楚地传达了属性是否具有 get 或 set,以及它是否是只读的(通过在类图中不存在 <<set>>)。所以基本上你在问题中所说的。
虽然属性是 getter 和 setter 方法的语法糖,但它们应该感觉像字段,我相信 UML 图应该反映这一事实,同时也传达什么是公共的,什么是私有的,以及setter 是否存在。
更新:我已经使用这种表示法有一段时间了,并做了一些细微的修改。
只读属性
+<<get>> IsVisible : bool
获得没有集合意味着:
public bool IsVisible => // logic goes here
带有只读支持字段的自动属性
+<<get>> Id : int {readonly}
暗示:
public int Id { get; }
【讨论】:
我会将它们作为 UML 中的公共字段,因为这就是它们的概念。 UML 不是您的编程语言的语法(尽管一些工具供应商声称它是)。
关于您的实现语言如何处理属性的详细信息不需要在 UML 中显示。这完全违背了使用 UML 作为一种抽象实现细节并让您专注于设计的工具的意义。
如果属性在某些方面是特殊的,例如它是派生的或只读的,您可以使用构造型注释进行标记。
【讨论】:
嗯,我只是把它作为我的伪 UML 图中的一种方法。 :-)
【讨论】:
属性是用更好的语法包装的 Get/Set 方法。只需将它们作为方法放入,或者为它们创建一些新的 UML 语法 :)
【讨论】:
将属性描述为单个字段的问题在于,对于使用 2.0 框架及更高版本的 C#,get 和 set 可以具有不同的访问修饰符。
【讨论】:
我同意workmad3。属性只是使 get/set 方法更好一点的技巧。出于这个原因,我认为它应该保存为两种不同的方法。更重要的是,在这种情况下,您可以为他们设置不同的访问权限
【讨论】:
您可以对类图中的字段使用称为“property”的构造型(例如> PropertyName)。构造型用于扩展 UML 表示法。
【讨论】:
我是这样用的
-memberThePropertyWillExpose
+memberThePropertyIsExposing
好吧,如果这是正确的方法,欢迎 cmets !
【讨论】:
在 Visio 中,您可以为属性创建一个 > 构造型,并为每个只读属性使用此构造型。只写也一样。它会告诉你一个很好的符号:
<<readonly>> +PropertyName : int
没有什么丑陋的。标准 Visio 的 Changeable 选项更难看,因为它没有任何可视化表示,您实际上需要打开每个属性的属性才能看到它,没有机会在打印的图表上看到它。
【讨论】: