Pytanie Jak przedstawić ogólny parametr w metodzie UML?


Muszę wykonać inżynierię wsteczną niektórych klas z aplikacji Java na schemat klasy UML 2. Jak dotąd tak dobrze, znalazłem sposób reprezentowania szablonów klas dla całej klasy, jak zaproponował tutaj Jon Skeet: Jaki jest prawidłowy sposób reprezentowania klas szablonów za pomocą języka UML?. Dzięki tym informacjom zaprojektowałem taką klasę:

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

Teraz mam dylemat, który próbuje odtworzyć klasę, która tylko metoda zawiera ogólny parametr:

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

Czy wiesz, jak osiągnąć niezależnie od narzędzia UML 2? Po prostu chcę zrozumieć tę koncepcję.


11
2018-05-13 15:43


pochodzenie


+1, dobre pytanie !!!!! - NINCOMPOOP


Odpowiedzi:


Nie wiem, jak to zrobić w wybranym przez ciebie narzędziu, ale na poziomie modelu działa dokładnie tak, jak w przypadku klas. Tworzysz operację szablonu ze swoim podpisem.

Rozdział 17.4.14 Nadbudowa UML2 określa to dla zapisu:

Parametry szablonu i powiązanie parametrów szablonu operacji szablonu to dwie listy pomiędzy nazwą pliku   działanie i parametry operacji.
  * <widoczność> <nazwa> '<' <lista szablonów-parametrów> '>' << lista powiązań-wyrażeń> >> >> ('<parametr>   [',' <Parametr>] ** ')' [':' <Ciąg-właściwości>]

W twoim przypadku najpierw zobaczmy prosty przypadek

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

To by odpowiadało

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

Twój oryginalny przykład wygląda na nieco bardziej skomplikowany, ponieważ parametr szablonu jest ograniczony do innej klasy, Porównywalnej, która z kolei jest również szablonem, którego parametr (nazywam go T1) jest z kolei powiązany z parametrem operacji. To nam daje

+ bar <T> Porównywalne <T1-> T >> (x: T, y: T): Boolean


Uwaga: (Trochę dogłębnej wędrówki naprzód) Szablony określone przez UML (i do pewnego stopnia w C ++) są zupełnie inną bestią z Generics w Javie. Wyglądają mniej więcej tak samo, ale są - czasem subtelne - różnice w ich semantykach, które mogą utrudnić dopasowanie tych dwóch elementów. Najważniejszy w UML jest następujący:

Szablon nie może być używany w taki sam sposób jak element inny niż szablon tego samego rodzaju. Element szablonu może   używane tylko do generowania powiązanych elementów (np. klasa szablonu nie może być używana jako typ wpisanego elementu) lub jako część   specyfikacji innego szablonu (np. klasa szablonu może specjalizować inną klasę szablonu).

Oznacza to, że w UML, OtherFoo musi również być szablonem - tzn. Mieć sygnaturę szablonu (z parametrami 0). Aby następnie użyć szablonu operacji poprawnie poza zasięgiem szablonu - tj. Wywołać go w działaniu lub podobnym - trzeba najpierw powiązać go z konkretną operacją, która jest używana zamiast tego. W przypadku Twojego przykładu oznacza to:

  1. Powiązanie szablonu OtherFoo z (anonimową) związaną klasą.
  2. Szablon operacji paska prętów do operacji w związanej klasie.

9
2018-05-14 08:56



Uważam, że ta informacja jest bardzo przydatna, jest jasna jak kryształ, dzięki. Będzie świetnie dla przyszłych czytelników, jeśli mógłbyś dodać grafikę dwóch ostatnich przykładów, tak jak zrobił to JonSkeet (sprawdź link na moje pytanie). - Luiggi Mendoza
to wyrażenie "+ bar <T> Porównywalne <T1-> T >> (x: T, y: T): Boolean"wydaje mi się dziwne, czy pierwszy większy znak po T naprawdę jest poprawny, czy nie powinien raczej być"->"? - IARI
Nie, "->" oznacza powiązanie parametru szablonu, natomiast ">" oznacza ograniczenie typu na parametrze szablonu. W tym przypadku nie oznacza to "wiązania T z Porównywalnymi", ale "ograniczania T do podtypów Porównywalnych". Aby uzyskać szczegółowe informacje, zobacz sekcję "Nadpisywanie UML" "Szablon klasyfikatora" / "Notacja" (sekcja 9.3.4 dla UML 2.5). - Carsten