Mi pregunta puede parecer muy científica, pero creo que es un problema común y los desarrolladores y programadores experimentados con suerte tendrán algunos consejos para evitar el problema que menciono en el título. Por cierto, lo que describo a continuación es un problema real que estoy tratando de resolver de manera proactiva en mi proyecto iOS, quiero evitarlo a toda costa.
Por máquina de estados finitos quiero decir esto> Tengo una interfaz de usuario con algunos botones, varios estados de sesión relevantes para esa interfaz de usuario y lo que representa esta interfaz de usuario, tengo algunos datos cuyos valores se muestran parcialmente en la interfaz de usuario, recibo y manejo algunos desencadenantes externos (representado por devoluciones de llamada de sensores). Hice diagramas de estado para mapear mejor los escenarios relevantes que son deseables y permitibles en esa interfaz de usuario y aplicación. A medida que implemento lentamente el código, la aplicación comienza a comportarse más y más como debería. Sin embargo, no estoy muy seguro de que sea lo suficientemente robusto. Mis dudas provienen de ver mi propio proceso de pensamiento e implementación a medida que avanza. Estaba seguro de que tenía todo cubierto, pero fue suficiente para hacer algunas pruebas brutas en la interfaz de usuario y rápidamente me di cuenta de que todavía hay vacíos en el comportamiento ... Los parcheé. Sin embargo, como cada componente depende y se comporta en base a la entrada de algún otro componente, una determinada entrada del usuario o alguna fuente externa desencadena una cadena de eventos, cambios de estado, etc. Tengo varios componentes y cada uno de ellos se comporta como este Trigger recibido en la entrada -> disparador y su remitente analizado -> genera algo (un mensaje, un cambio de estado) basado en el análisis
El problema es que esto no está completamente autocontenido, y mis componentes (un elemento de la base de datos, un estado de sesión, el estado de algún botón) ... PODRÍAN cambiarse, influenciarse, eliminarse o modificarse de otro modo, fuera del alcance de la cadena de eventos o Escenario deseable. (el teléfono se bloquea, la batería está vacía y el teléfono se apaga repentinamente) Esto introducirá una situación no válida en el sistema, de la cual el sistema NO PODRÍA PODER recuperarse. Veo esto (aunque las personas no se dan cuenta de que este es el problema) en muchas de las aplicaciones de mis competidores que están en la tienda de Apple, los clientes escriben cosas como esta> "Agregué tres documentos, y después de ir de un lado a otro, no puedo abrirlos, incluso si los veo ". o "Grabé videos todos los días, pero después de grabar un video de registro demasiado, no puedo desactivar los subtítulos en ellos ..., y el botón para subtítulos no
Estos son solo ejemplos abreviados, los clientes a menudo lo describen con más detalle ... a partir de las descripciones y el comportamiento descritos en ellos, supongo que la aplicación en particular tiene un desglose de FSM.
Entonces, la pregunta final es ¿cómo puedo evitar esto y cómo proteger el sistema para que no se bloquee?
EDITAR> Estoy hablando en el contexto de la vista de un controlador de vista en el teléfono, me refiero a una parte de la aplicación. Entiendo el patrón MVC, tengo módulos separados para una funcionalidad distinta ... todo lo que describo es relevante para un lienzo en la interfaz de usuario.