不完全是属性,也不完全是方法。刻板印象?<<get>>
<<set>>
?
我正在对现有系统进行复古建模,所以我需要清楚地反映这与只读字段或方法对不同(不管 IL 说什么),所以我想我会采用刻板印象,但我会接受独立于语言的 get_set_ 作为一般解决方案。谢谢大家的理智测试。
不完全是属性,也不完全是方法。刻板印象?<<get>>
<<set>>
?
我正在对现有系统进行复古建模,所以我需要清楚地反映这与只读字段或方法对不同(不管 IL 说什么),所以我想我会采用刻板印象,但我会接受独立于语言的 get_set_ 作为一般解决方案。谢谢大家的理智测试。
我通常在 Visio 中准备我的 UML 图(我知道,我知道;但是你要做什么?)。
在绘制属性图表时,它们最终是这样的:
+------------------------+
| MyClass |
|------------------------|
| - _foo : int |
|------------------------|
| «property» + Foo : int |
+------------------------+
«property» 是从 «operator» 派生的自定义构造型。
丑陋,我知道。但它有效,而且很清楚。我以同样的方式做构造函数。
属性只是一种方便的编写get_MyValue()
和set_MyValue(value)
允许赋值的方式,而不是普通的方法调用(使用括号)。
您正在访问的实际上是一个 .NET 属性,C# 有自己的语法来访问这些属性。由于在皮肤下创建了真实get_
和set_
方法,因此您可以简单地显示这些方法(使您的 UML 语言独立 - 例如使您的 UML 同样适用于 VB.NET 开发人员)
... 或者正如您所建议的,介绍您自己的刻板印象!
您可以用与字段相同的方式表示属性。要指定附加信息,如只读或只写,您可以使用
+名称:字符串 {READONLY}
我一直在属性名称旁边使用<<get>>
和构造型,因此它们看起来像字段,但允许您区分or的访问修饰符:<<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
没有集合的 get 意味着:
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”的构造型(例如<< Property >> PropertyName)。刻板印象用于扩展 UML 表示法。
我这样用
-memberThePropertyWillExpose
+memberThePropertyIsExposing
好吧,如果这是正确的方法,欢迎对此发表评论!
在 Visio 中,您可以为属性创建一个 <<readonly>> 构造型,并且只为每个只读属性使用这个构造型。只写也一样。它会告诉你一个很好的符号:
<<readonly>> +PropertyName : int
它没有什么丑陋的。标准 Visio 的 Changeable 选项更难看,因为它没有任何可视化表示,您实际上需要打开每个属性的属性才能看到它,没有机会在打印的图表上看到它。