domingo, 16 de agosto de 2015

Arquitetura em Camadas - DDD


Existem várias maneiras de dividir um sistema de software, mas por questões de convenções e experiência a arquitetura em camadas é a mais adotada. A arquitetura de camadas nos ajuda a ter alta coesão, baixo acoplamento e separar as responsabilidades.

Alguns arquitetos de software se preocupam muito mais com a infraestrutura (frameworks e tecnologias) da arquitetura do que com o problema que o software se propõem a resolver. Uma arquitetura de ponta pode trazer boa resposta no desenvolvimento do sistema, mas se toda essa tecnologia não conseguir resolver o problema proposto, a arquitetura não conseguiu agregar valor ao cliente.

As camadas de uma arquitetura devem fazer algum sentido, devem separar responsabilidades, cada camada deve se especializar em um aspecto do sistema, além de permitirem uma manutenção mais barata. Algumas vezes criamos camadas apenas por ser um padrão, em algum momento um arquiteto definiu que em seu software para que um objeto fosse persistido em banco de dados, ele precisaria passar por todas as camadas do sistema até chegar a persistência, mas isso não deve ser tomado como uma verdade absoluta, podemos está apenas gerando uma camada para trafegar objetos, uma camada que não tem função alguma no sistema, mas como cada caso é um caso, uma camada a mais ou a menos pode ser adequada, como dito o importante é que a camada deve ter uma responsabilidade, senão, ela não deve existir.

A maior parte das arquiteturas bem sucedidas de aplicações que utilizam o DDD faz uso das quatro camadas abaixo:

Camadas básicas de uma aplicação com DDD
Camadas básicas de uma aplicação com DDD 

Interface de Usuário: Responsável por apresentar informações tanto de entrada quanto de saída de forma amigável ao ator, e interpretar seus comandos. Em um sistema Web nesta camada estariam páginas do sistema e todos os arquivos utilizados para a comunicação com o usuário com scripts, imagens, css e etc. Em uma aplicação Desktop teríamos os componentes de G.U.I.

Aplicação: Responsável por trabalhar os objetos para a camada seguinte. Não contém regras de negócio por mais simples que estas sejam e nem conhece o negócio. Em uma aplicação Web teríamos nesta camada os Controladores, Listeners, Servlets, Conversão de Dados, por exemplo.

Domínio: É o coração do sistema, responsável por representar as regras, informações e conceitos do negócio, aqui os objetos são usados e controlados, mas sua armazenagem fica a cargo da infraestrutura. Esta camada deve ser o mais isolada possível do restante da aplicação.

Infraestrutura: Fornece recursos que oferecem suporte para as camadas de cima, como persistências de dados, envio de e-mail, manipulação de arquivos, etc.

Como pode ser visto na figura acima as camadas têm uma dependência vertical e de cima para baixo. A camada de interface depende da aplicação que depende do domínio que depende da infraestrutura. Como apresentado na figura, essa não é uma ordem que deve sempre ser seguida, pode-se ter a aplicação acessando diretamente a infraestrutura ou, a interface se comunicando diretamente com o domínio. O importante é utilizar as camadas necessárias para desenvolver a funcionalidade desejada, se não é necessário passar por uma camada, não precisamos utilizá-la para não torna-la uma camada de trafego, ela pode ser ignorada naquele momento, mas sempre deve ser respeitada a regra de que a camada de cima acessa a de baixo, nunca o contrario, uma camada sempre dependeram da inferior, mas nunca da superior.

Algumas arquiteturas não tem uma distinção clara entre as camadas de interface do usuário e aplicação, outras, utilizam várias camadas de infraestrutura, isso não chegar a ser um problema para o DDD, o DDD requer apenas a existência da camada de domínio, pois é ela que possibilita o Design Dirigido por Modelos. O isolamento do domínio é um pré-requisito para o DDD.

Como os objetos do domínio devem ser isolados das demais camadas, isso permite que estes objetos expressem o modelo de domínio, permitindo que o modelo evolua e se torne rico o suficiente para captar o conhecimento necessário do negócio. 

Nenhum comentário:

Postar um comentário