13

我必须将 Java 应用程序中的一些类逆向工程为 UML 2 类图。到目前为止一切顺利,我已经找到了 Jon Skeet 在此处提出的如何表示整个类的类模板:用 UML 表示模板类的正确方法是什么?. 有了这些信息,我对这样的类进行了逆向工程:

public class Foo<T> {
    //class fields and methods...
}

现在我遇到了一个两难境地,试图对一个只有一个方法包含泛型参数的类进行逆向工程:

public class OtherFoo {
    public <T extends Comparable<T>> boolean bar(T x, T y) {
        //fancy code goes here...
    }
}

您知道如何实现任何 UML 2 工具吗?我只是想了解这个概念。

4

1 回答 1

10

我不知道如何在您选择的工具中执行此操作,但在模型级别上,它的工作方式与类完全一样。您使用您的签名创建模板操作。

UML2 上层结构的第 17.4.14 章为符号指定了这一点:

模板操作的模板参数和模板参数绑定是操作名称和操作参数之间的两个列表。
*<可见性> <名称> '<' <template-parameter-list> '>' '<<' <binding-expression-list> '>>''( ' <parameter> [','<parameter>]** ')' [':' <属性字符串>]

在你的情况下,让我们先看看简单的情况

public <T> boolean bar(T x, T y)

这将对应于

+ bar<T> (x: T, y: T) : 布尔值

您的原始示例看起来有点复杂,因为模板参数被约束到另一个类 Comparable,而后者又是一个模板,其参数(我称之为 T1)依次绑定到操作的参数。这给了我们

+ bar<T> Comparable<T1->T>> (x: T, y: T) : 布尔值


注意:(前面有点深入的杂乱无章)UML(以及在某种程度上C ++)指定的模板与Java中的泛型完全不同。它们看起来或多或少相同,但它们的语义存在(有时是细微的)差异,这使得两者难以匹配。UML 中最重要的一项是:

模板不能以与同类非模板元素相同的方式使用。模板元素只能用于生成绑定元素(例如,模板类不能用作类型化元素的类型)或作为另一个模板规范的一部分(例如,模板类可以专门化另一个模板类)。

这意味着在 UML 中,OtherFoo 也需要是一个模板——即有一个模板签名(带有 0 个参数)。然后为了在模板范围之外正确使用操作模板——即在一个活动或类似的活动中调用它——你首先必须将它绑定到一个具体的操作,而不是使用它。在您的示例中,这意味着:

  1. 将 OtherFoo 模板绑定到(匿名)绑定类。
  2. 绑定栏操作模板到绑定类中的操作。
于 2013-05-14T08:56:56.960 回答