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