.NET - Comparando Clean Architecture com Arquitetura em Camadas  - II


  Neste tutorial veremos como criar uma aplicação usando a arquitetura em 3 camadas lógicas ou 3-layer.

Continuando o artigo anterior vamos iniciar apresentando a Clean Architecture e a seguir compará-la com a arquitetura em camadas.

A Clean Architecture

A promoção do termo Clean Architecture foi feito por Robert C. Martin (Uncle Bob) no seu livro :  Clean Architecture :  A Craftsman's Guide to Software Structure.

Os conceitos aplicados e usados na Clean Architecture já eram discutidos e usados na arquitetura Hexagonal e também na arquitetura Cebola.

A Arquitetura limpa é uma filosofia de projeto de software que separa os elementos de um design em níveis de anel que tem como objetivo fornecer aos desenvolvedores uma maneira de organizar o código de forma que ele encapsule a lógica de negócios, mas o mantenha separado do mecanismo de entrega.

A regra principal da arquitetura limpa é que as dependências do código só podem ser movidas dos níveis externos para dentro. O código nas camadas internas pode não ter conhecimento das funções nas camadas externas. As variáveis, funções e classes (quaisquer entidades) que existem nas camadas externas não podem ser mencionadas nos níveis mais internos. Recomenda-se que os formatos de dados também fiquem separados entre os níveis.

Visualmente, os níveis de arquitetura limpa são organizados em um número não especificado de anéis. Os níveis externos dos anéis são mecanismos de nível inferior e os níveis internos superiores contêm políticas e entidades.

As principais regras da Clean Architecture são:

1- As classes de negócios (normalmente as classes mapeadas para um banco de dados) estão na camada mais interna da “cebola”;

2- A camada mais interna da cebola não deve ter nenhum código externo significativo, por exemplo, pacotes NuGet, adicionados a ela. Isso foi projetado para manter a lógica de negócios o mais limpa e simples possível; 

3- Apenas a camada externa pode acessar qualquer coisa fora do código. O que significa que :
   a - O código que os usuários acessam, por exemplo ASP.NET Core, está na camada externa;
   b - Todos os serviços externos, como banco de dados, envio de e-mail, etc., estão na camada externa;

4- O código em camadas internas não pode fazer referência a nenhuma camada externa.

Mas se você estiver iniciando agora pode ficar confuso sobre qual seria a diferença entre a Clean Architecture e a arquitetura em camadas tradicional conhecida como n-Layer.

Podemos dizer que a Arquitetura Limpa é como a arquitetura tradicional em camadas, mas com uma série de regras que melhoram as camadas.

Então vamos fazer uma comparação entre ela.

Comparação com a arquitetura n-Layer

Vamos tomar como referência uma aplicação que usa uma arquitetura em camadas(n-Layer) muito usada :

Nesta arquitetura geralmente as regras de negócio da aplicação ficam espalhadas pelas camadas negócio da aplicação quer seja na camada Service ou ainda na camada Web embutido nos controladores. E isso é uma falha de arquitetura.  Por mais bem escrito que esteja, esse acoplamento pode custar muito sua manutenção futura.

Outro problema que esta arquitetura apresenta é que de forma geral as entities  acabam possuindo dependências diretas com regras de negócio e com o ORM usado no projeto, trazendo para ela uma grande responsabilidade e um grande ponto de falha com essa mistura de políticas de baixo e alto nível.

Com essa estrutura como poderíamos migrar uma tecnologia ou um Framework sem alterar praticamente todo o código ?

Por estes motivos a Clean Architecture se destaca pois resolve esses problemas.

Dessa forma embora ambas as abordagens aplicam camadas para separar as responsabilidades, elas fazem isso de uma maneira diferente.

A Arquitetura de Camadas (n-layer) trata da comunicação com o banco de dados por meio de camadas de lógica de negócios e representação. É fortemente acoplado aos recursos externos como frameworks e drivers de terceiros que você deseja usar, como por exemplo : um servidor HTTP, um ORM ou um driver SQL, etc.

Assim na abordagem da arquitetura em Camadas (n-Layer) temos que o projeto é construído em torno do acesso a dados e outras infraestruturas. A aplicação tem este acoplamento, quando o acesso a dados, serviços web, etc. mudam, a camada de lógica de negócios terá que mudar e esta abordagem pode levar a um grande emaranhado de dependências

A Arquitetura Limpa envolve a implementação de casos de uso e a construção de camadas de adaptadores e recursos externos (frameworks/ drivers de terceiros) em torno deles. Ela é fracamente acoplada às partes externas que você deseja usar por causa da camada dos adaptadores.

Na Arquitetura limpa, a representação e as camadas do banco de dados seriam ambas incluídas nas camadas externas. Portanto, a arquitetura limpa é mais sobre como criar um aplicativo e separá-lo dos elementos externos que ele usa para se comunicar com seu ambiente.

Nesse cenário, é muito mais fácil testar, desenvolver e manter o código do aplicativo. Você não precisa escrever testes de integração ou simular o ORM para testar a lógica de negócios.

Você não precisa se preocupar com as coisas externas ao implementar a lógica de negócios; você pode se concentrar no próprio aplicativo. Você não precisa modificar a lógica de negócios para substituir qualquer framework / driver externo, é o suficiente para escrever um novo adaptador para fazer isso.

E assim a Clean Architecture leva uma grande vantagem em termos de desacoplamento, testabilidade , robustez e manutenção.

"Toda a Escritura é divinamente inspirada, e proveitosa para ensinar, para redargüir, para corrigir, para instruir em justiça;"
2 Timóteo 3:16

Referências:


José Carlos Macoratti