【问题标题】:How to represent generic parameter in UML method?如何在 UML 方法中表示泛型参数?
【发布时间】:2013-05-13 15:43:19
【问题描述】:

我必须将 Java 应用程序中的一些类逆向工程为 UML 2 类图。到目前为止一切顺利,我已经找到了 Jon Skeet 在此处提出的如何表示整个班级的班级模板:What is the correct way to represent template classes with 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 工具吗?我只是想了解这个概念。

【问题讨论】:

  • +1,好问题!!!!!

标签: java uml


【解决方案1】:

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

UML2 superstructure 的第 17.4.14 章指定了此符号:

模板操作的模板参数和模板参数绑定是两个列表之间的名称 操作和操作参数。
* ‘ ‘>’ ‘ ‘>>’‘( ‘ [',']** ')' [':' ]

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

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

这将对应于

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

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

+ bar 可比较T>> (x: T, y: T) : 布尔值


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

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

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

  1. 将 OtherFoo 模板绑定到(匿名)绑定类。
  2. 将条形操作模板绑定到绑定类中的操作。

【讨论】:

  • 我觉得这个信息非常有用,清晰如水晶,谢谢。如果您可以像 JonSkeet 在他的回答中所做的那样添加两个最新示例的图形,这对未来的读者来说会很棒(查看我的问题上的链接)。
  • 那个表达式 "+ bar ComparableT>> (x: T, y: T) : Boolean" 对我来说看起来很奇怪。 T 之后的第一个大符号真的正确吗?不应该是“->”吗?
  • 否,“->”表示模板参数绑定,而“>”表示模板参数的类型约束。所以在这种情况下,它并不意味着“将 T 绑定到 Comparable”,而是“将 T 限制为 Comparable 的子类型”。有关详细信息,请参阅 UML 上层结构部分“分类器模板”/“符号”(UML 2.5 的第 9.3.4 节)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多