问题描述
例如,一个类有一个方法 compute()
(为了清楚起见,使用 Python 语法并删除 self
参数):
def compute(computation_fn):
return computation_fn(5)
让我们假设 computation_fn
将 int 映射到 int。在UML类图中,我应该写这样的东西吗?
+ compute(computation_fn: (num: int): int): int
如果已经在某处回答了这个问题,只需放一个链接!我一直在寻找答案。
解决方法
UML 只有基本类型 Integer
、Boolean
、String
、UnlimitedNatural
和 Real
。
您还可以使用您在模型中定义的任何类作为类型。在这方面,您可以很好地定义一个 class that corresponds to a kind of functions,例如 FunctionOfIntToInt
。在任何使用可调用对象的设计中,这都是常见的事情。
UML 还可以通过配置文件中的其他类型来丰富。很多时候,你会看到你最喜欢的语言类型。这假定使用特定于语言的配置文件。但通常是固定类型名称(例如 Date
、UInt8
、...)。您可以想象一种称为 (int):int
的类型,但是对于已经使用 :
的 UML 语法而言,这将是模棱两可的。
不幸的是,UML 的类型系统中没有任何东西可以表示具有任意数量的灵活类型参数的函数。因此,这完全取决于您对 UML 的合规性:
- Python 程序员会理解您在图中使用的任何 Python 类型,包括函数类型,即使它不是“纯”UML。所以这将是务实的方法。尽管如此,我还是建议将返回类型的
:
替换为->
以避免词法混淆 - 但是,如果您必须按照本书进行操作,配置文件不允许使用允许在现有 UML 机制之上组合类型的语法扩展。有一个解决方法。您可以使用 UML 模板类来表示函数。第一个参数是返回类型,其余的模板参数是参数类型。然后,您将使用 UML 的本机 template binding 语法来实例化模板以用于输入目的。但我同意,它更笨拙(即使对于 C++
std::function
template 的任何用户来说似乎都很熟悉。