UML DataType 是否像 C# 结构一样按值传递
Is UML DataType passed call-by-value like C# structs
我有一个关于 UML 数据类型的问题。
UML 上层结构说:
A data type is a type whose instances are identified only by their value.
如果我理解正确,这意味着,通过查看所有属性的值来检查是否相等。
这是否也意味着数据类型总是像 C# 结构一样被复制?
它们是否按值传递给方法,如果我将 DataType 分配给新变量,这会生成副本吗? (例如在阿尔夫)
我在网上找不到这个问题的答案。
UML数据类型大致等同于Immutable Objects的概念:不可改变的对象。
这确实也很像 C# 中的 Value Types,除了字符串之类的东西,它们实际上是不可变引用类型。因此字符串也将被视为 UML 数据类型。
这是个好问题。通常情况下,基本 UML 规范中的语义描述有点模糊。但是Alf是基于Foundational 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 规范 1 的子条款 10.4.4 中。但是,上述赋值的语义在第 8.8 节中,它在对 属性 引用(如 a.x
)的简单赋值的描述下说:
If the property reference has a primary expression that is a local
name or parameter name and has a type that is a structured data type,
then the assignment to the property reference effectively assigns a
new data value to that local or parameter name, with the given
property updated.
如果您对数据值语义的更多细节感兴趣,可以在 fUML 规范中找到它 2。值的语义在 8.3.2.1 节中讨论。关键是数据值和 "extensional values" 之间存在区别。扩展值存在于其分类器的范围内,独立于它们的使用——这在 fUML 中等同于 "heap" 的运行时实现概念。
扩展值包括链接(关联实例)和对象(类 实例)。此外,还有用于引用对象的引用值。它始终是对传递的对象的引用,而不是对象本身——对象只是存在于执行位置 ("on the heap")。因此,对象具有引用语义,与数据值相反,数据值本身可以作为值传递。
因此,在 fUML 规范中数据值与对象的语义没有任何模糊之处。
我有一个关于 UML 数据类型的问题。
UML 上层结构说:
A data type is a type whose instances are identified only by their value.
如果我理解正确,这意味着,通过查看所有属性的值来检查是否相等。
这是否也意味着数据类型总是像 C# 结构一样被复制?
它们是否按值传递给方法,如果我将 DataType 分配给新变量,这会生成副本吗? (例如在阿尔夫)
我在网上找不到这个问题的答案。
UML数据类型大致等同于Immutable Objects的概念:不可改变的对象。
这确实也很像 C# 中的 Value Types,除了字符串之类的东西,它们实际上是不可变引用类型。因此字符串也将被视为 UML 数据类型。
这是个好问题。通常情况下,基本 UML 规范中的语义描述有点模糊。但是Alf是基于Foundational 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 规范 1 的子条款 10.4.4 中。但是,上述赋值的语义在第 8.8 节中,它在对 属性 引用(如 a.x
)的简单赋值的描述下说:
If the property reference has a primary expression that is a local name or parameter name and has a type that is a structured data type, then the assignment to the property reference effectively assigns a new data value to that local or parameter name, with the given property updated.
如果您对数据值语义的更多细节感兴趣,可以在 fUML 规范中找到它 2。值的语义在 8.3.2.1 节中讨论。关键是数据值和 "extensional values" 之间存在区别。扩展值存在于其分类器的范围内,独立于它们的使用——这在 fUML 中等同于 "heap" 的运行时实现概念。
扩展值包括链接(关联实例)和对象(类 实例)。此外,还有用于引用对象的引用值。它始终是对传递的对象的引用,而不是对象本身——对象只是存在于执行位置 ("on the heap")。因此,对象具有引用语义,与数据值相反,数据值本身可以作为值传递。
因此,在 fUML 规范中数据值与对象的语义没有任何模糊之处。