Università degli Studi di Napoli Federico II Ingegneria del Software a.a. 2013/14 Lezioni : Sequence Diagram
Analisi dei requisiti individuare e rappresentare il comportamento dinamico. Forme diagrammatiche di UML per la rappresentazione degli aspetti dinamici: Sequence diagrams Acritivity diagrams Statecharts
Documento dei requisiti SW (da Lezione 6) Si focalizza sulla descrizione del sistema da sviluppare Cliente, utenti e sviluppatori contribuiscono alla stesura del documento di specifica dei requisiti Può essere usato come contratto tra cliente e sviluppatori Il documento prevede vari livelli di raffinamento, dal linguaggio naturale, al linguaggio strutturato, ai modelli UML. Tutti i documenti rappresentano la stessa informazione ma sono scritti usando linguaggi diversi, per utenti diversi
I Sequence Diagrams
Mappare Use case in Oggetti con Sequence Diagram Un Sequence Diagram lega use case e diagrammi di Cockburn con oggetti. mostra come il comportamento di uno use case (o scenario) è distribuito tra i suoi oggetti partecipanti Illustra la sequenza di interazioni tra gli oggetti necessaria per realizzare uno use case Oggetto di osservazione è l'aspetto puramente funzionale E' un tipo di documento che non è adeguato alla comunicazione con il committente. Il sequence diagram vede la partecipazione di oggetti che istanziano le classi nei Class Diagram prodotti nell'analisi dei requisiti e si conformano alle loro segnature Solo per i clienti esperti è più intuitivo e preciso dei diagrammi di Cockburn Fornisce una prospettiva diversa (dinamica) che consente di individuare classi mancanti e aree non chiare nelle specifiche
Sequence Diagram Mostra la sequenza temporale dei messaggi che gli oggetti si scambiano per portare a termine una funzionalità. E un diagramma di interazione: evidenzia come una funzionalità è realizzata tramite la collaborazione di un insieme di oggetti. E uno dei principali input per l implementazione dello scenario E utilizzato nell'analisi dei requisiti accoppiato ai Class diagram prodotti nell'analisi dei requisiti E' utilizzato ad un maggior livello di dettaglio in fase di System e Object design.
Sequence Diagram Instance:ClassB Instance:ClassA Oggetto tempo Linea di vita InvocazioneMetodo() in questo intervallo di tempo l oggetto è in vita e attivo Cancellazione ValoreDiRitorno Box di attivazione
Linee di vita Una linea di vita rappresenta un singolo partecipante (istanza di una classe) ad una interazione. Nome: usato per far riferimento alla linea Tipo: il nome della classe di cui la linea di vita rappresenta l'istanza Selettore: condizione booleana usata per selezioanre uan singola istanza (facoltativo, in assenza di selettore si fa riferimento a una istanza generica). Il tempo fluisce verticalmente dall'alto in basso Nell'intestazione del diagramma si trovano gli oggetti che esistono prima dell'invio del primo messaggio Oggetti creati durante l interazione compaiono sotto l'interazione La linea tratteggiata indica il tempo in cui l oggetto può ricevere messaggi
Messaggi Un messaggio rappresenta una forma di comunicazione tra due linee di vita. La chiamata di una operazione: un messaggio di chiamata; si usa la segnatura di un metodo della classe dell'istanza destinataria del messaggio La creazione/distruzione di una istanza: messaggio di creazione/distruzione; L'invio di un segnale. L attivazione è rappresentata da un rettangolo sulla linea della vita, da cui altri messaggi possono prendere origine (focus attivazione) La lunghezza del rettangolo rappresenta il tempo durante il quale l operazione è attiva
Messaggi: tipologie
Messaggi: sincroni/asincroni di ritorno Se l oggetto che invia il messaggio rimane in attesa che l oggetto ricevente ritorni dall'esecuzione del messaggio, si ha un messaggio sincrono Se l oggetto che invia il messaggio prosegue la propria elaborazione senza attendere che l'oggetto ricevente ritorni dall'esecuzione, si è in presenza di un messaggio asincrono. Il valore restituito all oggetto chiamante viene allegato ad un messaggio di ritorno La distinzione tra messaggi asincroni e sincroni viene di solito tralasciata in fase di analisi dei requisiti, così comle l'esplicitazione di tutti i ritorni.
Esempio d'uso Primo esempio Il manager seleziona aggiunta del corso Il manager indica il nome del corso Il sistema crea il nuovo corso. Secondo esempio Il manager seleziona rimozione corso Il manager indica il nome del corso Il sistema cancella il corso.
Esempio: Creazione
Esempio: Distruzione
Vincoli e invarianti di stato Lo stato di una istanza di classe è dato dal valore assunto dai suoi attributi. E' possibili esprimere nella linea di vita il vincolo che lo stato deve avere nel corso delle interazioni (invariante di stato). Nell'esempio successivo le paid, unpaid, delivered indicano stati dell'ordine. La specifica degli invarianti di stato costituisce il legame tra i diagrammi di sequenza e quelli di stato. Si possono aggiungere vincoli temporali sulla evoluzione della linea di vita marcando punti della linea di vita con etichette e scrivendo espressioni che coinvolgano le etichette
Vincoli e invarianti di stato
Flussi di controllo: Sintassi grafica generale degli operatori combinati
Frammenti combinati Operatore: determina come vengono eseguiti i suoi comandi Condizione di guardia: condizione booleana che stabilisce se gli operandi devono essere eseguiti (condizione booleana valutata a True). La condizione di guardia può essere associata all'intero frammento combinato o al singolo operando La condizione di guardia è unica nel frammento/operando La condizione di guardia precede la prima comunicazione del frammento/operando a cui si riferisce
Frammenti di selezione: opt, alt Opt equivale a un costrutto standard If (condizione) then operazione Ha un unico operando che viene eseguito solo se la condizione è vera Alt equivale a un costrutto standard del tipo If (condizione1) then operazione1 else If (condizione2) then operazione2... else If (condizionen) then operazionen Ogni operando ha una condizione di guardia e viene eseguito solo se essa è vera (solo una guardia può valutare a vero) L'operando opzionale con guardia [else] è eseguito se nessun altro operando ha guardia che valuta a vero.
Frammenti di selezione: opt, alt
Frammenti di iterazione: loop e break La sintassi loop min, max [condizione] operazione indica che Operazione viene eseguita min volte Finché condizione valuta a vero Operazione viene eseguita max-min volte. Possibili varianti Senza min, max e condizione rappresenta un ciclo infinito Se viene specificato solo min, si intende max=min La condizione è una espressione booleana ma può anche essere espressa testualmente in modo libero (se preciso) Break ha solo una condizione di guardia. Se la condizione di guardia di break è soddisfatta il ciclo viene e interrotto
Frammenti iterativi: loop
Frammenti iterativi: tipologie
Esempio
Linking sequence diagrams Se un Sequence è troppo complesso o fa riferimento ad un altro Sequence, si può utilizzare il REF, con: Un rettangolo con label REF, col nome dell altro diagramma Una freccia che punta a tale rettangolo Una eventuale condizione per specificare quando si fa il riferimento Customer Info ref Verify customer credit Approved? 25
Elenco degli operatori (1)
Elenco degli operatori (2)
Elenco degli operatori (3)
Sequence Diagram e parallelismo Il principio di base della modellazione della concorrenza è che ogni thread di controllo o processo concorrente viene modellato come un oggetto attivo Un oggetto attivo incapsula il proprio thread di controllo. Un oggetto attivo è una istanza di una classe attiva E' possibile mediante l'operatore par rappresentare esplicitamente forme di parallelismo Ogni operando rappresenta una componente che evolve parallelamente L'esecuzione dei messaggi appartenenenti a diverse componenti parallele è interfogliata. La possibile interfogliazione dei messaggi appartenenti a componenti parallele diverse può essere limitati usando un operatore che vincola sequenze di messaggi ad essere atomiche (operatore critical)
Sequence Diagram e parallelismo: esempio (1) Sistema di allarme antincendio e antintrusione.
Sequence Diagram e parallelismo: esempio(2) I monitor per i sensori antincendio e antintrusione e il loro controllore lavorano in parallelo (classi attive)
Esempio: il monitor antincendio e anintrusione controllano ciascuno un solo sensore. Controllo incendio prioritario sull'antintrusione.
Esempio: il monitor antincendio e anintrusione controllano ciascuno più sensori. Controllo incendio prioritario sull'antintrusione.
Sequence Diagram in fase di analisi Convenzioni per utilizzare i Sequence Diagrams con l euristica ThreeObject-Type: La colonna più a sinistra rappresenta l attore che inizia lo use case La seconda colonna -> oggetto Boundary con cui l attore interagisce per iniziare lo use case La terza colonna -> oggetto Control che gestisce il resto dello use case Le altre colonne possono rappresentare qualunque oggetto che interviene nel caso d uso. Gli oggetti Control creano altri oggetti Boundary/Entity e possono interagire con altri oggetti Oggetti Control accedono ad altri oggetti Entity e Boundary Gli oggetti Entity non accedono mai agli oggetti Control e Boundary: ciò rende più facile condividere oggetti Entity tra più use case
Esempio: ReportEmergency use case. FieldOfficer Report EmergencyButton press() «create» Manage EmergencyControl ReportEmergency Control «create» ReportEmergency Form fillcontents() submit() submitreport() «create» «destroy» Emergency Report submitreporttodispatcher()
Sequence diagram for the ReportEmergency use case (continued). Manage EmergencyControl submitreporttodispatcher() «create» Dispatcher IncidentForm createincident() «create» Incident submit() «create» «destroy» Acknowledgment
Sequence diagram for the ReportEmergency use case. FieldOfficer Manage EmergencyControl ReportEmergency Control acknowledgereport() «create» dismiss() Acknowledgment Notice endreporttransaction() «destroy» «destroy»
Analisi e Sequence Diagram Durante l analisi i Sequence Diagram sono usati per individuare nuovi oggetti comportamenti mancanti Disegnare Sequence Diagram è un attività laboriosa, quindi: Occorre dare priorità a quelle funzionalità problematiche o non ben specificate Per le parti ben definite può essere utile solo per evitare di posticipare alcune decisioni chiave
Esercizi Per prendere dimestichezza con il linguaggio dei sequence diagrams utile è lo svolgimento di esercizi di reverse engineering. Dato un frammento di codice in un linguaggio object-oriented: Ipotizzare un class diagram coerente con il codice esaminato. Produrre un sequence diagram che ne esprima il controllo. Si svolga l'esercizio per i frammenti di codice riportati nei lucidi seguenti
Esercizio 1 public class OrientedERBuilder extends ModelBuilder { private Hashtable relations;. public Object getmodel() { String model =""; for(enumeration elem = relations.elements();elem.hasmoreelements() ; ) { String[] currel = (String[]) elem.nextelement() ; model += "[ " + currel[0] + " ]----("+ currel[2] + "," + currel[3]+ ")---->[ " + currel[1]+ " ]\n"; } return model; } }
Esercizio 2 public class LineFigure extends BezierFigure { public Collection<Handle> createhandles(int detaillevel) { LinkedList<Handle> handles = new LinkedList<Handle>(); switch (detaillevel) { case -1 : // Mouse hover handles handles.add(new BezierOutlineHandle(this, true)); break; case 0 : handles.add(new BezierOutlineHandle(this)); for (int i=0, n = path.size(); i < n; i++) { handles.add(new BezierNodeHandle(this, i)); } break; } return handles; }
Esercizio (2)