我正在绘制描述系统域模型的类图。此图用于需求分析,因此它完全与实现无关。
我想为某些对象中的某些属性传递允许的值。这就是一个例子:

所以基本上它应该表现得像个Enum。上面所示的图是否符合UML?
发布于 2022-02-22 18:31:33
这个问题可以通过两种方式来解决:要么使用UML 2标准中的枚举概念,要么做最简单的工作。
UML2中的
(基于UML 2.5.1标准)
UML有一个本地的枚举概念,您可以在这里使用。枚举是一个DataType,即与类的实例不同,实例仅由它们的值标识。枚举由文字组成。在图表中,用关键字«enumeration»标记数字。UML规范提供了以下枚举示例(图10.4):

因为EnumerationLiteral是一个InstanceSpecification,所以我相信它可以被赋值。规范没有显示带有值的EnumerationLiteral,但正确的语法将是name = value。然而,我并不清楚这句话的语义学。每个EnumerationLiteral都有一个分类器,它等于文本是其一部分的枚举。例如,在上面的图表public: VisibilityKind中。分配不同分类器的值是没有意义的,例如public: VisibilityKind = 42,因为42是整数,而不是VisibilityKind。因此,我认为最好将EnumerationLiterals视为不透明的名称,而不要在模型本身中为它们分配值。当然,有一些方法可以在枚举的实例和其他类型之间进行转换。
在您的场景中,我们可以将表决表示为以下枚举(ASCII):
+---------------+
| «enumeration» |
| Vote |
+---------------+
| good |
| bad |
+---------------+以下内容在语法上是允许的,但语义有问题:
+---------------+
| «enumeration» |
| Vote |
+---------------+
| good = +1 |
| bad = -1 |
+---------------+如果您想要一个具有value字段的类,我们可以将枚举定义为一个VoteValue,并让您的投票类引用它,例如:
+------------------+
| Vote |
+------------------+
| value: VoteValue |
+------------------+在当前关系图中,您将类型/分类器表示为value: {+1, -1}。我不认为UML表示法支持这样的内联枚举/联合-属性类型必须是一个名称。然而,UML似乎没有为名称定义语法,因此可以说这确实符合。
创建一个符合UML标准的模型很少是必要的,也很少有帮助。这些模型通常只是供人类使用的图表,不需要机器可读的。那么,问题不在于UML标准说什么,而在于预期的接受者可能明白什么,而不是含糊不清的。坚持一个常见的图形词汇表(例如UML标准中定义的符号)具有一定的价值,因为它可以避免歧义。
在这个级别上,您现有的图表是非常好的--清楚地知道允许投票的值是什么。唯一要更改的是将注释连接到表决结果::value属性。
发布于 2022-02-23 00:30:43
可以轻松地使用约束限制属性的可能值。语法首先需要类型,然后是大括号之间的约束表达式。表达式不应该是一组值,而应该是布尔谓词,通常以明文形式表示,或者在OCL中更正式地表示。
value: Integer { either +1 or -1 }
value: Integer { Set{+1,-1}->includes(value) }如果您喜欢像GOOD和BAD这样的符号,请按照@amon的建议进行枚举。但是,每个UML枚举都是一个不同的数据类型,虽然语法允许将文字与值相关联,但它没有语义。如果您打算(mis?)使用整数算术的枚举,而不是计数不同的值,则可以使用枚举的显式转换操作getValue():Integer来表达您的意图。
https://softwareengineering.stackexchange.com/questions/436948
复制相似问题