Fluxo de dados unidirecional em aplicativos iOS

Apr 28 2023
Uma maneira de melhorar qualquer arquitetura existente
Todos nós podemos enfrentar uma situação em que a arquitetura atual se transforma em uma bagunça completa. Em um mundo perfeito, reescreveríamos nossa base de código com um novo padrão de arquitetura.
Foto de Hunter Harritt no Unsplash

Todos nós podemos enfrentar uma situação em que a arquitetura atual se transforma em uma bagunça completa. Em um mundo perfeito, reescreveríamos nossa base de código com um novo padrão de arquitetura. Mas não estamos em um mundo perfeito e não temos tempo para isso. A decisão certa a tomar é tentar melhorar uma base de código existente sem fazer alterações globais. Em meu projeto atual, minha equipe e eu fizemos isso usando uma abordagem de fluxo de dados unidirecional (UDF) .

Fluxo de Dados Unidirecional

Vamos começar com uma breve descrição de UDF .

O conceito principal do UDF é que os dados se movem apenas em uma direção: do modelo para a interface do usuário. A interface do usuário não tem permissão para atualizá-la. Tudo o que a interface do usuário pode fazer é enviar eventos para o modelo e, após receber um novo evento, o modelo envia o estado atualizado para a interface do usuário. O estado que a interface do usuário usa para atualizações deve ser imutável, pois a interface do usuário o usa apenas para atualizações. A interface do usuário não tem permissão para armazená-lo ou modificá-lo.

A arquitetura mais popular que usa essa abordagem é um JavaScript Redux . Também ocorre no padrão Flutter BLoC . E no Swift, TCA (The Composable Architecture) o usa.

Cada arquitetura usa uma implementação diferente da camada de modelo. Vamos dar uma olhada na implementação do Redux. Vamos dar uma olhada mais de perto na implementação do Redux, que consiste em quatro entidades principais: State, Event, Reducer e Store.

  • Estado — é um estado de um módulo/tela atual. Este é o objeto que o Model atualiza e envia para a View;
  • Evento (Ação) — está sendo enviado para a camada do Modelo pela Visualização, e aciona a atualização do Estado;
  • Redutor — é uma função que recebe o estado atual e o evento como argumentos e retorna o novo estado. O redutor é o único local onde o estado pode ser alterado;
  • Loja — é uma entidade que mantém todos os elementos juntos e realiza a comunicação entre eles. Ele pega eventos e, com a ajuda do redutor, os mapeia em novos estados.

Dois benefícios principais do UDF são:

  • Gerenciamento de estado previsível;
  • Separação do gerenciamento de estado e interface do usuário.

O UDF separa a interface do usuário e o gerenciamento de estado em duas partes separadas: Modelo e interface do usuário. Com essa separação, você pode escrever testes melhores para a camada de modelo e também oferece muito mais flexibilidade com a interface do usuário. A partir de 2023, muitos aplicativos ainda estão usando o UIKit para a interface do usuário. No entanto, está chegando o dia em que mudaremos para o SwiftUI. Com o UDF, é muito mais fácil migrar para o SwiftUI, pois o gerenciamento de estado e a interface do usuário são separados e tudo o que você precisa alterar é a interface do usuário.

Como integrar em um projeto existente

Se você estiver usando VIPER, MVP ou qualquer outra arquitetura, poderá integrar a abordagem UDF em sua base de código. Não há necessidade de mudar toda uma arquitetura. Tudo o que você precisa é configurar a comunicação de estado/evento entre as camadas de exibição e lógica (apresentador, interativo, intenção) e configurar a lógica do redutor dentro de sua camada de lógica. Você pode fazer isso usando bibliotecas reativas, caso já as esteja usando. Após essas alterações, você não terá um padrão totalmente seguidor de UDF como TCA ou Redux, mas terá esse fluxo de dados único entre suas camadas e resolverá muitos problemas.

A questão é como encontrar tempo para introduzir essas mudanças. Todos nós temos tarefas a serem concluídas, e as equipes de produto querem que forneçamos novos recursos o mais rápido possível e corrijamos todos os bugs ainda mais rápido. No entanto, a boa notícia é que você não precisa reescrever toda a base de código para implementar essas alterações.

O que você pode fazer é começar a criar novos módulos usando a abordagem UDF. Dessa forma, você deixará de criar novos trechos de código usando sua arquitetura anterior. Mas o que fazer com um código existente? Você pode trabalhar na refatoração de módulos antigos no momento em que estiver consertando ou adicionando algo a esses módulos. Levará algum tempo, mas depois de algum tempo você terá a maior parte do código atualizado. E não interromperá seu processo de desenvolvimento. Talvez só um pouco.

Espero que você tenha achado este artigo útil e talvez tente usar o UDF em seus projetos novos ou atuais. Eu ficaria feliz em ver sua opinião sobre este tópico nos comentários. Obrigado pelo seu tempo!

Check out my other articles about iOS Development

https://medium.com/@artem.khalilyaev