我对UML数据类型有疑问。
UML超结构说:
数据类型是一种类型,其实例仅由其值标识。
如果我正确理解这意味着,通过查看所有属性的值来检查相等性。
这是否也意味着DataTypes总是像C#结构一样被复制?
它们是否通过值传递给方法,如果我将DataType分配给新变量,它是否会复制? (例如在Alf中)
我在网上找不到答案。
答案 0 :(得分:3)
这是一个很好的问题。通常情况下,基本UML规范中的语义描述有点模糊。但是,Alf基于基础UML(fUML)语义,而fUML在这一点上是精确的。
简短的回答是,数据类型实际上是通过值传递的,而不是引用传递的,并且是不可变的。对数据类型的值进行任何明显的变异操作实际上都会导致创建新值。例如,请考虑Point数据类型的以下Alf代码:
a = new Point(1,1);
b = a;
a.x = 2;
作业b = a;
实际上复制了点数据值。因此,作业a.x = 2;
对b
没有影响。实际上,第二项任务实际上等同于a = new Point(2, a.y);
。也就是说,它会创建一个新的点数据值,然后重新分配给a
。
这些语义在Alf和fUML规范中明确涵盖。数据类型的定义在Alf spec 1的子条款10.4.4中有所涉及。但是,上面的赋值语义在子条款8.8中,它在对属性引用的简单赋值(如a.x
)的描述中说:
如果属性引用的主表达式是本地表达式 名称或参数名称,并且具有结构化数据类型的类型, 然后赋予属性引用有效地分配一个 使用给定的新数据值到该本地或参数名称 财产更新。
如果您对有关数据值语义的更多详细信息感兴趣,可以在fUML规范2中找到。值的语义在子条款8.3.2.1中讨论。关键是数据值和"扩展值"之间存在差异。扩展值存在于执行位置的分类器范围内,与其使用无关 - 这与#34;堆"的运行时实现概念的fUML相同。
扩展值包括作为关联实例的链接和作为类实例的对象。此外,存在用于指代对象的参考值。它总是引用传递的对象,而不是对象本身 - 对象只存在于执行轨迹("在堆上#34;)。因此,对象具有引用语义,而不是数据值,它们本身可以作为值传递。
因此,对于fUML规范中数据值与对象的语义没有模糊性。
答案 1 :(得分:0)
UML数据类型或多或少等于Immutable Objects的概念:无法更改的对象。
这确实与C#中的Value Types非常相似,但字符串之类的东西除外,它们实际上是不可变引用类型。因此字符串也将被视为UML数据类型。