当参数是函数时,如何在 UML class 图中表示参数的类型?

How do I represent the type of an argument in a UML class diagram, when the argument is a function?

例如,class 有一个方法 compute()(使用 Python 语法并为清楚起见删除 self 参数):

def compute(computation_fn):
    return computation_fn(5)

让我们假设 computation_fn 将 int 映射到 int。在 UML class 图中,我应该这样写吗?

+ compute(computation_fn: (num: int): int): int

如果这个问题已经在某处得到解答,请留下 link!我一直在寻找答案。

UML 只有基本类型 IntegerBooleanStringUnlimitedNaturalReal.

您还可以使用您在模型中定义的任何 class 作为类型。在这方面,你可以很好地定义一个,例如FunctionOfIntToInt。在任何使用可调用对象的设计中,这都是常见的事情。

UML 也可以通过配置文件中的其他类型来丰富。通常,您会看到使用了您最喜欢的语言类型。这假定使用特定语言的配置文件。但通常它是固定的类型名称(例如 DateUInt8、...)。您可以想象一个名为 (int):int 的类型,但考虑到已经使用 :.

的 UML 语法,这将是模棱两可的

不幸的是,UML 的类型系统中没有任何东西允许用任意数量的灵活类型参数表示函数。所以这完全取决于您需要与 UML 兼容的程度:

  • Python 程序员会理解您在图中使用的任何 python 类型,包括函数类型,即使它不是“纯”UML。所以这将是务实的方法。尽管如此,我还是建议将 return 类型的 : 替换为 -> 以避免词汇混淆
  • 但是如果您必须照章办事,配置文件不允许允许在现有 UML 机制之上组合类型的语法扩展。有一个解决方法。您可以使用 UML 模板 class 来表示函数。第一个参数是 return 类型,其余模板参数是参数类型。然后您将使用 UML 的本机 template binding syntax to instantiate the template for typing purpose. But I agree, it's more clumsy (even if it'd seem familiar to any user of C++ std::function template.