如何在UML类图中表示函数/方法类型

3
在UML类图中,有没有一种标准的方法来表示命名的函数类型?
通过“命名的函数类型”,我指的是具有特定签名(参数、返回类型,可能还有泛型参数)的函数或方法类型,为其分配了一个别名,然后在整个类模型中引用该别名。
这个概念在不同的语言中都是已知的,例如:
C#:
public delegate string GetTextFunc(int value, bool modify);

TypeScript:
type GetTextFunc = (value: number, modify: boolean) => string;

(是的,实现上可能存在差异,但对于一个类模型来说,这些差异应该是无关紧要的。)
我该如何在UML类图中表示这种类型?目前为止,我还没有找到任何标准化的答案,我考虑将它们强行塞进一个类元素中,并利用自定义的类型标签来表达意义,例如:

function type as UML class element

然而,在这个问题中,我明确地寻找的是如果有的话,标准化的方法来做这件事。

我猜这些都是“语法糖”和编译器开发者的创新。 - undefined
@qwerty_so:可以说,这适用于UML关注的大多数高级语言概念,包括继承、类和接口的概念。 - undefined
我不会说“大多数”,但可能你得按照你的刻板印象去做。看看有没有人有更好的想法。 - undefined
1个回答

1
在UML中,没有一种标准的方法来表示函数或函数类型。
但是,函数类型描述了一类函数,所以类绝对是最好的选择。使用非标准的构造型“«function»”可以方便地区分这种非常特殊的类(另请参阅与此相关但不完全相同的问题的其他答案)。
关于参数,你的方法是可以辩护的。然而,从语义上来说,这是有问题的,因为它们并不是真正的公共属性,而且只存在于特定调用的时间。一个更一致的方法是不使用属性(除了可能是私有静态属性,因为这些是唯一可以独立于调用代表函数的属性),而是使用一个伪操作(如C++中的operator()(...))来代替,其签名与你的函数完全相同。从语义上讲,这将与特定函数和其函数类型之间的继承使用一致。它也将与所有序列图的语义一致。
请记住,操作是有命名的元素,所以你必须给伪操作命名,即使在你的代码中没有这样的名称。

谢谢,这非常有帮助。我唯一担心的是,如果例如其中一个参数是从同一类图中的另一个类键入的,仅仅将类名作为某种类似方法的伪操作的参数而不是在图中看到一个引用边,会使连接关系在视觉上不太明显,从而使图表在我看来变得不太有帮助。但是,这是UML类符号的一个普遍问题,所以我不能真的对这个特定的解决方案有什么意见。 - undefined
我不确定我理解你回答中最后一段的意图。函数类型被命名是我提问的前提。如果类型在代码中是匿名的(在我所使用的语言中,这通常意味着它不是以可重用的方式定义的,而是直接在使用的地方内联),我就不需要特定的注释元素,只需在UML类的字段中内联写入即可。 - undefined
1
@F-H关于你的第一条评论,这确实是一个通用的UML关注点。然而,你可以完全强调函数类型类对作为参数使用的类的依赖关系。你甚至可以用非标准的«parameter»和«return type»对这种依赖关系进行建模。这将提供一个非常清晰的图像,同时也符合UML语义的一致性。(更进一步的一步可能是使用标记值来记录参数的名称,但这将是多余的,难以维护并且过度冗余) - undefined
1
@F-H,确实,我在小手机屏幕上阅读了你的问题,以为你有一些匿名案例,而现在我意识到它们是有名字的,你甚至明确提到了有名字的类型。所以我最后一段只适用于伪操作的名称。我已经相应地进行了编辑。 - undefined

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