Diagrammi classi UML: linee guida
In Visual Studio Ultimate è possibile utilizzare un diagramma classi UML per descrivere i tipi di dati e le relazioni separatamente dall'implementazione. Il diagramma viene utilizzato per concentrarsi sugli aspetti logici delle classi, anziché sull'implementazione. Per una dimostrazione video, vedere lo screencast sulla modellazione del dominio aziendale con i diagrammi classi.
Per creare un diagramma classi UML, scegliere Nuovo diagramma dal menu Architettura.
Nota
In questo argomento vengono illustrati i diagrammi classi UML. Esiste un altro tipo di diagramma classi, che è possibile creare e utilizzare per visualizzare il codice programma. Per ulteriori informazioni, vedere Progettazione e visualizzazione di classi e tipi.
In questo argomento
Utilizzo dei diagrammi classi UML
Procedura di base per la creazione di diagrammi classi
Utilizzo di classi, interfacce ed enumerazioni
Attributi e operazioni
Creazione e utilizzo di associazioni
Ereditarietà
Tipi di modello
Definizione degli spazi dei nomi con pacchetti
Utilizzo dei diagrammi classi UML
È possibile utilizzare un diagramma classi UML per vari scopi:
Per fornire una descrizione indipendente dall'implementazione dei tipi utilizzati in un sistema e passati tra i componenti.
Ad esempio, il tipo Ordinazione pasto potrebbe essere implementato nel codice .NET a livello aziendale, in XML in corrispondenza delle interfacce tra componenti, in SQL nel database e in HTML nell'interfaccia utente. Sebbene tali implementazioni siano diverse nei dettagli, la relazione tra un tipo Ordinazione pasto e altri tipi, ad esempio Menu e Pagamento, è sempre la stessa. Il diagramma classi UML consente di illustrare tali relazioni separatamente dalle implementazioni.
Per chiarire il glossario di termini utilizzati per la comunicazione tra l'applicazione e gli utenti e nelle descrizioni delle esigenze degli utenti. Per ulteriori informazioni, vedere Modellazione dei requisiti utente.
Si considerino ad esempio le descrizioni di storie utente, di casi di utilizzo o di altri requisiti di un'applicazione ristorante. In tali descrizioni vengono utilizzati termini come Menu, Ordine, Pasto, Prezzo, Pagamento e così via. È possibile creare un diagramma classi UML che definisca le relazioni tra questi termini riducendo in questo modo il rischio di incoerenze nelle descrizioni dei requisiti nonché nell'interfaccia utente e nei documenti della guida.
Relazione con altri diagrammi
Un diagramma classi UML viene in genere creato con altri diagrammi di modellazione per fornire descrizioni dei tipi utilizzati. In ogni caso, la rappresentazione fisica dei tipi non è implicita nei diagrammi.
Tipo di diagramma |
Elemento descritto nel diagramma classi UML |
---|---|
Diagramma di attività |
Tipo di dati che passano attraverso un nodo oggetto. Tipi di pin di input e output e di nodi parametro attività. Per ulteriori informazioni, vedere Diagrammi di attività UML: linee guida. |
Diagramma di sequenza |
Tipi di parametri e di valori restituiti di messaggi. Tipi di linee di vita. La classe di una linea di vita deve includere le operazioni per tutti i messaggi che può ricevere. Per ulteriori informazioni, vedere Diagrammi di sequenza UML: linee guida. |
Diagramma dei componenti |
Interfacce di componenti con le relative operazioni. È inoltre possibile descrivere un componente completo come classe. Per ulteriori informazioni, vedere Diagrammi dei componenti UML: linee guida. |
Diagramma caso di utilizzo |
Tipi indicati nelle descrizioni degli obiettivi e dei passaggi di un caso di utilizzo. Per ulteriori informazioni, vedere Diagrammi casi di utilizzo UML: linee guida. |
Procedura di base per la creazione di diagrammi classi
Per informazioni di riferimento sugli elementi presenti nei diagrammi classi UML, vedere Diagrammi classi UML: riferimento.
Nota
I passaggi dettagliati per la creazione dei diagrammi di modellazione vengono descritti in Procedura: modificare un modello UML e i diagrammi.
Per creare un diagramma classi UML
Scegliere Nuovo diagramma dal menu Architettura.
Nel riquadro Modelli fare clic su Diagramma classe UML.
Assegnare un nome al diagramma.
In Aggiungi a progetto di modello selezionare un progetto di modello esistente nella soluzione o scegliere Crea nuovo progetto di modello, quindi fare clic su OK.
Verrà visualizzato un nuovo diagramma classi con la casella degli strumenti Diagramma classi UML. La casella degli strumenti contiene le relazioni e gli elementi necessari.
Per creare un tipo di diagramma classi UML
Per creare un tipo, fare clic sullo strumento Classe, Interfaccia o Enumerazione nella casella degli strumenti, quindi fare clic su una parte vuota del diagramma.
Per aggiungere attributi o operazioni ai tipi oppure valori letterali a un'enumerazione, fare clic sull'intestazione Attributi, Operazioni o Valori letterali nel tipo e premere INVIO.
È possibile scrivere una firma, ad esempio f(x:Boolean):Integer. Per ulteriori informazioni, vedere Attributi e operazioni.
Per aggiungere rapidamente diversi elementi, premere INVIO due volte alla fine di ogni elemento. È possibile utilizzare i tasti di direzione per spostarsi verso l'alto e verso il basso nell'elenco.
Per espandere o comprimere un tipo, fare clic sull'icona con la freccia di espansione in alto a sinistra. È inoltre possibile espandere e comprimere le sezioni Attributi e Operazioni di una classe o di un'interfaccia.
Per creare collegamenti di associazioni, ereditarietà o dipendenza tra i tipi, fare clic sullo strumento di relazione appropriato, quindi sul tipo di origine e infine sul tipo di destinazione.
Per creare i tipi in un pacchetto, creare un pacchetto utilizzando lo strumento Pacchetto, quindi creare i nuovi tipi e pacchetti all'interno del pacchetto. È inoltre possibile utilizzare il comando copia per copiare i tipi e incollarli in un pacchetto.
Ogni diagramma è una visualizzazione in un modello condiviso tra altri diagrammi nello stesso progetto. Per una visualizzazione della struttura ad albero del modello completo scegliere Altre finestre dal menu Visualizza, quindi fare clic su Esplora modelli UML.
Utilizzo di classi, interfacce ed enumerazioni
Sono disponibili tre tipi standard di classificatore nella casella degli strumenti, definiti tipi in tutto il documento.
Utilizzare le classi (1) per rappresentare i dati o i tipi di oggetto per la maggior parte degli scopi.
Utilizzare le interfacce (2) in un contesto in cui è necessario operare una distinzione tra interfacce pure e classi concrete contenenti implementazioni interne. Questa differenza è utile quando lo scopo del diagramma è descrivere un'implementazione del software. È meno utile quando si modellano dati passivi o qualora si definiscano concetti utilizzati per descrivere i requisiti utente.
Utilizzare un'enumerazione (3) per rappresentare un tipo che dispone di un numero limitato di valori letterali, ad esempio Stop e Go.
Aggiungere i valori letterali all'enumerazione. Assegnare a ognuno un nome distinto.
Se si desidera, è inoltre possibile fornire un valore numerico per ogni valore letterale. Fare clic con il pulsante destro del mouse sul valore letterale nell'enumerazione, scegliere Proprietà, quindi digitare un numero nel campo Valore della finestra Proprietà.
Assegnare a ogni tipo un nome univoco.
Recupero dei tipi da altri diagrammi
È possibile visualizzare i tipi di un altro diagramma nel diagramma classi UML.
Altro tipo di diagramma |
Procedura per il recupero dei tipi dall'altro diagramma |
---|---|
Diagramma classi UML |
È possibile visualizzare una classe in più diagrammi classi UML. Dopo avere creato una classe in un diagramma, trascinarla da Esplora modelli UML nell'altro diagramma. Questa operazione è utile se si desidera che ogni diagramma si concentri su un gruppo di relazioni specifico. È possibile ad esempio mostrare le associazioni tra Ordinazione pasto e Menu ristorante in un diagramma e le associazioni tra Ordinazione pasto e Pagamento nell'altro diagramma. |
Diagramma dei componenti |
Se sono stati definiti componenti in un diagramma dei componenti, è possibile trascinare un componente da Esplora modelli UML nel diagramma classi. Il componente verrà visualizzato come classe. Per ulteriori informazioni, vedere Diagrammi dei componenti UML: linee guida. |
Diagramma di sequenza UML |
È possibile creare classi e interfacce dalle linee di vita in un diagramma di sequenza, quindi trascinare la classe da Esplora modelli UML in un diagramma classi UML. Ogni linea di vita in un diagramma di sequenza rappresenta un'istanza di un oggetto, un componente o un attore. Per creare una classe da una linea di vita, fare clic con il pulsante destro del mouse sulla linea di vita, quindi scegliere Crea classe o Crea interfaccia. Per ulteriori informazioni, vedere Diagrammi di sequenza UML: linee guida. |
Attributi e operazioni
Un attributo (4) è un valore denominato che ogni istanza di un tipo può avere. L'accesso a un attributo non modifica lo stato dell'istanza.
Un'operazione (5) è un metodo o una funzione che le istanze del tipo possono eseguire. Può restituire un valore. Se la proprietà isQuery è true, non può modificare lo stato dell'istanza.
Per aggiungere un attributo o un'operazione a un tipo, fare clic con il pulsante destro del mouse sul tipo, scegliere Aggiungi, quindi scegliere Attributo o Operazione.
Per visualizzare le relative proprietà, fare clic con il pulsante destro del mouse sull'attributo o sull'operazione, quindi scegliere Proprietà. Le proprietà verranno visualizzate nella finestra Proprietà.
Per visualizzare le proprietà dei parametri di un'operazione, fare clic su […] nella proprietà Parameters. Verrà visualizzata una nuova finestra di dialogo delle proprietà.
Per informazioni dettagliate su tutte le proprietà che è possibile impostare, vedere gli argomenti seguenti:
Tipi di attributi e di operazioni
Ogni tipo di un attributo o di un'operazione e ogni tipo di parametro può essere uno dei valori seguenti:
(nessuno): è possibile lasciare un tipo non specificato nella firma omettendo i due punti (:) che lo precedono.
Uno dei tipi primitivi standard: Booleano, Numero intero, Stringa.
Un tipo definito nel modello.
Un valore con parametri di un tipo di modello, scritto Modello<Parametro>. Vedere Tipi di modello.
È inoltre possibile scrivere il nome di un tipo che non è stato ancora definito nel modello. Il nome verrà elencato in Tipi non specificati in Esplora modelli UML.
Nota
Se successivamente si definisce una classe o un'interfaccia di quel nome nel modello, gli attributi e le operazioni meno recenti faranno ancora riferimento all'elemento in Tipi non specificati. Se si desidera fare in modo che facciano riferimento alla nuova classe, è necessario visitare ogni attributo o operazione e reimpostare il tipo, selezionando la nuova classe dal menu a discesa.
Più tipi
È possibile impostare una molteplicità di tipi di attributo, operazione o parametro.
I valori consentiti sono:
Molteplicità |
Elemento contenuto nell'attributo, nel parametro o nel valore restituito |
---|---|
[1] |
Un valore del tipo specificato. Questa è l'impostazione predefinita. |
[0..1] |
Null o un valore del tipo specificato. |
[*] |
Un insieme di un numero qualsiasi di istanze del tipo specificato. |
[1..*] |
Un insieme di almeno un'istanza del tipo specificato. |
[n..m] |
Un insieme di istanze tra n e m del tipo specificato. |
Se la molteplicità è maggiore di 1, è inoltre possibile impostare le proprietà seguenti:
IsOrdered: se true, l'insieme ha un ordine definito.
IsUnique: se true, non sono presenti valori duplicati nell'insieme.
Visibilità
La visibilità indica se è possibile accedere all'attributo o all'operazione dall'esterno della definizione di classe. I valori consentiti sono:
Nome |
Forma breve |
Significato |
---|---|---|
Public |
+ |
Accessibile da tutti gli altri tipi. |
Private |
- |
Accessibile solo alla definizione interna di questo tipo. |
Pacchetto |
~ |
Accessibile solo all'interno del pacchetto che contiene questo tipo e in tutti i pacchetti che lo importano in modo esplicito. Vedere Definizione di spazi dei nomi e pacchetti. |
Protected |
# |
Accessibile solo a questo tipo e ai tipi che ereditano da esso. Vedere Ereditarietà. |
Impostazione della firma di un attributo o di un'operazione
La firma di un attributo o di un'operazione è un insieme di proprietà quali visibilità, nome, parametri (per le operazioni) e tipo.
È possibile scrivere una firma direttamente nel diagramma. Fare clic sull'operazione o sull'attributo per selezionarlo, quindi farvi di nuovo clic.
Scrivere la firma utilizzando il formato seguente:
visibility attribute-name : Type
- oppure -
visibility operation-name (parameter1 : Type1, ...) : Type
Ad esempio:
+ AddItem (item : MenuItem, quantity : Integer) : Boolean
Utilizzare la forma breve di visibilità. Il valore predefinito è + (pubblico).
Ogni tipo può essere costituito da tipi definiti nel modello, da tipi standard come Numero intero o Stringa o dal nome di un nuovo tipo non ancora definito.
Nota
Se si scrive un nome senza un tipo in un elenco di parametri, esso indica il nome del parametro anziché il tipo. In questo esempio MenuItem e Integer diventano i nomi di due parametri con tipi non specificati:
AddItem(MenuItem, Integer) /* parameter names, not types! */
Per impostare la molteplicità di un tipo in una firma, scrivere la molteplicità in parentesi quadrate dopo il nome del tipo, ad esempio:
+ AddItems (items : MenuItem [1..*])
+ MenuContent : MenuItem [*]
Se l'operazione o l'attributo è statico, il nome verrà visualizzato sottolineato nella firma. Se è astratto, il nome verrà visualizzato in corsivo.
Tuttavia, nella finestra Proprietà è possibile impostare solo le proprietà Is Static e Is Abstract.
Firma completa
Quando si modifica la firma di un attributo o di un'operazione, alcune proprietà aggiuntive potrebbero venire visualizzate alla fine della riga e dopo ogni parametro. Vengono inoltre racchiuse tra parentesi graffe {...}. È possibile modificare o aggiungere tali proprietà. Di seguito è riportato un esempio:
+ AddItems (items: MenuItem [1..*] {unique, ordered})
+ GetItems (filter: String) : MenuItem [*] {ordered, query}
Di seguito sono riportate le proprietà:
Nella firma |
Proprietà |
Significato |
---|---|---|
unique |
Univoco |
Non sono presenti valori duplicati nell'insieme. Si applica ai tipi con molteplicità maggiore di 1. |
ordered |
Is Ordered |
L'insieme è una sequenza. Se false, non è stato definito il primo elemento. Si applica ai tipi con molteplicità maggiore di 1. |
query |
Is Query |
L'operazione non modifica lo stato dell'istanza. Si applica solo alle operazioni. |
/ |
Is Derived |
L'attributo viene calcolato dai valori degli altri attributi o associazioni. Prima del nome di un attributo viene visualizzato "/". Ad esempio:
|
In genere, la firma completa viene visualizzata nel diagramma solo durante la modifica. Al termine della modifica, le proprietà aggiuntive vengono nascoste. Se si desidera visualizzare sempre la firma completa, fare clic con il pulsante destro del mouse sul tipo, quindi scegliere Mostra firma completa.
Creazione e utilizzo di associazioni
Utilizzare un'associazione per rappresentare qualsiasi tipo di collegamento tra due elementi, indipendentemente dal modo in cui il collegamento viene implementato nel software. È possibile ad esempio utilizzare un'associazione per rappresentare un puntatore in C#, una relazione in un database o un riferimento incrociato da una parte di un file XML all'altra. Può rappresentare un'associazione tra oggetti nel mondo reale, quali la terra e il sole. L'associazione non specifica il modo in cui il collegamento è rappresentato, ma solo che l'informazione esiste.
Proprietà di un'associazione
Dopo avere creato un'associazione, impostarne le proprietà. Fare clic con il pulsante destro del mouse sull'associazione, quindi scegliere Proprietà.
Oltre alle proprietà dell'intera associazione, ogni ruolo, ovvero ogni estremità dell'associazione, dispone di alcune proprietà personalizzate. Per visualizzarle, espandere le proprietà Primo ruolo e Secondo ruolo.
Alcune proprietà di ogni ruolo sono visibili direttamente nel diagramma. Esse sono:
Role name. Viene visualizzato all'estremità appropriata dell'associazione nel diagramma. È possibile impostarlo nel diagramma o nella finestra Proprietà.
Molteplicità, che per impostazione predefinita corrisponde a 1. Viene anche visualizzato nel diagramma accanto all'estremità appropriata dell'associazione.
Aggregation. Questo valore viene visualizzato come forma di rombo a un'estremità del connettore. È possibile utilizzarlo per indicare che le istanze nel ruolo di aggregazione contengono le istanze dell'altro ruolo.
Is Navigable. Se true per un solo ruolo, viene visualizzata una freccia nella direzione esplorabile. È possibile utilizzare questo valore per indicare l'esplorabilità di collegamenti e relazioni del database nel software.
Per informazioni dettagliate su queste e altre proprietà, vedere Proprietà di associazioni nei diagrammi classi UML.
Esplorabilità
Quando si disegna un'associazione, viene visualizzata una freccia a un'estremità per indicare che è esplorabile in quella direzione. Ciò risulta utile se il diagramma classi rappresenta classi del software e le associazioni rappresentano puntatori o riferimenti. Quando tuttavia si utilizza il diagramma classi per rappresentare entità e relazioni o concetti aziendali, è meno importante rappresentare l'esplorabilità. In questo caso, è preferibile disegnare le associazioni senza frecce. È possibile eseguire questa operazione impostando su True la proprietà Is Navigable a entrambe le estremità dell'associazione. Per semplificare tale operazione, è possibile scaricare l'esempio di codice relativo alla modellazione di un dominio UML.
Attributi e associazioni
Un'associazione è la rappresentazione grafica di un attributo. Ad esempio, anziché creare una classe Ristorante con un attributo di tipo Menu, è possibile creare un'associazione da Ristorante a Menu.
Ogni nome di attributo diventa il nome di un ruolo. Viene visualizzato all'estremità opposta dell'associazione del tipo proprietario. Osservare, ad esempio, myMenu nell'illustrazione.
In genere, è consigliabile utilizzare gli attributi solo per i tipi che non vengono inseriti nel diagramma, ad esempio i tipi primitivi.
Ereditarietà
Utilizzare lo strumento Ereditarietà per creare le relazioni seguenti:
Una relazione generalizzazione tra un tipo specializzato e un tipo generale
- oppure -
Una relazione realizzazione tra una classe e un'interfaccia da essa implementata.
Non è possibile creare cicli nelle relazioni di ereditarietà.
Generalizzazione
Con Generalizzazione si intende che il tipo specializzato o derivato eredita attributi, operazioni e associazioni del tipo generale o di base.
Il tipo generale viene visualizzato all'estremità della freccia della relazione.
Le operazioni e gli attributi ereditati non vengono in genere mostrati nei tipi specializzati. È possibile però aggiungere le operazioni ereditate nell'elenco di operazioni del tipo specializzato. Ciò si rivela utile se si desidera eseguire l'override di alcune proprietà di un'operazione nel tipo specializzato o se si desidera indicare che il codice di implementazione deve eseguire tale operazione.
Per eseguire l'override della definizione di un'operazione in un tipo specializzato
Fare clic sulla relazione generalizzazione.
Apparirà evidenziata con un tag azioni accanto.
Fare clic sul tag azioni, quindi su Override operazioni.
Verrà visualizzata la finestra di dialogo Override operazioni.
Selezionare le operazioni che si desidera visualizzare nel tipo specializzato, quindi fare clic su OK.
Le operazioni selezionate verranno visualizzate nel tipo specializzato.
Realizzazione
Con Realizzazione si intende che una classe implementa gli attributi e le operazioni specificati dall'interfaccia. L'interfaccia si trova all'estremità della freccia del connettore.
Quando si crea un connettore di realizzazione, le operazioni dell'interfaccia vengono replicate automaticamente nella classe di realizzazione. Se vengono aggiunte nuove operazioni a un'interfaccia, esse vengono replicate nelle relative classi di realizzazione.
Dopo avere creato una relazione realizzazione, è possibile convertirla in notazione simbolo. Fare clic con il pulsante destro del mouse sulla relazione e scegliere Mostra come simbolo.
In questo modo è possibile rappresentare le interfacce implementate da una classe senza ingombrare i diagrammi classi con collegamenti di realizzazione. È inoltre possibile mostrare le classi e l'interfaccia da esse implementata in diagrammi separati.
Tipi di modello
È possibile definire un tipo generico o di modello contenente parametri di altri tipi o valori.
È possibile ad esempio creare un Dizionario generico contenente parametri dei tipi chiave e valore:
Per creare un tipo di modello
Creare una classe o un'interfaccia che diventerà il tipo di modello. Assegnargli un nome, ad esempio Dictionary.
Fare clic con il pulsante destro del mouse sul nuovo tipo, quindi scegliere Proprietà.
Nella finestra Proprietà fare clic su [...] nel campo Template Parameters.
Verrà visualizzata la finestra di dialogo Editor insieme parametri di modello.
Scegliere Aggiungi.
Impostare la proprietà nome sul nome di un parametro del tipo di modello, ad esempio Key.
Impostare il tipo di parametro. Il valore predefinito è Classe.
Se si desidera che il parametro accetti solo classi derivate di una classe base specifica, impostare il Valore vincolato sulla classe base desiderata.
Aggiungere tutti i parametri che si desidera, quindi fare clic su OK.
Aggiungere gli attributi e le operazioni al tipo di modello come per le altre classi.
Nella definizione di attributi e operazioni è possibile utilizzare parametri di tipo Classe, Interfaccia o Enumerazione. Utilizzando ad esempio le classi di parametri Key e Value, è possibile definire in Dictionary l'operazione seguente:
Get(k : Key) : Value
È possibile utilizzare un parametro di tipo Numero intero come limite in una molteplicità. È possibile ad esempio utilizzare il parametro numero intero max per definire la molteplicità di un attributo come [0..max].
Dopo avere creato i tipi di modello, è possibile utilizzarli per definire le associazioni del modello:
Per utilizzare un tipo di modello
Creare un nuovo tipo, ad esempio AddressTable.
Fare clic con il pulsante destro del mouse sul nuovo tipo, quindi scegliere Proprietà.
Nella proprietà Template Binding selezionare dall'elenco a discesa il tipo di modello, ad esempio Dictionary.
Espandere la proprietà Template Binding.
Verrà visualizzata una riga per ogni parametro del tipo di modello.
Impostare ogni parametro su un valore appropriato. Impostare ad esempio il parametro Key su una classe denominata Name.
Pacchetti
In un diagrammi classi UML è possibile visualizzare i pacchetti. Un pacchetto è un contenitore per altri elementi del modello. È possibile creare qualsiasi elemento in un pacchetto. Quando nel diagramma si sposta un pacchetto, si sposteranno anche gli elementi in esso contenuti.
È possibile utilizzare il controllo di compressione/espansione per nascondere o visualizzare il contenuto del pacchetto.
Per ulteriori informazioni, vedere Definizione di pacchetti e spazi dei nomi.
Vedere anche
Riferimenti
Diagrammi di sequenza UML: riferimenti
Concetti
Procedura: modificare un modello UML e i diagrammi
Diagrammi classi UML: riferimento
Modellazione dei requisiti utente
Diagrammi dei componenti UML: riferimento
Diagrammi casi di utilizzo UML: riferimento
Diagrammi dei componenti UML: riferimento
Altre risorse
Video relativo alla sulla modellazione del dominio aziendale con i diagrammi classi
Video sull'individuazione di responsabilità tramite diagrammi classi