如何在 UML 类图中指示开放泛型类型构造

问题描述 投票:0回答:1

据我所知,为开放泛型类型提供类型参数可以通过使用 bind 构造型在 UML 类图中表示。

例如,参加以下课程:

public class A<T> {
}

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

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

但是如果我们传递泛型类型参数,从而基于

A<T>
构造一个开放的泛型类型呢?

public class A<T> {
}

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

基于上面的表示法,我认为UML类图应该是这样的:

但这看起来有点令人困惑,因为

X
来自哪里并不明显——毕竟,它只是在
B
的范围内声明,但似乎像
A<X>
中的全局有效声明一样使用。 一旦多个类型引用
A
并提供一些名为
X
的通用参数,问题就变得明显 - 例如让我们添加以下类:

public class C<X> {
  public A<X> Data { get; set; }
}

这会导致我们最终得到多个看起来完全相同的节点的情况:

...或使用标识符

X
一次表示多个不同(单独声明!)的事物。

有关于如何处理这个问题的通用约定吗?


请注意,如果我编写例如,构造类型的类标签可能看起来更好

A<string>
,但如果没有软件渲染 string 作为实际的开放通用参数,我无法找到如何在
PlantUML
中执行此操作。 因此,本文中使用了方括号,从而产生了诸如
A[string]
.

之类的标签
generics uml class-diagram
1个回答
0
投票

您在这里解决了 UML 中模板的一个关键弱点,这使得许多现代通用编程结构变得模糊不清。

问题在于,模板外部使用的

X
与模板参数
X
没有任何关系。模板参数仅在模板内明确定义,并且当您使用绑定表达式时(顺便说一句,您应该编写
«bind» T->string
«bind» T->X
来明确要绑定哪个模板参数)。一旦你在模板之外使用它并且没有绑定,它实际上与模板参数无关,你只能在视觉上将它们关联起来(另见这个其他答案)并希望你的读者有同样的理解。

问题已经从这里开始了:

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

如果您在类中使用属性

Value:X
对此进行建模,很明显它是模板类型。但是,如果将其建模为属性,即与 X 关联的拥有端,则它是不明确的。这使得对多个模板类的组合使用进行建模特别困难。

你的例子只是下一个难度级别。

© www.soinside.com 2019 - 2024. All rights reserved.