UML中的参数方向:in、out、inout和return

14

根据OMG 2.5(Beta)中的UML规范,我了解到以下概念:

in:表示参数值由调用者传入。

inout:表示参数值由调用者传入并再次传回给调用者。

out:表示参数值传出给调用者。

return:表示参数值作为返回值传回给调用者。

这是否意味着,“in”是按值调用,“inout”是按引用调用?

能否请您详细说明每个概念?

5个回答

4

• in - 输入参数(不得修改)。

• out - 输出参数(可修改以向调用者传递信息)。

• inout - 可修改的输入参数。

• return - 调用的返回值。


1
很遗憾,这是完全错误的答案,请重新审查它。 - zer0hedge

3

按引用调用是 inoutout 的一种可能实现,是的。

请记住,UML 以一种与语言无关的方式描述了“行为”。由于在实际语言中给定接口的实现决定了这意味着什么。

在像 Ada 这样具有语言级别的 inoutin out 参数的语言中,可以直接使用该语言表达,并且编译器可以决定引用或复制哪个更好地实现。在像 Python 这样的语言中,所有参数都以引用传递(有点儿),则 UML 级别的这种意图不会在实现级别产生任何区别。而在 C 这样的语言中,由于存在显式指针类型且所有参数都通过值传递,因此 UML 中表示的这些意图将转换为显式地址引用和指针取消引用。

换句话说,简短的答案是“是的,这大致就是它的意思,但可能不是它所做的事情”。


谢谢@jimwise的澄清。我想知道在UML建模时,如果为参数指定了"in"方向,这意味着什么(从语义上)?而对于"out"的情况呢?还有,"inout"和"return"意味着什么? - Andrew

0
关于UML需要记住的关键是它被设计成“通用”的,旨在独立于实现平台。具体来说,它是一个平台无关模型(PIM)。因此,使用特定于平台实现语义(例如“按值”和“按引用”)是错误的用法。
现实中,定义那些领域特定的语义是项目架构师的任务之一,在许多情况下,你提到的这些语义是有效的,但并非总是如此。 模型驱动架构(MDA)加上 平台配置文件 = 特定于平台的设计

感谢@Martin Spamer。如果这些人是特定于域的,为什么要通过UML规范编写?我想了解每个人的语义,以及如果我们忽略这些实现细节,如何能够从此模型生成代码? - Andrew
理想情况下,您的模型应该保持通用性,而您的架构师应该定义一个平台配置文件。这将定义在代码生成或往返工程期间如何将通用语义转换为特定于平台的语义。我已经添加了一些上面的链接,应该会有所帮助。 - Martin Spamer

0

当查看官方UML规范时,我们发现有一个细微的变化:

in:表示参数值由调用者传入。

inout:表示参数值由调用者传入,并且可能会传递不同的值给调用者。

out:表示参数值传递给调用者。

return:表示参数值作为返回值传递回调用者。

并且其中包含一条注释:不能将多个参数标记为返回参数。

我无法找到任何有关此ParameterDirectionKind枚举的进一步定义/澄清。

也就是说,UML不想进一步指定这个。而且最重要的是,它没有指定其中任何一个是按引用传递还是按值传递。


UML 还指定了参数的 ParameterEffectKind。它可以是 'create','read','update' 或 'delete'。这意味着参数必须通过引用传递,否则 ParameterEffectKind 将毫无意义。 - www.admiraalit.nl

0

“in”并不意味着参数按值传递,“inout”也不意味着参数按引用传递。

根据UML规范的第13.2.3.2条“行为参数”:

当调用行为时,可以提供与具有方向“in”或“inout”的参数相对应的参数值,这受到这些参数的多重性的限制。...参数值可用于影响所调用的行为执行的过程

第9.4.3.5条“参数”说:

效果属性可用于指定传入或传出参数的对象发生的情况。

例如,“delete”效果意味着:

在行为执行完成后,作为参数值的对象将不存在。

然后明确指出:

只有“in”和“inout”参数才能具有“delete”效果

按值传递或按引用传递是实现方法,两者都可以用于实现in、inout和out参数。在C语言中,您可以通过按值传递函数指针并删除指针所指向的对象来执行UML模型要求的操作。


我的“按值传递”的定义是:方法接收调用者传递的原始对象的副本。换句话说,该方法无法修改原始对象。在UML中,对于数据类型而言,这是正确的,但对于其他对象则不然,否则效果属性“更新”和“删除”将毫无意义。我的结论是,具有方向为in或inout的非数据类型参数是通过引用传递的,即该方法引用与调用者相同的对象。 - www.admiraalit.nl
@www.admiraalit.nl C++中的const引用参数是“in”参数通过引用传递的一个例子,该方法不能修改它。 - zer0hedge
在UML中,这个“in”参数的ParameterEffectKind应该是read。在UML中,数据类型是按值传递的,而其他内容则是按引用传递的。 - www.admiraalit.nl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接