根据OMG 2.5(Beta)中的UML规范,我了解到以下概念:
in:表示参数值由调用者传入。
inout:表示参数值由调用者传入并再次传回给调用者。
out:表示参数值传出给调用者。
return:表示参数值作为返回值传回给调用者。
这是否意味着,“in”是按值调用,“inout”是按引用调用?
能否请您详细说明每个概念?
根据OMG 2.5(Beta)中的UML规范,我了解到以下概念:
in:表示参数值由调用者传入。
inout:表示参数值由调用者传入并再次传回给调用者。
out:表示参数值传出给调用者。
return:表示参数值作为返回值传回给调用者。
这是否意味着,“in”是按值调用,“inout”是按引用调用?
能否请您详细说明每个概念?
• in - 输入参数(不得修改)。
• out - 输出参数(可修改以向调用者传递信息)。
• inout - 可修改的输入参数。
• return - 调用的返回值。
按引用调用是 inout
和 out
的一种可能实现,是的。
请记住,UML 以一种与语言无关的方式描述了“行为”。由于在实际语言中给定接口的实现决定了这意味着什么。
在像 Ada 这样具有语言级别的 in
、out
和 in out
参数的语言中,可以直接使用该语言表达,并且编译器可以决定引用或复制哪个更好地实现。在像 Python 这样的语言中,所有参数都以引用传递(有点儿),则 UML 级别的这种意图不会在实现级别产生任何区别。而在 C 这样的语言中,由于存在显式指针类型且所有参数都通过值传递,因此 UML 中表示的这些意图将转换为显式地址引用和指针取消引用。
换句话说,简短的答案是“是的,这大致就是它的意思,但可能不是它所做的事情”。
当查看官方UML规范时,我们发现有一个细微的变化:
in:表示参数值由调用者传入。
inout:表示参数值由调用者传入,并且可能会传递不同的值给调用者。
out:表示参数值传递给调用者。
return:表示参数值作为返回值传递回调用者。
并且其中包含一条注释:不能将多个参数标记为返回参数。
我无法找到任何有关此ParameterDirectionKind枚举的进一步定义/澄清。
也就是说,UML不想进一步指定这个。而且最重要的是,它没有指定其中任何一个是按引用传递还是按值传递。
“in”并不意味着参数按值传递,“inout”也不意味着参数按引用传递。
根据UML规范的第13.2.3.2条“行为参数”:
当调用行为时,可以提供与具有方向“in”或“inout”的参数相对应的参数值,这受到这些参数的多重性的限制。...参数值可用于影响所调用的行为执行的过程
第9.4.3.5条“参数”说:
效果属性可用于指定传入或传出参数的对象发生的情况。
例如,“delete”效果意味着:
在行为执行完成后,作为参数值的对象将不存在。
然后明确指出:
只有“in”和“inout”参数才能具有“delete”效果
按值传递或按引用传递是实现方法,两者都可以用于实现in、inout和out参数。在C语言中,您可以通过按值传递函数指针并删除指针所指向的对象来执行UML模型要求的操作。