Quindi ho un servizio che sto cercando di ripulire. Risponde alle richieste avviando un server arrestato su Amazon EC2, aspettando che arrivi in linea, quindi configura un software di terze parti sul server tramite una pausa API e quindi imposta un'attività da avviare su quella parte di software di terze parti . Il servizio esegue anche alcune operazioni di tipo di manutenzione e tenta di tenere traccia dei server o dei server "orfani" che non devono più essere in esecuzione e chiuderli. Attualmente mantiene lo stato in un database.
In questo momento funziona come una macchina statale informale. Il "compito" è l'unità che viene gestita, e l'attività ha tutti i tipi di stati in cui può essere, ma fondamentalmente la maggior parte degli stati sono solo passi nel processo di inizializzazione. Il codice è piuttosto disordinato e l'aggiunta di funzionalità può essere alquanto dolorosa. Ad esempio, sto cercando di trovare un modo per annullare l'attività mentre il processo di inizializzazione è in corso senza scrivere nei controlli manuali per vedere se è stato cancellato all'inizio di ogni passaggio.
Ho pensato che una macchina a stati sarebbe un buon modo per ripulire tutto e standardizzare il codice, ma sembra che ci sia un problema con quella soluzione quando la considero più attentamente. In una macchina a stati, controlli direttamente lo stato e definisci le transizioni tra stati che dovrebbero essere possibili. In questo sistema, però, utilizzo davvero l'API AWS e questa API software di terze parti per dirmi qual è lo stato delle cose. Indipendentemente da ciò che il mio servizio pensa che lo stato dovrebbe essere, la vera fonte della verità è al di fuori del mio controllo, e devo passare a qualsiasi stato mi dica che è dentro e lavorare da lì. Quindi sembra che finirò per creare una macchina a stati solo per rompere fondamentalmente tutte le sue regole e controllare manualmente lo stato comunque.
Una macchina a stati è inadatta per questo? C'è un altro modello che dovrebbe funzionare meglio? O devo solo lavorare lentamente sul refactoring per renderlo migliore.