Andiamo adesso a definire la sintassi con cui rappresentare un generico stato in UML. Anche in questo caso forniamo un esempio grafico della sintassi per poi commentarla abbondantemente:
Come possiamo vedere la sintassi della modellazione di uno stato consta di tre parti principali: la prima rappresenta il nome che vogliamo dare allo stato (anche in questo caso cerchiamo di dare un nome abbastanza descrittivo), la seconda è un elenco di azioni eseguite nello stato (spiegheremo tra poco il significato di entry, exit e do) ed infine la terza parte relativa ad eventi e azioni collegate che altro non sono che delle transizioni interne dello stato. L’attenzione del lettore adesso sarà focalizzata principalmente sulla seconda parte della struttura ed andiamo a spiegare il significato delle parole chiave presenti:
- Entry: rappresenta l’ingresso nello stato e l’azione relativa. Tutte le altre azioni vengono eseguite solo dopo l’entry
- Exit: rappresenta l’uscita dallo stato e l’azione relativa. E’ l’ultima delle azioni eseguite.
- Do: identifica le azioni interne eseguite dall’oggetto quando si trova in quello stato.
Oltre a queste parole chiave a volte si può trovare anche include, che come dice la parola stessa, rappresenta un’inclusione di un’altra macchina a stati. Il costrutto include non è molto utilizzato ed è stato accennato in questa guida solo per completezza.
A questo punto abbiamo tutti gli strumenti necessari per poter progettare diagrammi di stato di qualsiasi complessità. Forniamo, a scopo didattico un esempio ragionato di modellazione. Dunque il nostro obiettivo è quello di rappresentare una macchina a stati relativo allo sportelo bancomat. Per non tediare il lettore evitiamo di spiegare per l’ennesima volta il funzionamento del sistema. Passando subito all’esame della macchina a stati possiamo subito dire che il sistema consta di uno stato iniziale di attesa dell’inserimento della carta da parte del cliente. L’inserimento della carta attiva la transizione verso lo stato di richiesta del pin. In questo stato saranno presenti due transizioni: una che porta la macchina nello stato di visualizzazione del menù se il PIN è corretto e l’altra che manterrà la macchina nello stesso stato in caso di PIN non corretto. La seconda transizione è dunque una transizione sicura per l’oggetto. Supponendo che l’utente non sbagli per tre volte il PIN si arriva al menù di selezione nel quale si può scegliere di prelevare denaro oppure di stampare il saldo sul conto. In questo caso il diagramma degli stati subisce una ramificazione in quanto avremo che dallo stato di visualizazzione del menù partiranno due transizioni con lo stesso evento (selezione operazione) ma con guardie diverse. La transizione con la guardia soddisfatta verrà eseguita e proprio in quel punto avverrà la ramificazione del diagramma. A questo punto nel caso sia stata scelta il prelievo di contatti saranno presenti altri due stati: seleziona importo ed erogazione. Nel caso in cui si sia scelto la visualizzazione del saldo sarà presente un solo stato che effettuerà la stampa del saldo relativo al conto. A questo punto mostriamo i diagramma UML relativo al sistema sopra descritto:
Come ultimo stato abbiamo inserito il simbolo di stato finale per mostrare al lettore la notazione utilizzata. Inserendo questo stato la macchina a stati rispecchia un solo ciclo di prelievo o visualizzazione del saldo e ciò vuol dire che una macchina così progettata potrà soddisfare solamente la richiesta di un cliente. Per modellare la macchina in maniera più reale, ovvero che al termine di una iterazione il sistema sia pronto per eseguire altre iterazioni per altri utenti, basta semplicemente togliere il simbolo di stato finale e collegare entrambi gli stati stampa saldo e eroga denaro allo stato iniziale attesa.