2013-05-13 4 views
11

Мне нужно перепроектировать некоторые классы из приложения Java в диаграмму классов UML 2. Пока что так хорошо, я нашел, как представлять шаблоны классов для всего класса, предложенные Джоном Скитом здесь: What is the correct way to represent template classes with UML?. С помощью этой информации, я обратной инженерии класс вроде этого:Как представить общий параметр в методе 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? Я просто хочу понять концепцию.

+0

+1, Хороший вопрос !!!!! – NINCOMPOOP

ответ

9

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

Глава 17.4.14 в UML2 superstructure определяет это для обозначения:

Параметры шаблона и шаблона параметров связывания операции шаблона являются два списка в между именем операции и параметры работы ,
* < видимости> < имени> '<' < шаблона-список параметров> '>' '< <' < связывание-список_выражений> '>>' '(' < параметр> [ '' < параметра >] ** ')' [ ':' < строка свойств>]

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

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

Это будет соответствовать

+ бар < T> (х: Т, у: Т): Boolean

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

+ бар < T> Сопоставимые < T1-> T >> (х: Т, у: Т): Boolean


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

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

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

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

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

+0

это выражение "* + bar Сопоставимый T >> (x: T, y: T): Boolean *" выглядит странно для меня. Является ли первый большой знак после того, как T действительно прав? Не должно ли это быть «* -> *»? – IARI

+0

Нет, "->" обозначает привязку параметра шаблона, тогда как ">" обозначает ограничение типа для параметра шаблона. Таким образом, в этом случае это не означает «связывать T с сопоставимым», но «ограничивать T подтипами Comparable». Подробнее см. Раздел «Надстройка UML» «Шаблон классификатора»/«Обозначение» (раздел 9.3.4 для UML 2.5). – Carsten

Смежные вопросы