Minha pergunta pode parecer muito científica, mas acho que é um problema comum, e esperamos que desenvolvedores e programadores experientes tenham alguns conselhos para evitar o problema mencionado no título. Aliás, o que descrevo abaixo é um problema real que estou tentando resolver proativamente no meu projeto iOS. Quero evitá-lo a todo custo.
Por máquina de estado finito, eu quero dizer isso> Eu tenho uma interface do usuário com alguns botões, vários estados de sessão relevantes para essa interface e o que essa interface representa, tenho alguns dados cujos valores são parcialmente exibidos na interface do usuário, recebo e manipulo alguns gatilhos externos (representado por retornos de chamada dos sensores). Criei diagramas de estado para mapear melhor os cenários relevantes desejáveis e permitidos nessa interface do usuário e aplicativo. À medida que eu lentamente implemento o código, o aplicativo começa a se comportar cada vez mais como deveria. No entanto, não estou muito confiante de que seja suficientemente robusto. Minhas dúvidas vêm de observar meu próprio processo de pensamento e implementação. Eu estava confiante de que tinha tudo coberto, mas foi o suficiente para fazer alguns testes brutos na interface do usuário e rapidamente percebi que ainda existem lacunas no comportamento. Eu as corrigi. Contudo, como cada componente depende e se comporta com base na entrada de algum outro componente, uma certa entrada do usuário ou de alguma fonte externa aciona uma cadeia de eventos, o estado muda .. etc. Eu tenho vários componentes e cada um se comporta como este Trigger recebido na entrada -> trigger e seu remetente analisado -> output algo (uma mensagem, uma mudança de estado) com base na análise
O problema é que isso não é completamente autônomo e meus componentes (um item de banco de dados, um estado de sessão, algum estado de botão) ... PODEM ser alterados, influenciados, excluídos ou modificados fora do escopo da cadeia de eventos ou cenário desejável. (o telefone trava, a bateria está vazia, o telefone fica repentinamente) Isso introduzirá uma situação não válida no sistema, da qual o sistema potencialmente não conseguiria se recuperar. Eu vejo isso (apesar de as pessoas não perceberem que esse é o problema) em muitos dos meus aplicativos concorrentes que estão na Apple Store, os clientes escrevem coisas como esta> "Adicionei três documentos e, depois de ir para lá e para cá, não consigo abri-los, mesmo que a veja. " ou "Eu gravei vídeos todos os dias, mas depois de gravar um vídeo em log demais, não consigo ativar as legendas .. e o botão para legendas não '
Estes são apenas exemplos abreviados, os clientes costumam descrevê-lo com mais detalhes .. pelas descrições e comportamentos descritos neles, presumo que o aplicativo em particular tenha uma falha no FSM.
Portanto, a questão final é como posso evitar isso e como proteger o sistema de se bloquear?
EDIT> Estou falando no contexto da visão de um controlador de exibição no telefone, quero dizer uma parte do aplicativo. Entendo o padrão MVC, tenho módulos separados para funcionalidades distintas ... tudo o que descrevo é relevante para uma tela na interface do usuário.