Class diagram
Concetto e struttura
Lo scopo del diagramma delle classi è fornire una vista statica del software (una sorta di “fotografia”) tramite la rappresentazione delle sue classi, corredate di metodi, attributi e relazioni.
I componenti identificabili in un diagramma delle classi sono:
- oggetti (Classi e Interfacce), rispettivamente riconoscibili per le lettere “C” e “I” nella parte superiore di ogni blocco.
Esiste anche il marcatore "A", che rappresenta una classe astratta. Inoltre, per i diagrammi UML relativi a Java si può usare la lettera "E" per rappresentare le classi enum;
- metodi: preceduti da un cerchio e dal tipo di valore ritornato;
- attributi: preceduti da un quadrato, corrispondono agli attributi dell’oggetto;
- relazioni: frecce che connettono gli oggetti.
È possibile rappresentare il cerchio dei metodi e il quadrato degli attributi con colori diversi in base alla
visibilità.
In Java, ad esempio, si può usare il verde per la visibilità public
,
l’arancio per protected
e il rosso per private
.
Valgono anche due regole sintattiche generali:
- se una scritta è in corsivo vuol dire che all’elemento corrispondente manca qualche definizione ed è dunque da considerarsi astratto;
- se una scritta è sottolineata vuol dire che l’elemento corrispondente (tipicamente metodo o attributo) è _ statico_, ovvero ha una visibilità a livello di classe e non a livello di istanza (i.e è possibile riferirsi a esso anche senza avere precedentemente istanziato la classe);
- se è incluso tra << >> allora si tratta di uno stereotipo, ovvero un nuovo elemento introdotto, può essere un attributo o un’interfaccia ad esempio, per questo specifico use-case che permette di estendere UML.
Relazioni
Nel diagramma delle classi UML esistono relazioni di diversi tipi. Ogni relazione viene rappresentata tramite una specifica forma di freccia:
- frecce tratteggiate (associazione): sono le più generiche e indicano una relazione “gerarchica” tra classi.
Ciò che c’è scritto nella classe da cui parte la freccia dipende dal codice che c’è nella classe a cui arriva la
freccia (e.g.
Deck
dipende daCollections
);
- frecce con rombo bianco (aggregazione): indica che all’interno della classe (e.g.
Deck
) è presente una collezione (in questo caso una lista) di (n) oggetti (Card
nell’esempio).
Questa relazione non è più tra classi, bensì tra istanze delle classi (e.g. un’istanza diDeck
aggrega da 0 a 52 carte);
- frecce con rombo nero (composizione): è utilizzata quando si hanno degli elementi che sono fisicamente
collegati tra loro (non solo virtualmente come nel caso delle carte).
Senza l’uno l’altro non può vivere e viceversa.
Un esempio può essere la rappresentazione del concetto di aereo: senza il motore l’aereo non può esistere, poiché il primo è un oggetto indispensabile per funzionamento del secondo. Specularmente, non accadrà mai che il motore passi a un altro aereo (a differenza delle carte che possono passare a più mani).
- frecce con la punta a triangolo (implementazione): una classe può implementare una classe astratta o un’interfaccia.
La direzione delle frecce è importante perché indica il senso della relazione.
Per esempio, il mazzo conosce le carte che contiene, ma le carte non conoscono i mazzi di cui fanno parte – è
per questo che la direzione della freccia va da Deck
a Card
e non viceversa.