Diagrammi di macchina a stati I diagrammi di macchina a stati sono uno strumento fondamentale per rappresentare il comportamento di un oggetto in termini di stato. Essi descrivono il comportamento attraverso una serie di transizioni da uno stato all'altro, basate su stimoli esterni. Il concetto di stato è legato al ciclo di vita di un'entità, e l'insieme completo degli stati possibili rappresenta tale ciclo. I diagrammi di stato sono stati utilizzati fin dagli anni '60 e sono stati adottati dagli approcci orientati agli oggetti per modellare il comportamento di un oggetto all'interno di una classe. Ogni diagramma è associato a una classe e mostra il comportamento di un singolo oggetto durante il suo ciclo di vita. Per modellare un oggetto con una macchina a stati, è necessario: Individuare le condizioni interne (stati) significative per il comportamento dell'oggetto. Descrivere come e sotto quali condizioni l'oggetto passa da uno stato all'altro (transizione di stato). Identificare una sequenza di azioni associata alla transizione di stato. Identificare gli eventi che inducono transizioni di stato e/o azioni. Gli elementi base sono: stati significativi, transizioni di stato, condizioni, eventi e azioni. Mentre i diagrammi di sequenza modellano il comportamento di più classi che si scambiano messaggi, i diagrammi di macchina a stati si concentrano sugli aspetti dinamici di una classe durante il suo ciclo di vita, o di un sistema. L'enfasi è sull'evoluzione tra gli stati in risposta a stimoli esterni. Per rappresentare graficamente un comportamento tramite macchina a stati, è necessario rispondere a domande come: Quali sono gli eventi scatenanti? Quali proprietà deve avere l'oggetto per cambiare stato? Quale stato deve verificarsi per modificare il comportamento? Cosa succede in uno stato specifico al momento dell'evento? I diagrammi di macchina a stati sono utili per visualizzare stati e transizioni per un processo di controllo ottimizzato. Sono diffusi nella progettazione di sistemi di controllo, come la funzione "Acqua Stop" di una lavatrice. La rappresentazione grafica utilizza un grafo orientato con stati come nodi e transizioni come archi, etichettati con condizioni ed effetti.
Gli stati sono qualità distintive dell'oggetto, che influenzano il comportamento. Lo stato è caratterizzato dal dare la stessa risposta qualitativa a un evento. Solo un singolo stato può essere attivo in un momento. Gli stati sono rappresentati da rettangoli arrotondati. Lo pseudostato iniziale indica il punto di partenza, mentre lo pseudostato finale indica la conclusione. Considerando un motore, gli stati "spento" e "acceso" sono significativi. Le transizioni e gli eventi sono altri elementi chiave. La transizione modella il cambiamento di stato in seguito a un evento, rappresentato da una freccia con informazioni su evento, condizione di guardia e azione. Un evento è un'occorrenza nel tempo o nello spazio che determina il comportamento dell'oggetto. Un esempio è la funzione di controllo di accensione/spegnimento di un motore. Se il motore è spento e si preme Start, il motore passa da spento ad acceso. Non sempre c'è un cambiamento di stato in seguito a un evento, ma possono essere necessarie azioni. In questo caso, si può avere un'auto-transizione, ovvero transizioni che escono ed entrano nello stesso stato. Un esempio è la funzione di controllo di un menù a tendina. Altri concetti avanzati includono attività interne, che rispondono agli eventi senza transizioni, e stati con attività continue. Le attività interne sono rappresentate con la stringa: evento[condizione]/azione. Le attività interne hanno origine e destinazione nello stesso stato. Le attività di ingresso (entry) e di uscita (exit) sono attività speciali. È possibile definire stati in cui l'oggetto svolge un'attività continuativa. Un esempio è lo stato InRicerca, con l'attività do/intendendo do-activity. Gli stati possono condividere transizioni e attività interne, trasformandosi in sotto-stati e raggruppando il comportamento comune in un superstato. Un superstato contiene altri stati. Un esempio è una macchina a stati che regola la visualizzazione e l'inserimento di contatti in un social network. I diagrammi di attività illustrano il flusso di lavoro di un sistema, rappresentando una sequenza di azioni. Possono essere usati per rappresentare i processi aziendali, il flusso di lavoro, o per modellare il flusso di azioni in un caso d'uso.
A differenza dei diagrammi di macchina a stati, il focus è sull'attività e non su chi la svolge. Le azioni sono unità di comportamento che si susseguono per realizzare un'attività complessa. L'azione è rappresentata dal Nodo Azione, un rettangolo arrotondato con una voce verbale che descrive l'azione. Può avere una freccia entrante e una uscente. Le azioni operano su dati o entità informative (oggetti), rappresentati tramite Nodi Oggetto. È possibile aggiungere indicazioni dello stato ai Nodi Oggetto. Un'attività è rappresentata tramite un grafo diretto, con nodi che sono le azioni e gli archi che collegano i nodi azione, rappresentando i percorsi di esecuzione. I nodi di controllo specificano il flusso di esecuzione. Ogni diagramma ha un Nodo iniziale e un Nodo finale. Il token è un'entità di controllo che viaggia lungo il diagramma, passando dalle azioni. Il flusso dei token definisce il flusso di esecuzione, o flusso di controllo. Il flusso di controllo inizia al nodo iniziale, passa alle azioni e termina al nodo di uscita. Altri nodi di controllo includono: Fork: esecuzione in parallelo di più azioni. Join: esecuzione di un'azione solo quando le azioni precedenti hanno terminato. Decision: esecuzione di un'azione dipende da una condizione (guard). Merge: ricongiungimento di due o più flussi alternativi. I diagrammi di attività possono essere modularizzati, usando attività che richiamano altre attività. L'attività invocata è rappresentata come un insieme di azioni racchiuse in un rettangolo arrotondato, identificato dal nome dell'azione che lo richiama. Le partizioni raggruppano le azioni in base agli attori responsabili. I nodi segnali rappresentano l'accettazione di un evento o l'invio di un segnale. Sono di tre tipi: Segnale inviato: azione lanciata alla fine di un'azione. Segnale ricevuto/di accettazione: evento atteso dall'esterno. Segnale temporale: istante di tempo o termine di intervallo temporale.
Gli archi possono essere rappresentati in modi diversi, come connettori, o usando pin per il passaggio di parametri. Le regioni di espansione rappresentano azioni che avvengono per ogni elemento di una collezione. La fine di un flusso indica la fine di un particolare flusso senza terminare l'intera attività. I diagrammi UML offrono diverse viste del sistema. Ogni diagramma ha un ruolo diverso. I diagrammi delle classi descrivono le classi, le relazioni, gli attributi e le operazioni. I diagrammi dei casi d'uso rappresentano come il sistema può essere usato. I diagrammi di sequenza descrivono la collaborazione di oggetti per implementare un comportamento. I diagrammi di macchina a stati descrivono il comportamento di un oggetto in più casi d'uso. I diagrammi di attività illustrano il flusso di lavoro di un sistema. Altri diagrammi UML includono: Diagramma degli oggetti: istanze di oggetti e relazioni. Diagramma di package: raggruppamento di elementi UML. Diagramma di deployment: distribuzione fisica del sistema. Diagramma di temporizzazione: vincoli temporali. UML è un linguaggio di modellazione affermato per la sua notazione visuale, la sua evoluzione da linguaggi esistenti e la sua flessibilità. UML può essere usato con una prospettiva concettuale o software. I diagrammi UML dovrebbero essere usati per rappresentare vari aspetti delle entità, modulando la rappresentazione dei dettagli. UML è uno strumento di comunicazione e lavoro. L'uso di UML varia a seconda della fase di sviluppo del software. Nell'analisi dei requisiti, i casi d'uso, i diagrammi delle classi, i diagrammi delle attività e i diagrammi di stato sono utili. In fase di progettazione, i diagrammi delle classi, i diagrammi di casi d'uso, i diagrammi di sequenza, i diagrammi di package e i diagrammi di deployment sono utilizzati.