Executando verificação de segurança...
8

Relato: mais uma vez o planejamento prévio salvou horas do meu trabalho

TL;DR Iniciei o desenvolvimento de uma aplicação mobile em Flutter e percebi que uma das dependências que eu estava utilizando possuia um bug na qual eu não teria outra alternativa a não ser removê-la de meu projeto. No entanto, graças ao uso de uma estrutura e arquitetura bem planejadas, a refatoração desse código será de extrema facilidade. Por tanto o meu conselho é: dediquem tempo no início de seus projetos para garantir que eles poderão crescer com saúde. Os resultados a curto e a longo prazo são valiosos.

--

Olá pessoal, trago aqui para vocês um breve relato que eu acredito que pode contribuir principalmente para quem está iniciando na área de programação.

Contexto: Para quem não se lembra, recentemente eu comecei o desenvolvimento de uma aplicação mobile para consumir as APIs públicas do TabNews (https://github.com/higorpo/tabnews-mobile), sendo que utilizei o Flutter para tal e tratei de empregar as boas práticas de desenvolvimento de software como TDD, Clean Code e Clean Architecture. Além disso, tomei como decisão de projeto não acoplar minha aplicação diretamente com dependências externas, por entender que essas poderiam ser alteradas durante o desenvolvimento do projeto e que isso não deveria demandar um esforço tão grande para realizar mudanças e/ou refatorações.

O que eu não imaginava é que eu teria os benefícios dessas decisões de projeto tão rapidamente. Durante o desenvolvimento do projeto eu utilizei uma dependência externa para gerenciamento de estados e rotas conhecida como GetX (https://pub.dev/packages/get), e apesar de ser uma biblioteca amplamente utilizada para o desenvolvimento de aplicações dentro do ecossistema do Flutter e ser super bem mantida e testada pela comunidade, acabei descobrindo um bug da ferramenta que quebra a minha aplicação. Pesquisando um pouco mais a fundo sobre o problema que eu encontrei, descobri que provavelmente eu não teria outra opção a não ser remover o uso do GetX para o gerenciamento de estados e utilizar as próprias ferramentas nativas do Flutter.

Conclusão: terei de refatorar minha aplicação para remover a dependência dela ao GetX e utilizar o recurso de Streams nativo do Flutter. Se eu não tivesse me preocupado desde o início com a saúde a longo prazo da minha aplicação e aplicado testes, uma boa arquitetura e uma boa estrutura, eu provavelmente estaria desesperado neste momento (ou não, considerando que ainda estou nos estágios iniciais da aplicação, mas imagine um grande aplicativo em produção com milhares de linhas de código).

Entretanto, dado que eu me preparei para esse momento, alterar entre uma implementação e outra (GetX ou Streams) será de extrema facilidade. Em minhas contas serão dois arquivos de produção e dois arquivos de teste impactados. Nada além disso.

O que fica de aprendizado e o que eu quero passar com essa história: dediquem tempo no início de seus projetos para pensar e garantir que seu projeto poderá crescer com segurança e saúde a medida que mais features vão chegando. O tempo gasto pensando e arquitetando uma boa estrutura de projeto é infinitamente recompensado no futuro (e as vezes nem demora tanto tempo para colher resultados, como foi no meu caso).

Carregando publicação patrocinada...
3

Poderia compartilhar mais sobre o bug do getx?
Tenho 4 projetos em produção com ele. Estou terminando um game tbm usando ele e até agora não tive problemas que me impediam ir a diante.
Talvez tenha algo que eu não tenha visto.
Por favor compartilha com a gente! :)

3

Sim, também uso o GetX em meus projetos e até então nunca havia tido problemas com ele.

Não estou em casa para pegar o problema exato, porém o que estava acontecendo era um problema ao utilizar GetStream do GetX. Basicamente era um erro no método addError que estava quebrando a aplicação por algum motivo. Pesquisando no Google percebi que o problema era no próprio GetX, pelo menos foi essa a conclusão que eu cheguei.

Se você olhar aqui no repositório do projeto (https://github.com/higorpo/tabnews-mobile/blob/main/lib/presentation/presenters/getx_content_presenter.dart) você vai ver que da forma como eu estou implementando eu estou utilizando o GetX para o gerenciamento de estado mas estou retornando a view apenas as streams do GetX (para evitar acoplar a aplicação ao GetX), e é justamente aí onde está dando o problema.

Talvez eu possa estar errado, mas por enquanto foi isso que consegui descobrir...

1

Eu ainda não tive tempo pra pegar a aplicação pra testar. Mas pretendo fazer isso essa semana.
Acredito que o exemplo que você deu foi na classe de testes né?

1

Não, aquela ali do link é a classe de produção que utiliza o GetX por de baixo dos panos (apenas a parte dos Streams). Eu converto os Observables em streams e é isso aí que está me dando problemas... parece que o GetX não está sabendo lidar muito bem com isso.

2

Puuutz, não sabia que já tinha alguém fazendo. Não busquei aqui no tabnews. 🤦

Tbm estava fazendo. Rsrs'

Usei clean tbm, mas não desacoplei as dependências, interessante. Usando Getx tbm, aonde quebrou?

Comecei o meu hoje de manhã.

Se quiser ajuda no projeto. (:

Segue meu repo:
https://github.com/Leleocastro/tabnews

Mas como já tem o teu e já está mais encaminhado, posso contribuir?

2

Leo, mesmo que duas pessoas queriam fazer exatamente a mesma aplicação, garanto que irá sair duas coisas diferentes e isso nos dará a oportunidade de ver ideias aplicadas de formas diferentes. Então lhe dou apoio total em continuar com sua implementação caso queira 🤝

2
1