La mia domanda può sembrare molto scientifica, ma penso che sia un problema comune e speriamo che sviluppatori e programmatori esperti abbiano qualche consiglio per evitare il problema che menziono nel titolo. A proposito, quello che descrivo qui sotto è un vero problema che sto cercando di risolvere in modo proattivo nel mio progetto iOS, voglio evitarlo a tutti i costi.
Per macchina a stati finiti intendo questo> Ho un'interfaccia utente con alcuni pulsanti, diversi stati di sessione rilevanti per quell'interfaccia utente e ciò che rappresenta questa interfaccia utente, ho alcuni dati quali valori sono parzialmente visualizzati nell'interfaccia utente, ricevo e gestisco alcuni trigger esterni (rappresentato dai callback dei sensori). Ho creato diagrammi di stato per mappare meglio gli scenari rilevanti che sono desiderabili e consentiti nell'interfaccia utente e nell'applicazione. Mentre implemento lentamente il codice, l'app inizia a comportarsi sempre più come dovrebbe. Tuttavia, non sono molto sicuro che sia abbastanza robusto. I miei dubbi derivano dal guardare il mio modo di pensare e di attuazione mentre procede. Ero fiducioso di avere tutto coperto, ma era abbastanza per fare alcuni test brutali nell'interfaccia utente e ho capito rapidamente che ci sono ancora lacune nel comportamento .. Li ho riparati. Tuttavia, poiché ogni componente dipende e si comporta in base all'input di qualche altro componente, un determinato input dell'utente o una sorgente esterna innesca una catena di eventi, lo stato cambia ... ecc. Ho diversi componenti e ognuno si comporta come questo Trigger ricevuto in input -> trigger e il suo mittente analizzato -> output qualcosa (un messaggio, un cambio di stato) basato sull'analisi
Il problema è che questo non è completamente autonomo e i miei componenti (un elemento del database, uno stato della sessione, lo stato di alcuni pulsanti) ... POTREBBERO essere cambiati, influenzati, cancellati o altrimenti modificati, al di fuori dell'ambito della catena di eventi o scenario desiderabile. (il telefono si arresta in modo anomalo, la batteria si scarica improvvisamente) Ciò introdurrà una situazione non valida nel sistema, da cui il sistema NON POTREBBE POTREBBE essere IN GRADO di recuperare. Vedo questo (anche se le persone non si rendono conto che questo è il problema) in molte delle mie app della concorrenza che si trovano su Apple Store, i clienti scrivono cose come questa> "Ho aggiunto tre documenti e dopo essere andato lì e là, non riesco ad aprirli, anche se a vederli. " o "Ho registrato video ogni giorno, ma dopo aver registrato un video troppo log, non riesco a disattivare i sottotitoli .. e il pulsante per i sottotitoli non fa '
Questi sono solo esempi abbreviati, i clienti spesso lo descrivono in modo più dettagliato .. dalle descrizioni e dal comportamento descritti in essi, presumo che la particolare app abbia un guasto a FSM.
Quindi la domanda finale è: come posso evitarlo e come proteggere il sistema dal blocco stesso?
EDIT> Sto parlando nel contesto della vista di un viewcontroller sul telefono, intendo una parte dell'applicazione. Capisco il modello MVC, ho moduli separati per funzionalità distinte ... tutto ciò che descrivo è rilevante per un canvas sull'interfaccia utente.