Как представить общий параметр в методе UML?

Мне нужно перепроектировать некоторые классы из приложения Java в диаграмму классов UML 2. До сих пор так хорошо, что я нашел, как представлять шаблоны классов для всего класса, предложенные Джоном Скитом здесь: Каков правильный способ представления классов шаблонов с помощью 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

Я не знаю, как это сделать в вашем инструменте выбора, но на уровне модели он работает точно так же, как и для классов. Вы создаете операцию с вашей подписью.

В главе 17.4.14 надстройки UML2 указано это для обозначения:

Параметры шаблона и привязка параметров шаблона операции шаблона - это два списка между именем операции и параметров операции.
* < видимость < имя < < < < < < шаблон-параметр-список > ' > ' < < < lt; binding-expression-list > ' → ' ('<parameter> [', <parameter> ] **') [': < property-string > ]

В вашем случае сначала рассмотрим простой случай

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

Это соответствовало бы

+ bar <T> (x: T, y: T): Boolean

Исходный пример выглядит несколько сложнее, потому что параметр шаблона ограничен другим классом, Comparable, который, в свою очередь, также является шаблоном, параметр которого (я буду называть его T1) привязан к параметру операции по очереди. Это дает нам

+ bar <T> Сравнительный < T1- > T → (x: T, y: T): Boolean


Примечание. (Немного углубленного продвижения вперед). Шаблоны, заданные UML (и в некоторой степени С++), являются совсем другим зверем из Generics в Java. Они выглядят более или менее одинаково, но есть и иногда тонкие различия в их семантике, которые могут затруднить соответствие двух. Наиболее важным в UML является следующее:

Шаблон нельзя использовать таким же образом, как и элемент без шаблона того же типа. Элемент шаблона может только для создания связанных элементов (например, класс шаблона не может использоваться как тип типизированного элемента) или как часть спецификации другого шаблона (например, класс шаблона может специализировать другой класс шаблона).

Это означает, что в UML также должен быть шаблон OtherFoo, т.е. иметь подпись шаблона (с 0 параметрами). Чтобы затем правильно использовать шаблон операции вне области шаблона - то есть вызвать его в виде действия или аналогичного - сначала вам нужно привязать его к конкретной операции, которая используется вместо этого. В случае вашего примера это означает:

  • Привязка шаблона OtherFoo к (анонимному) связанному классу.
  • Шаблон операции привязки к операции в связанном классе.