Is there a better approach to the whole problem (ignoring disabling the buttons and client side validation)
Sì. Il pattern non viene implementato correttamente da quello che sto leggendo.
La schermata "elenco degli ordini" deve avere il proprio oggetto di gestione dello stato.
Questa è una classe / oggetto context
come si vede nel diagramma delle classi del modello di stato.
Il OrdersList
imposta il suo stato generale in base alle selezioni dell'utente, ai clic sui pulsanti e così via. Ogni interazione dell'interfaccia utente dell'utente attiva l'oggetto stato OrdersList
da convalidare - perché dopo tutto lo stato dell'interfaccia utente appena modificato - e imposta i booleani interni che indicano noi quali stati sono OK ora. Ogni booleano specifico è cablato nell'interfaccia utente tramite l'oggetto context
, quindi la selezione di un ordine (annullato) attiva la convalida di context
che sa cancel
non è uno stato successivo valido e imposta "cancel boolean" su false. Questo valore booleano imposta direttamente il pulsante Annulla e voilà.
Gli Stati non sanno come o se consentire altri Stati
Questo fa parte del punto del modello di stato.
Un determinato stato sa come convalidare se stesso. Ma come può sapere quali sono i prossimi stati validi senza un contesto? Quel contesto è la schermata "lista degli ordini". Altre schermate nella tua app sono anche "contestuali" di un altro tipo. In che modo nel mondo ogni oggetto / classe di stato può conoscere ogni pulsante e ogni possibilità di interazione dell'utente per l'intera applicazione? Loro non possono! Ogni contesto può avere regole diverse su quali stati sono consentiti. Ecco di cosa tratta la classe context
.
If I validate before transition do I still need exceptions in the model?
Nel modello / oggetto contesto sì. In ogni stato, no.
Since I expected that this illegal transition action to occur would a validation before attempting to Cancel the line be more appropriate?
La questione è discutibile ora che vediamo ogni schermo come se avesse il proprio stato. Quindi: l'utente che esegue qualsiasi cosa nelle modifiche dell'interfaccia utente, allora deve convalidare il suo nuovo stato - questo è l'oggetto context
in azione qui. Tale convalida dell'oggetto contestuale imposta i controlli dell'interfaccia utente in modo che siano consentite solo le cose valide.
Una chiave è che tutta la convalida, il tutto, è nel tuo modello
L'interfaccia utente, lato client, può avere un minimo di convalida, ma tutta la logica necessaria per determinare lo stato deve essere nel modello "dietro l'interfaccia utente". Il tuo oggetto context
guarda ciò che è stato cliccato, selezionato, ecc. E il context
decide cosa fare.
Se stai pensando che context
potrebbe essere anche Controller
nel modello MVC
, sospetto che tu abbia ragione