UML, introduzione ai diagrammi delle classi, di sequenza, di stato

Transcript

UML, introduzione ai diagrammi delle classi, di sequenza, di stato
Principi di Progettazione del Software
a.a. 2016-2017
UML: introduzione ai diagrammi delle classi, di
sequenza, di stato
Prof. Luca Mainetti
Università del Salento
Obiettivi della lezione
■  Mostrare in modo operativo alcune tecniche per identificare
oggetti e classi di un sistema software
■  Introdurre tre tipologie fondamentali di diagrammi UML che
utilizziamo per documentare le scelte prese a proposito
degli oggetti e delle classi identificate
–  Diagrammi delle classi
–  Diagrammi di sequenza
–  Diagrammi di stato
■  Mostrare relazioni tra diagrammi UML (progettazione) e
codice Java corrispondente (realizzazione)
Introduzione ai diagrammi classi, sequenza, stato
2
Luca Mainetti
Identificare le classi
■  Tecnica di analisi linguistica: prendiamo il contenuto di un
caso d’uso (la descrizione testuale degli scenari).
Esaminiamo i sostantivi: troviamo delle classi candidate
■  Nel seguito facciamo l’esempio di una segreteria telefonica.
Alcuni sostantivi che si candidano a identificare classi
–  Mailbox, Message, User, Passcode, Extension, Menu
■  Altre classi possono essere necessarie oltre agli oggetti
tangibili: agenti, eventi e transazioni, utenti e ruoli, sistemi,
interfacce e dispositivi, classi fondamentali
■  Attenzione a non essere né troppo specifici né troppo
generici nella scelta delle classi
Introduzione ai diagrammi classi, sequenza, stato
3
Luca Mainetti
Identificare le responsabilità delle classi
■  Così come classi candidate corrispondono ai sostantivi,
responsabilità candidate corrispondono ai verbi
■  Nell’esempio della segreteria telefonica, i messaggi vocali
vengono registrati, ascoltati e cancellati. Gli utenti si
autenticano. Le chiavi di accesso vengono verificate
■  Ogni volta che si identifica una nuova responsabilità,
dobbiamo anche trovare una e una sola classe che se la
assume
■  A volte identificare responsabilità e associarle alle classi
non è banale: ad esempio, chi si assume la responsabilità
“aggiungere un messaggio a una casella vocale”, la classe
Message o la classe Mailbox ?
Introduzione ai diagrammi classi, sequenza, stato
4
Luca Mainetti
Relazioni tra classi: dipendenza (“usa”)
■  Una classe dipende da un’altra se elabora (usa) oggetti di tale classe
–  Ad esempio, la classe Mailbox usa la classe Message, la classe Message
usa la classe System
–  public class Message
{
public void print() { System.out.println(text); }
…
}
■  Una classe non dipende da un’altra se può portare a termine i suoi
compiti senza occuparsi che l’altra classe esista
–  Ad esempio, Message non ha bisogno di usare Mailbox
■  Un obiettivo importante della progettazione è quello di minimizzare il
numero di relazioni di dipendenza, cioè minimizzare l’accoppiamento tra
classi
–  Classi non accoppiate possono evolvere indipendentemente
Introduzione ai diagrammi classi, sequenza, stato
5
Luca Mainetti
Relazioni tra classi: aggregazione (“ha”)
■  L’aggregazione è un caso particolare di dipendenza: si è in presenza di
un’aggregazione se oggetti di una classe contengono (hanno) oggetti di un’altra
classe
–  Ad esempio, la classe MessageQueue aggrega la classe Message, un Mailbox ha un
messaggio di Saluto
–  public class MessageQueue
{
…
private ArrayList elements;
}
–  public class Mailbox
{
…
private Greeting myGreeting;
}
■  Attenzione alla differenza tra aggregazione e attributo
–  public class Message
{
…
private Date timestamp;
}
Introduzione ai diagrammi classi, sequenza, stato
6
Luca Mainetti
Relazioni tra classi: ereditarietà (“è”)
■  Una sottoclasse eredita il comportamento dalla superclasse
■  Un oggetto di una sottoclasse deve poter essere utilizzato
in tutte le situazioni in cui si può utilizzare una oggetto della
superclasse
■  Ad esempio, la classe ForwardedMessage eredita il
comportamento dalla classe Message (il messaggio può
essere ascoltato, memorizzato, cancellato)
■  Viceversa, non è utile che la classe Greeting erediti il
comportamento dalla classe Message
■  La differenza consiste nel fatto che un messaggio inoltrato
“è” un messaggio mentre una casella vocale “ha” un
messaggio di saluto
Introduzione ai diagrammi classi, sequenza, stato
7
Luca Mainetti
Schede CRC (Class-Responsibility-Collaborator)
■  E’ una tecnica per identificare
classi, responsabilità, relazioni
tra classi
Nome classe
–  K.Beck, W. Cunningham http://
c2.com/doc/oopsla89/paper.html
Mailbox
■  Una scheda CRC è un
cartoncino sul quale i progettisti
descrivono una classe
gestisce il codice di accesso
gestisce il messaggio di saluto
gestisce i messaggi nuovi e quelli memorizzati
MessageQueue
–  Nome della classe
–  Responsabilità della classe
–  Collaboratori (classi dipendenti)
■  Si descrivono responsabilità di
Responsabilità
alto livello (aggregati di metodi e
non singoli metodi)
Introduzione ai diagrammi classi, sequenza, stato
8
Collaboratori
Luca Mainetti
Schede CRC (cont.)
■  Le responsabilità di alto livello di una classe devono essere
poche (in genere da 1 a 3)
■  Se vi sono più responsabilità di quelle che la scheda può
contenere allora
–  Conviene suddividere la classe in due
–  Oppure le responsabilità sono descritte a un livello intermedio che
può essere aggregato ulteriormente
■  Le classi devono avere responsabilità correlate tra di loro
(coesione)
–  Ad esempio, non sarebbe coesa una classe Mailbox con la
responsabilità di memorizzare i messaggi e quella tradurre i
messaggi in un’altra lingua
Introduzione ai diagrammi classi, sequenza, stato
9
Luca Mainetti
Schede CRC (cont.)
■  Le schede CRC sono particolarmente adatte se utilizzate
per analizzare i casi d’uso e gli scenari
■  Concentratevi su uno specifico un caso d’uso
■  Svolgete l’analisi linguistica e identificate classi (sostantivi)
e relazioni tra classi (verbi)
■  Poi realizzate una scheda per ogni classe. Ogni
componente del gruppo “interpreti” un sottoinsieme di classi
■  Poi “navigate” nel caso d’uso aggiungendo di volta in volta
responsabilità e collaboratori alle schede
■  Il procedimento non è lineare: nuove classi possono
emergere, classi già identificate possono scomparire, altre
classi possono essere suddivise, ecc.
Introduzione ai diagrammi classi, sequenza, stato
10
Luca Mainetti
Schede CRC (cont.)
■  Ad esempio, supponiamo di avere
■  Aggiungiamo Mailbox tra i
già identificato le classi Mailbox e
Message e di analizzare il caso
d’uso “Lascia un messaggio”
collaboratori di MailSystem
■  Creiamo allora la nuova scheda e
–  Il chiamante compone il numero e
viene connesso al sistema di
segreteria telefonica. Poi digita il
numero che identifica la casella
vocale e lascia il messaggio
■  Quando arriviamo alla porzione
evidenziata in verde ci accorgiamo
che serve qualcuno che localizzi la
casella vocale. Chi si prende questa
responsabilità? Non Mailbox né
Message. Serve un MailSystem che
conosca i numeri di tutte le caselle
vocali
■  Serve allora che MailSystem
collabori con Mailbox
Introduzione ai diagrammi classi, sequenza, stato
11
chiediamoci come il MailSystem può
trovare il numero di casella vocale.
Ad esempio iterando sui singoli
Mailbox e chiedendo ad ognuno di
essi il relativo numero
MailSystem
gestisce le caselle vocali
Mailbox
Luca Mainetti
Descrizione dell’architettura software
■  Le schede CRC sono un ottimo strumento per individuare le
classi e le collaborazioni tra classi, ma non sono altrettanto
valide per descrivere le decisioni prese
■  Conviene utilizzare dei “linguaggi di progettazione” per
descrivere l’architettura software al fine di
–  Documentare le decisioni prese
–  Alimentare ulteriori e più approfondite discussioni tra progettisti
–  Dare un input preciso ai codificatori
■  Noi facciamo uso di UML e in particolar modo di
–  Diagrammi delle classi
–  Diagrammi di sequenza
–  Diagrammi di stato
Introduzione ai diagrammi classi, sequenza, stato
12
Luca Mainetti
Diagramma UML delle classi
■  Descrive l’architettura software
Mailbox
di un sistema da un punto di
vista statico (classi e relazioni tra
classi)
Message
MessageQueue
■  Può descrive anche una
Message
1
porzione (volutamente
incompleta ma rilevante)
dell’architettura
Mailbox
*
MessageQueue
1
dipendenza
■  Una classe UML è l’astrazione di
una classe di un linguaggio
orientato agli oggetti
aggregazione
ereditarietà
–  Nome e scopo della classe
–  Attributi
–  Operazioni (metodi)
Introduzione ai diagrammi classi, sequenza, stato
-newMessages
-savedMessages
+add()
+getCurrentMessage()
composizione
1
associazione
associazione
direzionata
realizzazione
interfaccia
13
Luca Mainetti
Diagramma UML di sequenza
■  Un diagramma di sequenza descrive
aMailbox
l’interazione (dinamica) tra oggetti
■  E’ utile per descrivere la
newMessages : MessageQueue
add
realizzazione di casi d’uso (porzioni)
■  La notazione dei casi d’uso prevede
–  Oggetti
newMessages.add(...)
•  NomeOggetto : NomeClasse
•  NomeOggetto
(classe non specificata)
: MailSystem
•  : NomeClasse
(oggetto non specificato)
–  Linee di vita (linee tratteggiate)
locateMailbox
–  Barre di attivazione (rettangoli sopra
le linee tratteggiate)
: Mailbox
–  Messaggi (frecce tra oggetti)
Introduzione ai diagrammi classi, sequenza, stato
<< create >>
14
Luca Mainetti
Diagramma UML di stato
■  Un diagramma di stato descrive i
diversi stati tra i quali può
passare un oggetto e le relative
transizioni
connesso
■  E’ utile per modellare le
situazioni in cui il
comportamento di un oggetto
dipende fortemente dal suo stato
registrazione
digitato codice
di accesso
■  Ad esempio, con il sistema di
segreteria telefonica si possono
compiere alcune azioni
solamente se il sistema è in
opportuni stati che le abilitano
Introduzione ai diagrammi classi, sequenza, stato
digitato numero
della casella
menu della casella
15
Luca Mainetti
Un caso di studio: segreteria telefonica
■  In un sistema di segreteria telefonica un utente digita un
codice identificativo (“estensione”) e, se l’utente chiamato
non risponde, può lasciare un messaggio registrato. La
persona chiamata potrà, più tardi, recuperare i messaggi
ricevuti, conservarli o cancellarli. Ci possono essere altre
funzionalità come inoltrare messaggi tra caselle, definire e
modificare elenchi di distribuzione dei messaggi, ecc.
■  Simuliamo la segreteria totalmente da tastiera
–  Una singola riga di testo contenente un carattere da 1 a 9 oppure #
indica un tasto premuto sulla tastiera della segreteria telefonica
–  Una riga di testo composta dalla sola H indica il riaggancio
–  Ogni altro tasto rappresenta la voce in ingresso che va registrata
Introduzione ai diagrammi classi, sequenza, stato
16
Luca Mainetti
Caso d’uso “Raggiungere una casella vocale”
1.  L’utente digita il numero principale del sistema di
segreteria
2.  Il sistema di segreteria pronuncia il messaggio “Enter
mailbox number followed by #”
3.  L’utente digita il numero identificativo del destinatario del
messaggio
4.  Il sistema di segreteria pronuncia il messaggio “You have
reached mailbox xxxx. Please leave a message now”
Introduzione ai diagrammi classi, sequenza, stato
17
Luca Mainetti
Caso d’uso “Lasciare un messaggio”
1.  Il chiamante raggiunge una particolare casella vocale
2.  Il chiamante pronuncia il messaggio
3.  Il chiamante riaggancia
4.  Il sistema di segreteria inserisce il messaggio registrato
nella casella vocale del destinatario
Introduzione ai diagrammi classi, sequenza, stato
18
Luca Mainetti
Caso d’uso “Autenticarsi per l’accesso”
1.  Il proprietario della casella vocale raggiunge una
particolare casella vocale
2.  Il proprietario della casella vocale digita il codice di
accesso seguito da # (il codice d’accesso predefinito è
uguale al numero della casella vocale; il proprietario può
modificare il codice d’accesso)
3.  Il sistema di segreteria pronuncia il menu della casella
vocale:
Enter 1 to retrieve your messages
Enter 2 to change your passcode
Enter 3 to change your greeting
Introduzione ai diagrammi classi, sequenza, stato
19
Luca Mainetti
Caso d’uso “Ascoltare i messaggi”
1. 
2. 
3. 
Il proprietario della casella vocale si autentica per l’accesso
Il proprietario della casella vocale seleziona dal menu l’opzione 1
Il sistema di segreteria pronuncia il menu per i messaggi
Enter 1 to listen the current message
Enter 2 to save the current message
Enter 3 to delete the current message
Enter 4 to return to mailbox menu
Il proprietario della casella vocale seleziona dal menu l’opzione 1
5. 
Il sistema di segreteria pronuncia il nuovo messaggio corrente oppure, se non ci sono nuovi
messaggi, il vecchio messaggio corrente. Il messaggio pronunciato non viene eliminato
6. 
Il sistema di segreteria pronuncia il menu per i messaggi
7. 
Il proprietario della casella vocale seleziona dal menu l’opzione 3 e il messaggio viene eliminato
definitivamente
8. 
Continuare con il passo 3
Estensioni
Variante 1. Salvare un messaggio
1.1 Iniziare al passo 6
1.2 Il proprietario della casella vocale seleziona dal menu l’opzione 2. Il messaggio viene eliminato dalla
coda in cui si trova e viene aggiunto alla cosa dei vecchi messaggi
1.3 Continuare con il passo 3
4. 
Introduzione ai diagrammi classi, sequenza, stato
20
Luca Mainetti
Caso d’uso “Modificare il messaggio di saluto”
1. 
Il proprietario della casella vocale si autentica per l’accesso
2. 
Il proprietario della casella vocale seleziona dal menu l’opzione 3
3. 
Il proprietario della casella vocale pronuncia il nuovo messaggio di
saluto
4. 
Il proprietario della casella vocale preme il tasto #
5. 
Il sistema di segreteria imposta il nuovo messaggio di saluto
Estensioni
Variante 1. Riagganciare prima di avere confermato
1.1 Iniziare al passo 3
1.2 Il proprietario della casella vocale riaggancia la cornetta telefonica
1.3 Il sistema di segreteria conserva il vecchio messaggio di saluto
Introduzione ai diagrammi classi, sequenza, stato
21
Luca Mainetti
Caso d’uso “Modificare il codice d’accesso”
1. 
Il proprietario della casella vocale si autentica per l’accesso
2. 
Il proprietario della casella vocale seleziona dal menu l’opzione 2
3. 
Il proprietario della casella vocale digita il nuovo codice d’accesso
4. 
Il proprietario della casella vocale preme il tasto #
5. 
Il sistema di segreteria imposta il nuovo codice d’accesso
Estensioni
Variante 1. Riagganciare prima di avere confermato
1.1 Iniziare al passo 3
1.2 Il proprietario della casella vocale riaggancia la cornetta telefonica
1.3 Il sistema di segreteria conserva il vecchio codice d’accesso
Introduzione ai diagrammi classi, sequenza, stato
22
Luca Mainetti
Diagramma dei casi d’uso
Lasciare un
messaggio
Ascoltare i
messaggi
Autenticarsi per
l'accesso
Proprietario
casella
vocale
Modificare il
messaggio di saluto
Chiamante
Raggiungere una
casella vocale
Modificare il
codice d'accesso
Introduzione ai diagrammi classi, sequenza, stato
23
Luca Mainetti
Identificazione delle classi
■  Alcune delle classi di dominio
Mailbox
(tangibili) più naturali che
individuiamo con l’analisi dei
sostantivi sono
memorizza i messaggi nuovi
e quelli salvati
MessageQueue
–  Mailbox
–  Message
–  MailSystem
■  Con le schede CRC iniziamo a
definire le responsabilità delle
classi a partire dalla classe
Mailbox
MessageQueue
gestisce una coda di messaggi
Message
■  Ci servono due code di
messaggi (nuovi messaggi e
vecchi messaggi); ci serve quindi
la classe MessageQueue
Introduzione ai diagrammi classi, sequenza, stato
24
Luca Mainetti
Identificazione delle classi (cont.)
MailSystem
Telephone
gestisce le caselle vocali
Mailbox
riceve dati in ingresso dalla tastiera
dal microfono e dal sensore
di riaggancio
pronuncia i messaggi in uscita
dall'altoparlante
■  La classe Connection gestisce la
comunicazione tra telefono e sistema di
segreteria
Connection
riceve i dati in ingresso da telefono
porta a termine i comandi utente
tiene traccia dello stato
Telephone
MailSystem
■  Più telefoni possono
contemporaneamente comunicare con il
sistema di segreteria
■  La connessione tiene traccia dello stato
della comunicazione per ogni telefono
connesso alla segreteria
Introduzione ai diagrammi classi, sequenza, stato
25
Luca Mainetti
Navigazione nel caso d’uso “Lasciare un messaggio”
L’utente digita il numero identificativo di una casella vocale. Telephone invia a
Connection il numero digitato (aggiungiamo Connection come collaboratore
di Telephone)
2.  Connection chiede a MailSystem di trovare il Mailbox avente l’identificativo
dato
3.  Connection chiede a Mailbox di pronunciare il proprio messaggio di saluto
(aggiungiamo “gestisce il messaggio di saluto” come responsabilità di Mailbox
e aggiungiamo Mailbox come collaboratore di Connection)
4.  Connection chiede a Telephone di riprodurre il messaggio di saluto mediante
l’altoparlante
5.  L’utente pronuncia il messaggio e Telephone ne dà notizia a Connection
6.  L’utente riaggancia e Telephone ne dà notizia a Connection
7.  Connection costruisce un Message che contiene il messaggio registrato
(aggiungiamo Message come collaboratore di Connection; costruiamo una
scheda per Message inserendovi la responsabilità “gestisce i contenuti di un
messaggio”)
8.  Connection aggiunge l’oggetto Message a Mailbox
1. 
Introduzione ai diagrammi classi, sequenza, stato
26
Luca Mainetti
Aggiornamento delle schede CRC
Telephone
riceve dati in ingresso dalla tastiera
dal microfono e dal sensore
di riaggancio
pronuncia i messaggi in uscita
dall'altoparlante
Connection
Connection
Mailbox
memorizza i messaggi nuovi
e quelli salvati
gestisce il messaggio di saluto
riceve i dati in ingresso da telefono
porta a termine i comandi utente
tiene traccia dello stato
registra la voce in ingresso
Telephone
MailSystem
Mailbox
Message
Message
MessageQueue
Introduzione ai diagrammi classi, sequenza, stato
27
gestisce i contenuti di un messaggio
Luca Mainetti
Navigazione nel caso d’uso “Ascoltare i messaggi”
1. 
2. 
3. 
4. 
5. 
6. 
7. 
L’utente digita il codice d’accesso e Telephone ne dà notizia a Connection
Connection chiede a Mailbox di verificare il codice d’accesso (aggiungiamo “gestire il
codice d’accesso” alle responsabilità di Mailbox)
Se il codice d’accesso è corretto Connection rende Mailbox la casella vocale corrente e
chiede a Telephone di pronunciare il menu della casella vocale
L’utente digita l’opzione 1 del menu e Telephone trasmette la scelta a Connection
Connection chiede a Telephone di pronunciare il menu per i messaggi
L’utente digita l’opzione 1 del menu e Telephone trasmette la scelta a Connection
Connection recupera il primo Message dal Mailbox corrente e ne invia i contenuti a
Telephone (Aggiungiamo “recupera i messaggi” come responsabilità di Mailbox)
Connection chiede a Telephone di pronunciare il menu per i messaggi
9. 
L’utente digita l’opzione 2 del menu e Telephone trasmette la scelta a Connection
10.  Connection dice a Mailbox corrente di salvare il messaggio corrente (modifichiamo le
responsabilità di Mailbox in modo che diventino “recupera, salva e cancella i messaggi”)
11.  Connection chiede a Telephone di pronunciare il menu per i messaggi
8. 
Introduzione ai diagrammi classi, sequenza, stato
28
Luca Mainetti
Aggiornamento delle schede CRC
Mailbox
memorizza i messaggi nuovi
e quelli salvati
gestisce il messaggio di saluto
gestisce ilcodice d'accesso
recupera, salva e cancella i messaggi
MessageQueue
Introduzione ai diagrammi classi, sequenza, stato
29
Luca Mainetti
Diagramma delle classi (dipendenze)
Abbiamo desunto le relazioni di
dipendenza dai collaboratori nelle schede
CRC
MailSystem
Mailbox
MessageQueue
Connection
Message
Telephone
Introduzione ai diagrammi classi, sequenza, stato
30
Luca Mainetti
Diagramma delle classi (vista implementativa)
• 
• 
• 
• 
Un sistema ha delle caselle vocali
Una casella vocale ha due code di messaggi
Una coda di messaggi ha dei messaggi
Un oggetto Connection ha una casella
vocale corrente oltre a un MailSystem e un
Telephone
MailSystem
Mailbox
MessageQueue
2
Connection
Message
Telephone
Introduzione ai diagrammi classi, sequenza, stato
31
Luca Mainetti
Diagramma di sequenza “Lasciare un messaggio”
: Telephone
: Connection
: MailSystem
: Mailbox
dial
findMailbox
getGreeting
speak
record
hangup
<< create >>
addMessage
Introduzione ai diagrammi classi, sequenza, stato
32
: Message
Luca Mainetti
Diagramma di sequenza “Ascoltare un messaggio”
: Telephone
: Connection
: Mailbox
: Message
dial
checkPasscode
speak
L'utente digita 1
(ascolta i messaggi)
dial
speak
dial
getCurrentMessage
L'utente digita 1
(ascolta il messaggio
corrente)
getText
speak
dial
saveCurrentMessage
L'utente digita 2
salva il messaggio
corrente)
Introduzione ai diagrammi classi, sequenza, stato
33
Luca Mainetti
Diagramma di stato della classe Connection
connesso
cambia codice
di accesso
numero della
casella
riaggancia
codice di accesso
digitato #
riaggancia
registrazione
2#
menu dei
messaggi
codice di accesso
digitato
messaggio di saluto
pronunciato #
cambia messaggio
di saluto
3#
1#
4#
menu della
casella
Introduzione ai diagrammi classi, sequenza, stato
34
Luca Mainetti
Esercizio
■  Provate a confrontare il codice Java del sistema di
segreteria con i diagrammi UML
■  Dove sono le classi ?
■  Dove sono le relazioni tra classi ?
■  Come sono realizzati i diagrammi di sequenza ?
■  Come è realizzato il diagramma di stato ?
■  Quali classi dovremmo modificare se volessimo dotare di
interfaccia grafica il sistema di segreteria ?
Introduzione ai diagrammi classi, sequenza, stato
35
Luca Mainetti
Riferimenti
■  K.Beck, W. Cunningham http://c2.com/doc/oopsla89/
paper.html
Introduzione ai diagrammi classi, sequenza, stato
36
Luca Mainetti