首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在建模需求时,我如何描述允许值为自定义和有限数量的类关系图属性?

在建模需求时,我如何描述允许值为自定义和有限数量的类关系图属性?
EN

Software Engineering用户
提问于 2022-02-22 16:20:07
回答 2查看 467关注 0票数 4

我正在绘制描述系统域模型的类图。此图用于需求分析,因此它完全与实现无关。

我想为某些对象中的某些属性传递允许的值。这就是一个例子:

所以基本上它应该表现得像个Enum。上面所示的图是否符合UML?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 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):

代码语言:javascript
复制
+---------------+
| «enumeration» |
|     Vote      |
+---------------+
| good          |
| bad           |
+---------------+

以下内容在语法上是允许的,但语义有问题:

代码语言:javascript
复制
+---------------+
| «enumeration» |
|     Vote      |
+---------------+
| good = +1     |
| bad  = -1     |
+---------------+

如果您想要一个具有value字段的类,我们可以将枚举定义为一个VoteValue,并让您的投票类引用它,例如:

代码语言:javascript
复制
+------------------+
|       Vote       |
+------------------+
| value: VoteValue |
+------------------+

在当前关系图中,您将类型/分类器表示为value: {+1, -1}。我不认为UML表示法支持这样的内联枚举/联合-属性类型必须是一个名称。然而,UML似乎没有为名称定义语法,因此可以说这确实符合。

图是人类用的,

创建一个符合UML标准的模型很少是必要的,也很少有帮助。这些模型通常只是供人类使用的图表,不需要机器可读的。那么,问题不在于UML标准说什么,而在于预期的接受者可能明白什么,而不是含糊不清的。坚持一个常见的图形词汇表(例如UML标准中定义的符号)具有一定的价值,因为它可以避免歧义。

在这个级别上,您现有的图表是非常好的--清楚地知道允许投票的值是什么。唯一要更改的是将注释连接到表决结果::value属性。

票数 6
EN

Software Engineering用户

发布于 2022-02-23 00:30:43

可以轻松地使用约束限制属性的可能值。语法首先需要类型,然后是大括号之间的约束表达式。表达式不应该是一组值,而应该是布尔谓词,通常以明文形式表示,或者在OCL中更正式地表示。

代码语言:javascript
复制
value: Integer { either +1 or -1 }  
value: Integer { Set{+1,-1}->includes(value) }

如果您喜欢像GOODBAD这样的符号,请按照@amon的建议进行枚举。但是,每个UML枚举都是一个不同的数据类型,虽然语法允许将文字与值相关联,但它没有语义。如果您打算(mis?)使用整数算术的枚举,而不是计数不同的值,则可以使用枚举的显式转换操作getValue():Integer来表达您的意图。

票数 3
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/436948

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档