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 da Collections);

  • 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 di Deck 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.