← πŸ› οΈ Dev Tools
βš™ Dev Tools

State Machine Visualizer

Progetta macchine a stati finiti (FSM) con un editor visuale. Aggiungi stati e transizioni, simula il comportamento evento per evento, esporta in XState, Mermaid o JSON.

Template
Stati
Transizioni
Azioni
Stato corrente
β€”
Nessuno stato selezionato
Eventi disponibili
Nessun evento disponibile
Cronologia
Nessuna transizione eseguita
Esporta

Cos'Γ¨ una macchina a stati finiti (FSM)

Una macchina a stati finiti Γ¨ un modello computazionale che descrive il comportamento di un sistema attraverso un insieme finito di stati, transizioni tra stati e eventi che le innescano. In ogni momento il sistema si trova in esattamente uno stato. Esempi reali: un semaforo (rosso β†’ verde β†’ giallo β†’ rosso), un form di checkout (idle β†’ filling β†’ submitting β†’ success/error), un lettore audio (stopped β†’ playing β†’ paused β†’ stopped). Le FSM rendono impossibili stati contraddittori come isLoading && isSuccess.

Progettare la tua FSM: flusso di lavoro

Inizia elencando tutti gli stati possibili β€” non solo quelli "felici" ma anche errori, stati intermedi e timeout. Poi identifica gli eventi che causano transizioni. Regola generale: se ti trovi a gestire piΓΉ di 3 flag booleani correlati (isLoading, isError, isEmpty), stai probabilmente gestendo stati impliciti β€” una FSM li rende espliciti ed elimina combinazioni impossibili. Aggiorna il diagramma nel tool: aggiungi stati, connetti le frecce con gli eventi, esporta il codice quando la logica Γ¨ corretta.

FSM vs Redux vs useState: quando usare cosa

useState/useReducer Γ¨ sufficiente per stati semplici con 2-3 valori indipendenti. FSM con XState Γ¨ ideale per flussi con piΓΉ stati mutuamente esclusivi, transizioni condizionali e side effect associati agli stati (es. fetch al cambio di stato). Redux gestisce stato globale condiviso tra molti componenti β€” non Γ¨ un sostituto delle FSM, si usano insieme. Zustand/Jotai sono alternative piΓΉ leggere a Redux per stato globale semplice.

XState e l'ecosistema JavaScript

XState Γ¨ la libreria piΓΉ usata per implementare state machine in JavaScript e TypeScript. Supporta sia FSM semplici che statechart (stati annidati, paralleli, history). Il codice esportato da questo tool Γ¨ compatibile con XState v5 β€” la versione attuale con API piΓΉ pulita rispetto a v4. Per React esiste @xstate/react con hook dedicati. Per framework diversi da React esiste @xstate/vue, @xstate/svelte e un core framework-agnostico.

Errori comuni nella progettazione delle FSM

I problemi piΓΉ frequenti: stati impliciti con flag multipli β€” isLoading && !isError && !isEmpty nasconde stati impossibili come isLoading && isSuccess allo stesso tempo; dimenticare gli stati di errore β€” ogni operazione asincrona ha almeno 3 stati (loading, success, error); transizioni mancanti β€” cosa succede se arriva un evento in uno stato inatteso? Una FSM ben progettata gestisce esplicitamente tutti i casi, anche quelli che non dovrebbero mai accadere.

Quando NON usare una state machine

Le FSM non sono necessarie per: toggle semplici on/off (due stati β€” useBoolean Γ¨ sufficiente); dati derivati calcolabili da altri valori senza transizioni; form con validazione senza flusso multi-step; contatori e accumulatori che cambiano incrementalmente. Il vero valore delle FSM emerge quando il sistema ha 4+ stati con regole precise su quale transizione Γ¨ ammessa in quale stato.

FAQ

Qual Γ¨ la differenza tra FSM e statechart? β–Ύ

Una FSM ha stati piatti (flat) β€” tutti allo stesso livello. Uno statechart (Harel statechart, usato da XState) aggiunge gerarchie di stati annidati, stati paralleli (piΓΉ stati attivi simultaneamente in regioni separate) e history states (ricordarsi in quale sotto-stato ci si trovava prima di uscire). Per la maggior parte dei casi d'uso una FSM piatta Γ¨ sufficiente.

Posso esportare in Mermaid per la documentazione? β–Ύ

Sì. L'export Mermaid genera codice compatibile con GitHub Markdown, Notion, Confluence e qualsiasi tool che supporti il rendering Mermaid. Incolla il blocco ```mermaid direttamente nel README o nella wiki del progetto per documentazione che rimane sempre sincronizzata con il codice.

Lo schema viene salvato se chiudo la pagina? β–Ύ

Lo schema viene salvato automaticamente nel localStorage del browser β€” ritorna alla prossima visita sullo stesso dispositivo. Per condividerlo o portarlo su un altro dispositivo usa l'export JSON o il codice XState e salvalo nel tuo repository.

Il codice generato Γ¨ pronto per la produzione? β–Ύ

Il codice XState generato Γ¨ un punto di partenza valido. Per la produzione aggiungi: guard (condizioni sulle transizioni), action (side effect come fetch o logging) e context (dati associati alla macchina). La struttura degli stati e delle transizioni generata dal tool Γ¨ giΓ  corretta.