Como implementar uma arquitetura limpa no Android?

Como implementar uma arquitetura limpa no Android?


O que você encontrará neste artigo?


Em 2016, comecei a aprender Java e, no início de 2017, Android. Desde o início, eu já sabia que havia um conceito de arquitetura de aplicativos, mas não sabia como aplicar isso no meu código. Encontrei muitos guias diferentes, mas não ficou claro com isso.


Este artigo é exatamente o que eu gostaria de ler no início da minha jornada.


A importância da arquitetura de aplicativos


Muitas empresas realizam testes técnicos para os candidatos que estão sendo selecionados. Os testes podem variar, mas há uma coisa que os une. Todos eles exigem compreensão e capacidade de usar uma boa arquitetura de software.


Uma boa arquitetura de software facilita a compreensão, o desenvolvimento, a manutenção e a implementação do sistema [Livro "Arquitetura Limpa", capítulo 15]

O objetivo deste artigo é ensinar alguém que nunca usou a arquitetura a desenvolver aplicativos Android para fazer isso. Para fazer isso, consideraremos um exemplo prático de um aplicativo, durante a criação do qual implementamos a solução menos flexível e uma solução mais ideal usando a arquitetura.


Exemplo


Elementos em um RecyclerView:


Elementos no RecyclerView


  1. Nós receberemos dados da API e mostraremos os resultados para o usuário.
  2. O resultado será uma lista de cervejas com nome, descrição, imagem e teor alcoólico para cada uma.
  3. A cerveja deve ser solicitada por grau de fortaleza.

Para resolver este problema:


  1. Precisamos obter dados da API.
  2. Classifique os itens do nível mais baixo ao mais alto da fortaleza.
  3. Se o teor de álcool for inferior a 5%, um círculo verde será desenhado, se estiver entre 5% e 8% - o círculo será laranja e acima de 8% - um círculo vermelho.
  4. Finalmente, precisamos mostrar uma lista de itens.

Qual é a solução menos flexível?


A solução menos flexível é criar uma classe que atenda aos quatro pontos anteriores. Essa é a decisão que qualquer um de nós tomaria se não soubéssemos qual é a arquitetura dos aplicativos.


O resultado para o usuário será aceitável: ele verá uma lista ordenada na tela. Porém, se precisarmos dimensionar esse sistema, entenderemos que a estrutura não é fácil de entender, desenvolver, manter e implementar.


Como entender a arquitetura dos aplicativos no Android?


Vou dar um exemplo muito simples. Imagine uma fábrica de automóveis com cinco zonas:


  1. A primeira zona cria o chassi.
  2. A segunda zona conecta as partes mecânicas.
  3. A terceira zona coleta um circuito eletrônico.
  4. A quarta área é de tinta.
  5. E a última área adiciona detalhes estéticos.

Isso significa que cada zona tem sua própria responsabilidade e trabalha em uma cadeia da primeira à quinta para alcançar um resultado.


Esse sistema tem uma vantagem definida. Se o carro cometer um erro após a conclusão, dependendo do seu comportamento, saberemos qual departamento deve corrigi-lo sem incomodar os outros.


Se quisermos adicionar mais detalhes estéticos, passaremos diretamente para a quinta seção. E se queremos mudar a cor, passamos para a quarta. E se mudarmos o chassi, isso não mudará a maneira como a área de pintura funciona. Ou seja, podemos modificar nossa máquina no sentido horário sem perturbar toda a fábrica.


Além disso, se, com o tempo, queremos abrir uma segunda fábrica para criar um novo modelo de carro, será mais fácil dividir as áreas de trabalho.


Arquitetura de aplicativos Android


Vamos garantir que não haja uma classe que faça todo o trabalho sozinha: solicitando dados da API, classificando e exibindo-os. Tudo isso será distribuído por várias áreas chamadas camadas.


O que são essas camadas?


Camadas da arquitetura do Android


Neste exemplo, criaremos uma arquitetura limpa, que consiste em três níveis, que por sua vez serão divididos em cinco:


  1. Nível de apresentação.
  2. O nível da lógica de negócios.
  3. E o nível de dados.

1. Nível de apresentação


O nível de apresentação é o nível do usuário, uma interface gráfica que captura os eventos do usuário e mostra os resultados. Ele também verifica se não há erros de formatação nos dados inseridos pelo usuário e se os dados exibidos são exibidos corretamente.


No nosso exemplo, essas operações são divididas entre a camada da interface do usuário e o nível do ViewModel:


  • A camada da interface do usuário contém Atividade e fragmentos que capturam eventos do usuário e exibem dados.
  • A camada ViewModel formata os dados para que a interface do usuário os exiba de uma maneira específica.

Em vez de usar o ViewModel, podemos usar outra camada que executa essa função, é simplesmente importante entender as responsabilidades de cada camada.


Em nosso exemplo, a camada da interface do usuário exibe uma lista de cervejas e a camada ViewModel relata uma cor que você deve usar dependendo do intervalo de álcool.


2. O nível da lógica de negócios


Nesse nível, estão todos os requisitos de negócios que o aplicativo deve atender. Para isso, as operações necessárias são realizadas aqui. No nosso exemplo, essa é a classificação das cervejas da menor para a maior resistência.


3. Camada de Dados


Nesse nível, estão os dados e a maneira de acessá-los.


Essas operações são divididas entre o nível do repositório e o nível da fonte de dados:


  • A camada de repositório implementa a lógica de acesso a dados. Sua responsabilidade é obter dados. É necessário verificar onde procurá-los em um determinado momento. Por exemplo, você pode primeiro verificar o banco de dados local e, se não houver dados, fazer uma solicitação para a API e salvar os dados no banco de dados. Ou seja, determina a maneira de acessar os dados. Em nosso exemplo, ele solicita dados de cerveja diretamente do nível que interage com a API.
  • A camada da fonte de dados é diretamente responsável pelo recebimento dos dados. Em nosso exemplo, ele implementa a lógica de acesso da API para obter dados da cerveja.

Como as camadas interagem?


Vejamos as abordagens teóricas e práticas da interação.


Em teoria:


Interação entre camadas


Cada camada deve se comunicar apenas com seus vizinhos imediatos. Nesse caso, se olharmos para o diagrama da arquitetura de software:


  • A interface do usuário pode se comunicar apenas com o ViewModel.
  • O ViewModel pode se comunicar apenas com o nível da lógica de negócios.
  • O nível da lógica de negócios pode se comunicar apenas com o nível do repositório.
  • E o repositório pode se comunicar apenas com a fonte de dados.

Na prática:


Estrutura do pacote no Android Studio IDE com uma arquitetura limpa:


Estrutura do pacote


Temos uma estrutura de pacotes na qual as classes são criadas, cada uma com sua própria área de responsabilidade.


Comentários finais sobre arquitetura de aplicativos


Vimos que cada nível de arquitetura de software tem sua própria área de responsabilidade e todos eles estão interconectados.


É importante enfatizar que nunca falamos sobre as bibliotecas ou linguagens de programação usadas, uma vez que a arquitetura está focada na estruturação correta do código para que seja escalável. As bibliotecas mudam com o tempo, mas os princípios da arquitetura permanecem.


Além disso, é recomendável ler sobre injeção de dependência , a fim de evitar a criação de instâncias de objetos diretamente nas classes de arquitetura e, assim, poder executar testes de unidade usando Mockito e JUnit.


Estou compartilhando um repositório onde você pode ver:


  • Um exemplo de arquitetura Android limpa com o Kotlin.
  • Use o LiveData para conectar a interface do usuário ao ViewModel.
  • O uso de corutin.
  • Kodein para injeção de dependência.
  • JUnit e Mockito para testar a lógica de negócios.

Source: https://habr.com/ru/post/pt459402/


All Articles