2013-05-13 5 views
11

Devo eseguire il reverse engineering di alcune classi da un'applicazione Java in un diagramma di classe UML 2. Fin qui tutto bene, ho trovato come rappresentare i modelli di classe per l'intera classe come proposto da Jon Skeet qui: What is the correct way to represent template classes with UML?. Con queste informazioni, ho reverse engineering di una classe come questa:Come rappresentare un parametro generico nel metodo UML?

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

Ora ho un dilemma cercando di decodificare una classe che è solo un metodo contiene un parametro generico:

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

Sai come ottenere indipendentemente da qualsiasi strumento UML 2? Voglio solo capire il concetto.

+0

+1, buona domanda !!!!! – NINCOMPOOP

risposta

9

Non so come farlo nel tuo strumento di scelta, ma a livello di modello, funziona esattamente come per le classi. Si crea un'operazione di modello con la propria firma.

capitolo 17.4.14 del UML2 superstructure specifica questo per la notazione:

Il parametro parametri di modello e modello vincolante di un'operazione di template sono due liste in mezzo il nome dell'operazione ed i parametri dell'operazione .
* < visibilità> < nome> '<' < template-parameter-list> '>' '< <' < vincolante-espressione-list> '>>' '(' < parametro> [ '' < parametro >] ** ')' [ ':' < proprietà-string>]

Nel tuo caso, si deve prima vedere il semplice caso di

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

Ciò corrisponderebbe a

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

tuo esempio originale sembra un po 'più complicata, perché il parametro di template è vincolato ad un altro class, Comparable, che a sua volta è anche un template il cui parametro (lo chiamerò T1) è legato al parametro dell'operazione a sua volta. Questo ci dà

+ bar < T> Paragonabile < T1> T >> (x: T, y: T): booleano


Nota: (Un po 'di approfondimento avanti e indietro) I modelli specificati da UML (e in qualche modo C++) sono una bestia molto diversa da Generics in Java. Sembrano più o meno gli stessi, ma ci sono - a volte sottili - differenze nella loro semantica che possono rendere difficile abbinare i due.Il più importante in UML è questo:

Un modello non può essere utilizzato nello stesso modo di un elemento non modello dello stesso tipo. L'elemento modello può essere utilizzato solo per generare elementi associati (ad esempio, una classe modello non può essere utilizzata come tipo di un elemento digitato) o come parte della specifica di un altro modello (ad esempio, una classe modello può specializzare un'altra classe modello).

Ciò significa che in UML anche OtherFoo deve essere un modello, ovvero una firma modello (con 0 parametri). Al fine di utilizzare il modello operativo correttamente al di fuori dell'ambito del modello, ovvero chiamarlo in un'attività o simile, dovresti prima associarlo a un'operazione concreta, che viene invece utilizzata. Nel caso del tuo esempio, questo significa:

  1. Associazione di modello OtherFoo a una classe associata (anonima).
  2. Modello di operazione barra di rilegatura per un'operazione nella classe associata.
+1

Trovo che questa informazione sia molto utile, è chiara come il cristallo, grazie. Sarà fantastico per i futuri lettori se tu potessi aggiungere una grafica dei due ultimi esempi come ha fatto JonSkeet nella sua risposta (controlla il link sulla mia domanda). –

+0

quell'espressione "* + bar Comparable T >> (x: T, y: T): Booleano *" mi sembra strano. Il primo segno più grande dopo il T è davvero corretto? Non dovrebbe preferibilmente essere un "* -> *"? – IARI

+0

No, "->" denota un legame al parametro del modello, mentre ">" indica un vincolo di tipo sul parametro del modello. Quindi, in questo caso, non significa "associare T a Comparabile", ma "limitare T a sottotipi di Paragonabile". Vedere la sezione Sovrastruttura UML "Modello di classificazione"/"Notazione" (sezione 9.3.4 per UML 2.5) per i dettagli. – Carsten