UML Statecharts
Transcript
UML Statecharts
UML State Diagrams A. Fantechi 1/4/2010 Macchina a Stati Finiti (Automa a stati finiti, Finite State Machine, FSM) • Descrizione grafica del comportamento di una FSM on Lamp On on off off Lamp Off Macchina a Stati Finiti (Automa a stati finiti, Finite State Machine, FSM) • Descrizione formale del comportamento di una FSM: • Una FSM M è una quadrupla (S, s0, E, R) dove: – S è un insieme finito di stati – s0 ! S è lo stato iniziale – E è un insieme di eventi (trigger) – R " S x E xS è la relazione di transizione. (s1, e, s2) ! R si scrive anche s1 e s2 Nondeterminismo • Spesso si usa una funzione di transizione invece di una relazione di transizione: – R: S x E # S In questo modo il prossimo stato è sempre determinato univocamente dall’evento di input. Caso di nondeterminismo --> Uscite, azioni • Uscite generate dall’automa: on on Lamp On print( ”on”) print(”on”) Lamp On on on/print(”on”) off Lamp Off off off Macchina di Mealy Lamp Off off Macchina di Moore Descrizione formale macchine Mealy e Moore • Una Macchina di Mealy è una sestupla (S, s0, E, R, O, o) dove: – S è un insieme finito di stati – s0 ! S è lo stato iniziale – E è un insieme di eventi (trigger) – R : S x E # S è la funzione di transizione. – O è un insieme di possibili uscite – o : S x E # O è la funzione di uscita • Una Macchina di Moore è una sestupla (S, s0, E, R, O, o) dove: – S è un insieme finito di stati – s0 ! S è lo stato iniziale – E è un insieme di eventi (trigger) – R : S x E # S è la funzione di transizione. – O è un insieme di possibili uscite – o : S # O è la funzione di uscita (determinismo) Extended Finite State Machines (EFSM) • Estensione con variabili (“extended state”) on ctr ctr :: Integer Integer Lamp On on/ctr := ctr + 1 off off Lamp Off EFSM • Una EFSM (di Mealy) è definita da: – Un insieme di segnali di input (input alphabet) – Un insieme di segnali di output (output alphabet) – Un insieme di stati – Un insieme di transizioni • segnale di trigger • guardia • azione – Un insieme di variabili (extended state variables) – Un’indicazione di stato iniziale (stato iniziale + valore iniziale delle variabili) – Un insieme di stati finali (vuoto nel caso di macchina non terminante) Harel Statecharts • Create da David Harel (I-Logix) alla fine degli anni ‘80, come ulteriore estensione delle EFSM • Formano la base del modello comportamentale di UML • Supportano – Stati annidati (gerarchie di stati) – Azioni su • Transizioni • Entry (ingresso in uno stato) • Exit (uscita da uno stato) – Attività eseguite all’interno di uno stato (Do) – Guardie – History – Eventi di Broadcast – Regioni Ortogonali (AND-States) 9 Basic UML Statechart Diagram ““top” top” top” state Initial pseudostate State top Trigger Ready Transition stop /ctr := 0 Final state Done stop Action Che tipo di comportamento? • In generale, le EFSM sono adatte per descrivere un comportamento dicreto, event-driven – inappropriate per modellare comportamento continuo – in UML non ci sono strumenti per modellare un comportamento continuo threshold time Comportamento Event-Driven • Evento = un tipo di occorrenza di qualcosa di osservabile – interazioni: • Invocazione sincrona di un metodo di un oggetto (call event) • Ricezione asincorna di un segnale (signal event) – Occorrenza di istanti di tempo (time event) • Scadenza di un intervallo • Tempo di clock o di calendario – Aggiornamento del vlore di una variabile (change event) • Istanza di un Evento (Event Instance) = un’istanza di un tipo di evento che accade in un certo istante di tempo e che non ha durata Comportamento Event-Driven - UML • In linea di principio, si può parlare di comportamento eventdriven per un qualsiasi tipo di sistema • In UML, il comportamento event-driven è quello manifestato dagli oggetti. Quindi possiamo associare agli oggetti di una classe un comportamento event-driven specificato attraverso uno state diagram. • La semantica degli state diagram UML è data principalmente in relazione ad oggetti attivi Comportamento di un oggetto Passivo Modello Generale Trattamento Trattamento dello dello specifico specifico metodo richiesto metodo richiesto Initialize Initialize Object Object Wait Waitfor for Request Request void:offHook (); {busy = true; obj.reqDialtone(); … }; Handle Handle Request Request Terminate Terminate Object Object Oggetti Passivi e Macchine a Stati • mapping: on Initialize Object Lamp On Wait for Event on/print(”on”) off Handle Event Lamp Off Terminate Object off stop Oggetti e flussi di controllo (threads) • Oggetti Passivi: flusso di controllo esterno • Oggetti Attivi: proprio flusso di controllo Initialize Initialize Object Object Initialize Initialize Object Object Wait Waitfor for Request Request Wait Waitfor for Request Request Handle Handle Request Request Handle Handle Request Request Terminate Terminate Object Object Terminate Terminate Object Object Flussi concorrenti Initialize Initialize Object Object Wait Waitfor for Request Request Handle Handle Request Request Terminate Terminate Object Object • Un oggetto passivo può essere attraversato da flussi concorrenti: --> problema di sincronizzazione • Un oggetto attivo ha un proprio, unico, flusso: la concorrenza si ottiene con due oggetti attivi, istanze distinte della stessa classe Oggetti Attivi e Macchine a Stati • Oggetti Attivi con il proprio flusso di controllo anActiveObject #currentEvent : Eventpoll/defer created start + start ( ) + poll ( ) + stop ( ) start/^master.ready() ready ready stop/ poll/^master.ack() Le variabili di stato esteso sono gli attributi dell’oggetto. Semantica degli Oggetti Attivi ActiveObject: Coda di eventi Run-to-completion model Run-to-completion model • Il run-to-completion model step definisce come avviene una transzione tra due configurazioni della macchina a stati. • Configurazione = stato corrente + valore delle variabili di stato esteso + situazione della coda in ingresso • Un evento in coda (received) può essere prelevato (dispatched) dalla coda e trattato solo quando l’elaborazione dell’evento precedente è terminata (consumed). • Durante uno step di run-to-completion può essere eseguita una sequenza di varie attività, che possono includere la modifica di un attributo locale, l’invio di un segnale, l’invocazione di un metodo di un altro oggetto, la rimozione di un evento dalla coda di ingresso Stati UML Initializing Valve ValveOk: Boolean = FALSE ValveAperture: int = 0 cmdSize: int entry / ValveOK = TestValve( ) do / OpenTo(cmdSize: int) exit / printMessage(ValveAperature) Sintassi completa guard event parameters action list event name A entry / g(x), h(y) exit / m(a), n(b) do / act(a,y,z) defer / e1, e2 e3 / p(x,y), q(z) T1(int r)[r < 0] / f(r) B entry actions exit actions activities state name deferred events internal transition state 22 Eventi • Un evento può essere: – Una condizione che diventa vera (guardia) – Ricezione di un esplicito segnale da un altro oggetto – Ricezione di una chiamata a un metodo da un altro oggetto – Timeout (passage of a specified interval) • Eventi possono causare transizioni di stato (etichette sulle) Transizioni event-name (parameter list) [guard] / action expression • event-name nome dell’evento di trigger per la transizione • parameter list parametri con tipo (opzionale) • guard espressione Booleana sui parametri e sugli attributi dell’oggetto (variabili) • action-expression lista di operazioni da eseguire quando la transizione viene selezionata: la lista è eseguita atomicamente Esempi di etichette sulle transizioni • JustDoIt • JustDoIt(x) • JustDoIt(x: int) • JustDoIt(x) [x>0] • JustDoIt [y<10] / print(y) • JustDoIt(x,y) [x>y+10] / print (x+y); target->genSignal(Nike.MakeMoney(MuchoDollaro)) Tipi di Eventi • UML definisce 4 tipi di eventi – Signal Event • Ricezione di un segnale Asinchrono • e.g. evFlameOn – Call Event • Ricezione di un’invocazione di un metodo • e.g. op(a,b,c) – Change Event • Aggiornamento del valore di una variabile (condivisa) – Time Event • Scadenza di un tempo Relativo (intervallo) • Raggiungimento di un tempo Assolute • e.g. tm(PulseWidthTime) State Entry and Exit Actions LampOn entry/lamp.on(); e2 exit/lamp.off(); e1 Ordine delle Azioni: un caso semplice • Exit actions precedono le transizioni • Entry action seguono le transizioni LampOn entry/lamp.on(); off/printf(“to off”); exit/printf exit/printf((“exiting” exiting”); Sequenza di azioni risultante printf (“exiting”); printf(“exiting”); printf (“to off ”); printf(“to off”); lamp.off(); LampOff entry/lamp.off(); exit/printf exit/printf((“exiting” exiting”); off/printf(“needless”); printf (“exiting”); printf(“exiting”); printf (“needless”); printf(“needless”); lamp.off(); Transizioni Interne • Self-transitions • Non provocano l’esecuzione di entry e exit actions transizione interna triggered da un ““off” off” event LampOff entry/lamp.off(); exit/printf exit/printf((“exiting” exiting”); off/null; State (“Do”) Activities • thread concorrente che esegue fino a che: – l’attività è completata oppure – si esce dallo stato con una transizione uscente ““do” do” activity Error entry/printf entry/printf((“error!” error!”) do/while (true) alarm.ring(); Guardie • Esecuzione Condizionale di transizioni – Le guardie (predicati Booleani) non devono avere side-effect bid [value < 100] /reject Selling bid [value >= 200] /sell Happy bid [(value >= 100) & (value < 200)] /sell Unhappy Static Conditional Branching • Abbreviazione grafica per evidenziare una signola transizione uscente Selling bid [value >= 200] /sell [value < 100] /reject [(value >= 100) & (value < 200)] /sell Unhappy Happy Dynamic Conditional Branching • Choice pseudostate: le guardie vengono valutate solo quando viene raggiunto lo pseudostato. Happy Selling bid /gain := calculatePotentialGain(value) [gain >= 200] /sell [gain < 100] /reject [(gain >= 100) & (gain < 200)] /sell Dynamic Dynamic choicepoint choicepoint Unhappy Macchine a stati gerarchiche • stati decomposti ricorsivamente in macchine a stati LampOff entry/lamp.off() flash/ LampFlashing FlashOn entry/lamp.on() off/ on/ LampOn entry/lamp.on() 1sec/ on/ on/ 1sec/ FlashOff entry/lamp.off() OR States • Migliorano la scalabilità • Migliorano la comprensibilità • Permettono la decomposizione gerarchica di un problema (divide-and conquer) • Possibilità: – Stati annidati sullo stesso diagramma – Stati annidati su diagrammi separati • aka “submachines” 35 Sintassi ev_2 or-states state nested state OR States Statechart gerarchica entry/ Print(ErrCode) Group Transitions • Transizioni a più alto livello nella gerarchia di stati Default transition to the initial pseudostate LampOff entry/lamp.off() LampFlashing flash/ FlashOn entry/lamp.on() off/ 1sec/ on/ FlashOff on/ LampOn 1sec/ entry/lamp.off() entry/lamp.on() Group transition Completion Transitions • Triggered da un evento di completion – generato automaticamente quando uno macchina immediatamente annidata termina Committing completion transition (no trigger) Phase1 Phase1 CommitDone Phase2 Phase2 Regole di Triggering • Due o più transizioni possono avere lo stesso evento trigger – La transizione più interna ha la precedenza – Un evento in coda è consumato sia che attivi una transizione sia che non attivi alcuna transizione. LampFlashing FlashOn on/ on/ off/ FlashOff Ordine delle azioni annidate • Da fuori a dentro le azioni entry • Da dentro a fuori le azioni exit U entry: f() exit: g(a,b) U1 entry: x(c) exit: y() first f() then x(c) A first y() then g(a,b) 42 Deferred Events • Gli eventi in coda che non possono attivare una transizione vengono scartati, fino a che un evento in grado di attivare una transizione non venga trovato nella coda. • Deferred events – Se però un evento è in una “deferred” list, non viene scartato e rimane in coda (finchè rimane nella deferred list) – Se l’oggetto transisce in uno stato dove l’evento non è più presente in una deferred list, tale evento viene scartato. LampOff Deferred event entry/lamp.off() off/defer off/ on/ LampOn entry/lamp.on() Ordine delle Azioni: Caso Complesso S1 exit/exS1 S2 entry/enS2 initS2 S11 exit/exS11 E/actE S21 entry/enS21 sequenza di esecuzione delle Azioni, in caso di triggering della transizione exS11 ! exS1 ! actE ! enS2 ! initS2 ! enS21 Ortogonalità • Viste multiple simultanee sulla stessa entità age financialStatus Child Poor Adult Retiree Person Rich AND-States • Gli stati possono essere decomposti in – OR-States • Uno stato (super-stato) può essere decomposto in un numero qialsiasi di OR-States • Quando l’oggetto si trova in un super-stato, deve trovarsi in UNO dei suoi OR-substates. oppure – AND-State • Uno stato (super-stato) può essere decomposto in un numero qialsiasi di AND-States (regioni ortogonali) • Quando l’oggetto si trova in un super-stato, deve trovarsi in TUTTI i suoi AND-substates attivi. • Regioni separate da linee tratteggiate Regioni Ortogonali • Combinazione di descrizioni multiple simultanee age financialStatus Child Poor Adult Retiree age financialStatus Rich Child Poor Adult Retiree Rich AND-States AND-States transition state initial pseudostate and-states conditional pseudostate Regioni Ortogonali - Semantica • Tutte le regioni ortogonali reagiscono allo stesso evento, (in principo) simultaneamente. legalStatus LawAbiding robBank/ robBank/ Outlaw financialStatus Poor robBank/ robBank/ Rich AND-States & Concorrenza • Gli AND-states non sono necessariamente concorrenti • Semantica degli AND-states tipicamente a interleaving • UML usa la concorrenza tra oggetti attivi come principale modo di modellare la concorrenza • Gli AND-states possono essere implementati come threads concorrenti, ma questa non è l’unica strategia di implementazione corretta. Uso concettualmente errato dell’ortogonalità • Uso di regioni per modellare oggetti attivi independenti Person1 Person2 Person1 • Soluzione: Person2 Child Child Adult Adult Retiree Retiree --> due istanze dello stesso oggetto attivo !!! Interazioni tra Regioni • Tipicamente, attraverso variabli condivise o riferimenti a cambio di stato delle altre regioni. sane sane :: Boolean Boolean flying flying :: Boolean Boolean Catch22 Catch22 sanityStatus flightStatus Crazy entry/sane entry/sane := := false; false; Flying entry/flying entry/flying := := true; true; (flying)/ request Grounding/ (sane)/ (~sane)/ Sane entry/sane entry/sane := := true; true; Grounded entry/flying entry/flying := := false; false; AND-State Communication • Gli AND-states possono communicare via: – Broadcast events • Ricevuti da tutti gli AND-states attivi – Propagated events • Una transizione in un AND-state può inviare un evento sentito da un altro AND-state – Guardie • [IS_IN( state )] usa il substate di un AND-state in una guardia – Attributi • Siccome gli AND-states fano parte dello stesso oggetto, vedono tutti gli attributi dell’oggetto (variabili condivise) Propagazione e Broadcast / 55 Fork e Join • Transizioni verso/da regions ortogonali: age Child Child Staff Staff Member Member Adult Adult Retiree Retiree Manager Manager employee Transizioni Complesse S fork join S1 e2 S1_2 S1_1 e5 B A e1 e5 S2_1 e3 S2_2 S2 e4 C pseudostates initial pseudostate conditional pseudostate terminal pseudostate history pseudostate Pseudostates Symbol Symbol Name Symbol C or Branch Pseudostate (type of junction pseudostate) T or Terminal or Final Pseudostate * or n Symbol Name H (Shallow) History Pseudostate H* (Deep) History Pseudostate Synch Pseudostate Initial or Default Pseudostate Fork Pseudostate Junction Pseudostate Join Pseudostate Merge Junction Pseudostate (type of junction pseudostate) [g] Choice Point Pseudostate Stub Pseudostate [g] label History • Ritorno a uno stato gerarchico già visitato – deep /shallow history Diagnosing suspend/ resume/ H* H* Diagnostic1 Diagnostic1 Diagnostic2 Diagnostic2 Step11 Step11 Step21 Step21 Step12 Step12 Step22 Step22 Deep History Shallow History Synch Pseudostate • Permette di far scattare una transizione solo quando un insieme di transizioni è avvenuto • “Memorizza” che una o più specifiche transizioni sono avvenute, • Simile al posto (piazza, place) di una Rete di Petri • Permette di sincronizzare più AND-States “Synch” Pseudostate Data Processing Waiting for Data Processing Datum dataSignal Logging Data Synch Pseudostate with unbounded multiplicity synch state * User Monitoring Applying Alarm Filters /active alarm ct = 0 Waiting to Process Alarms [else] /active alarm ct = 0 Alarm Processing done tm(displayTime) C Idle alarmRaised [active alarm ct > 0]/ genSignal(alarmRaised) Displaying Alarms Waiting to accept accept 1 synch state “Stub” Notation • Abbreviazione notazionale: nessuna aggiunta semantica LampOff entry/lamp.off() flash/ LampFlashing FlashOn off/ on/ LampOn on/ on/ FlashOff entry/lamp.on() Submachines: Reference stub state reference toOn(mode: tMode) defaultMode = mode; Self Testing include / BITSubmachine device Test On done(defaultMode) Operating include / OpsSubmachine RAM Test doTest Normal Failsafe Abort [else] doRAMtest Off [recoverOK] doDeviceTest toOff Unrecoverable Error submachine indicator errorFound C errorHandled Submachines: Referenced submachine BITSubmachine OpsSubmachine entry / isError = false; doDeviceTest done Testing ROM [m == normal] C RAM Test Testing Components Normal Mode (m: tMode) Testing RAM [else] Demo Mode errorFound/ isError = true; [m == failsafe] device Test stub state Failsafe Mode Abort Logging Test Results Normal doRAMtest [else] C [isError == false] done Failsafe toOff errorFound Normal subEnd Uso degli State Diagrams • Specifica del comportamento di un sistema (necessita di uno strumento di editing) • Simulazione (necessita di uno strumento di simulazione) • Verifica (Model checking) (necessita di uno strumento di verifica) • Generazione automatica del codice (necessita di un generatore di codice) doTest Credits Bruce Powel Douglass, Real-Time UML, Slides, Ilogix Gunnar Övergaard, Bran Selic, Conrad Bock, Behavioral Modeling, Object Modeling with OMG UML Tutorial Series, UML Revision Task Force, Nov. 2000