• Non ci sono risultati.

CAPITOLO 5 UNIFIED MODELING LANGUAGE UML-

5.3.1 D IAGRAMMI

5.3.1.1 Diagramma delle classi

Il diagramma delle classi è il modello UML più usato e quello che si presta a descrivere il maggior numero dei concetti. Fornisce una vista grafica e statica della struttura del sistema, rappresenta le classi con attributi, metodi, relazioni e vincoli che si applicano ai collegamenti tra gli oggetti. Sono fondamentali in tutti i linguaggi OO ed importanti in tutte le fasi di sviluppo. Vengono usati anche per avere una visione generale dello scheletro del sistema, senza scendere nei dettagli.

Una classe è definita da un nome, degli attributi e da dei metodi, in UML è rappresentata da un rettangolo diviso in 3 parti:

Nella prima parte del rettangolo viene riportato il nome della classe che deve avere l’iniziale maiuscola e scritto in grassetto; nella seconda parte ci sono gli attributi (proprietà) della classe scritti seguendo la sintassi:

visibilità nome: tipo = default {stringa di proprietà}.

La visibilità indica la possibilità che le classi hanno di utilizzare attributi e metodi di altre classi, sono possibili tre livelli

• Pubblico: simbolo grafico +, gli attributi od i metodi pubblici possono essere usati da tutte le altre classi

• Protetto: simbolo grafico #, gli attributi od i metodi protetti possono essere usati da tutte le classi che derivano dalla classe in cui sono definiti

• Privato: simbolo grafico -, gli attributi od i metodi privati possono essere usati solo dalla classe dove sono definiti.

Il nome, unico elemento necessario, corrisponde al nome di un campo usato nel linguaggio di programmazione. Il Tipo è il tipo di dato, default è il valore dell’attributo in un oggetto appena creato, nella stringa di proprietà ci sono caratteristiche aggiuntive.

NomeClasse

- nomeAttributo:tipo=valore

+ nomeMetodo(parametri):tipo ritorno

CAPITOLO 5 UNIFIED MODELING LANGUAGE

Nella terza parte del rettangolo ci sono i metodi che sono le azioni (operazioni) che quella classe può eseguire. Sono invocati su un oggetto e corrispondono alla dichiarazione di una procedura. Sono scritti seguendo la sintassi:

visibilità nome (lista parametri) : tipo ritorno {stringa di proprietà}

La visibilità può essere pubblica, privata o protetta, il nome è una stringa, la lista parametri sono i parametri dell’operazione e si esprime con la sintassi direzione nome : tipo, la direzione può essere 'in', per parametro in input, o 'out', per parametro di output, il tipo è il tipo del parametro; mentre il tipo di ritorno indica il tipo di valore restituito dall’operazione, se esiste. Con la stringa di proprietà vengono indicate caratteristiche aggiuntive che si applicano all’operazione.

Le operazioni possono essere:

• Query: leggono dei valori dalle classi senza variare lo stato del sistema, non hanno effetti. Si indicano con il constraint {query}

• Modificatori: possono cambiare lo stato del sistema

Alle classi si possono aggiungere delle informazioni addizionali che sono i constraint e le note. I primi definiscono una o più regole che la classe deve rispettare, si definiscono inserendo del testo racchiuso tra parentesi graffe. Le seconde si usano per commentare uno o più elementi del diagramma5, Possono essere disegnate da sole o si possono collegare agli elementi cui fanno riferimento con una linea tratteggiata. Per individuare in nodo più diretto dove termina la linea, si aggiunge un cerchietto vuoto alla sua estremità. I commenti possono essere scritti anche all’interno di un elemento nel diagramma ed il testo è preceduto da due trattini. Spesso è utile indicare su un diagramma le responsabilità di una classe, aggiungendola sotto forma di stringa di commento in un apposito scomparto della classe. È possibile dare un nome esplicito allo scomparto.

Le relazioni tra le classi possono essere:

• Associazioni: descrivono una connessione concettuale tra istanze di classi, sono rappresentate da una linea che connette le classi coinvolte e da un nome scritto accanto alla linea, può anche essere riportato,per specificare meglio l’associazione, il ruolo della classe nella relazione, riportando il nome del ruolo vicino alla classe ed all’associazione cui si riferisce.

CAPITOLO 5 UNIFIED MODELING LANGUAGE

Figura 26 Associazione tra classi

Per le associazioni complesse, che hanno attributi ed operazioni, si può definire una classe associazione, indicata da un rettangolo ed unita alla linea dell’associazione corrispondente da una linea tratteggiata. A volte è necessario definire anche una o più regole (constraits) per l’associazione. Per descrivere il numero di oggetti di una classe che sono in associazione con gli oggetti dell’altra classe si usa il concetto di molteplicità. Questa può essere un intero o un intervallo di interi. Viene indicata vicino al rettangolo della classe sulla parte superiore della linea che rappresenta l’associazione (0 nessuna istanza, 1 una istanza, m numero intero di istanze, 0..1 da zero ad una istanza, n…m da n a m istanze, * numero di istanze pari a qualsiasi intero non negativo, 0..* da zero ad un numero intero qualsiasi non negativo, 1…* da una istanza ad un numero intero qualsiasi non negativo)6. Le associazioni che vanno da una classe a se stessa sono dette associazioni riflessive.

• Generalizzazioni sono delle particolari associazioni che sfruttano il concetto di ereditarietà. Una classe può ereditare attributi e metodi da un'altra classe che viene detta classe padre (o super classe). Questo permette di avere una classe generica (padre) e di derivare da essa per ereditarietà tutte le altre classi (dette figlie). La classe padre definisce tutti quegli attributi e metodi che le classi figlie hanno in comune. Alle classi figlie possono poi essere aggiunti attributi e metodi propri della particolare classe. I metodi delle classi figlie possono anche sovrascrivere i metodi della superclasse. Si rappresentano con una freccia che unisce le due classi con il verso dalla classe figlia alla classe padre.

6

UML 1.x permetteva l’uso di molteplicità discontinue per indicare possibilità distinte ( 2,5 ad esempio potrebbe essere la molteplicità dei posti su una macchina, 2 se è sportiva, 5 nel caso normale). In UML 2.0 sono state eliminate perché venivano usate raramente.

CAPITOLO 5 UNIFIED MODELING LANGUAGE

Figura 27 Ereditarietà tra classi

All'apice di una catena di associazioni di ereditarietà si può trovare una "classe astratta" che non avrà delle istanze corrispondenti a delle implementazioni di oggetti ma serve solo per sfruttare al meglio l'ereditarietà. Il nome di una classe astratta va scritto in italico.

• Composizioni: usate per indicare una classe (detta intero-whole) costituita da altre classi (dette parti-part). Ciascuna parte può appartenere ad un solo intero7. Viene rappresentata con la classe intero in alto e le classi parte sotto, unite da delle linee che terminano a rombo pieno nel lato della classe intero.

Figura 28 Composizione

• Dipendenza di sostituzione: (substitution dependency) è un tipo di realizzazione che implica sostituibilità al runtime, introdotta con UML 2.0. Non è basata sul concetto di specializzazione, quindi non implica ereditarietà della struttura, ma solo conformità ai contratti pubblici disponibili

CAPITOLO 5 UNIFIED MODELING LANGUAGE

Figura 29 Sostituizione

UML fornisce le dipendenze8 tra ogni sorta di elementi in questo modo è possibile specificare tutti i punti in cui cambiare un elemento potrebbe coinvolgerne altri. L’elemento Fornitore, supplier, è l’elemento la cui modifica può causare un cambiamento di un altro elemento detto cliente. UML prevede molte tipologie di dipendenza, ognuna con una particolare semantica e diverse parole chiave (Call, il cliente chiama un’operazione del fornitore; Create il cliente crea un’istanza del tipo fornitore; Derive: il cliente è derivato del fornitore; Instantiate: il cliente è un’isatnza del fornitore; Permit; Realize; Refine; Substitute; Trace; Use). L’uso più comune delle dipendenze legate alle classi è per indicare una relazione temporanea, ad esempio quando un oggetto viene passato come parametro. In questi casi si possono usare indicazioni come «parameter», «local» e «global»9.

UML tende ad usare al posto dei simboli delle parole chiave, questo perché se ci sono molti simboli diventa difficile ricordarli tutti. Se si ha la necessità di modellare qualcosa ed il costrutto relativo non è incluso, ma ce n’è uno simile, si può usare la notazione esistente e marcarla con una parola chiave per indicare la variazione. Le parole chiave vengono racchiuse tra virgolette uncinate, o si possono usare delle icone speciali, ma è difficile che tutti ricordino correttamente il loro significato, oppure vengono racchiuse tra parentesi graffe.10

In UML 2.0 le interfacce sono classi astratte (rappresentate attraverso il nome in corsivo) che offrono i loro metodi ad altre classi e non hanno attributi. Le classi possono avere due tipi di rapporti con le interfacce:

• fornita (provided interface) è un servizio che una classe rende disponibile ad altre classi

8

Per le classi la dipendenza può essere causata da molti fattori una classe che chiama dei metodi dell’altra o la usa come tipo di un suo campo, o la prevede come tipo di qualche parametro di una sua operazione.

9 Queste parole chiave non fanno parte formalmente di UML 2, venivano usate in UML 1 per indicare la temporaneità

dei collegamenti, non delle proprietà. 10

UML 1 usava le virgolette uncinate per gli stereotipi, mentre in UML 2, questi per evidenziare la differenza con le parole chiave. Gli stereotipi sono usati all’interno dei profili. Un profilo per mezzo di stereotipi estendono una parte di UML adattandola ad un particolare dominio, come la modellazione di business.

CAPITOLO 5 UNIFIED MODELING LANGUAGE

• richiesta (required interface) è un servizio fornito da altri e di cui la classe necessita per operare opportunamente

Il collegamento tra una classe ed una interfaccia si chiama realizzazione ed è rappresentato da una linea che termina con un cerchio chiuso (interfaccia fornita) o due archetti (interfaccia richiesta).

Figura 30 Intrfaccia di richiesta e fornita

È stato introdotto il nuovo concetto di porta, caratteristica di un classificatore che specifica un punto di interazione tra il classificatore ed il suo ambiente o tra il comportamento del classificatore e le sue parti interne in termini di interfacce richieste e fornite. Poiché una classe può essere utilizzata in differenti modi (i diversi interlocutori possono richiedere insieme di servizi differenti) la porta permette di raggruppare le interfacce appartenenti o destinate a particolari interlocutori, fornendo una vista specifica di una classe. Le porte sono connesse con altre porte tramite connettori. Una porta connette le parti interni di una classe con il suo ambiente.

Figura 31 Porta

UML 2.0 ha introdotto l’uso della X per indicare l’assenza di navigabilità, ha cambiato la notazione per le classi attive (classe le cui istanze sono oggetti attivi)11

CAPITOLO 5 UNIFIED MODELING LANGUAGE

Figura 32 Classe Attiva

I Class Diagram mettono a disposizione notazioni aggiuntive usate per rappresentare concetti avanzati che servono solo in alcuni casi specifici.

Documenti correlati