如何在UML类图中表示开放的通用类型构造

3
据我所了解,为开放泛型类型提供类型参数可以通过在UML类图中使用“bind”构造来表示。
例如,考虑以下类:
public class A<T> {
}

public class B {
  public A<string> Value { get; set; }
}

这可以被建模为一个UML类图,如下所示:

class diagram with closed generic type

但是如果我们通过泛型类型参数来构造一个基于 A<T> 的开放泛型类型,这种情况又如何呢?
public class A<T> {
}

public class B<X> {
  public A<X> Value { get; set; }
}

根据上述注释,我认为UML类图应该是这样的:

class diagram with open generic type

但是这看起来有点混乱,因为不明显 X 是从哪里来的 - 毕竟,它只是在 B 的范围内声明的,但似乎像在 A<X> 中一样被全局有效的声明使用。 一旦多个类型引用 A 并提供一些名为 X 的泛型参数,问题就变得明显了 - 例如,让我们将以下类添加到混合中:
public class C<X> {
  public A<X> Data { get; set; }
}

这导致了这样一种情况,我们要么最终得到多个看起来完全相同的节点:

class diagram with seemingly identical nodes

... 或者使用一个标识符 X,它代表同时表示多个不同(分别声明的!)事物。

class diagram with ambiguous X

有没有关于如何处理这个问题的共同约定?
请注意,如果我写成例如A<string>,那么构造类型的类标签可能会看起来更好,但是我无法找到在PlantUML中如何做到这一点,而不将string渲染为实际的开放泛型参数。 因此,在这篇文章中使用了方括号,导致类标签的形式为A[string]
1个回答

1
你在这里提到了UML中模板的一个关键弱点,即留下了许多现代通用编程构造的歧义。
问题在于,没有任何东西将在模板外部使用的X与模板参数X相关联。模板参数只在模板内部明确定义,并且当您使用绑定表达式时(顺便说一下,您应该写成“«bind» T->string”或“«bind» T->X”以明确绑定哪个模板参数),一旦您在模板外部使用它且没有绑定,它实际上与模板参数无关,您只能在视觉上将它们关联起来(另请参阅this other answer),并希望您的读者有相同的理解。
问题已经从这里开始了:
public class B<X> {
  public X Value { get; set; }
}

如果你在类中使用属性Value:X来建模,那么很明显它是模板类型。但如果你将其建模为一个属性,即与X相关联的拥有端,那么就会产生歧义。这使得对多个组合模板类的使用建模变得特别困难。
你的例子只是难度的下一个级别。

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