domingo, 23 de agosto de 2015

Modelo expresso em Software - DDD


Para um modelo de domínio refletir a abstração do domínio de um software da forma mais adequada possível, as classes são categorizadas de acordo com o papel que cada uma desempenha. Cada papel tem certas responsabilidades e relacionamentos com outras classes que desempenham outros papeis. Sendo assim, definir o papel de cada classe facilita a implementação do modelo de domínio. As classes que implementam o modelo de domínio podem ser categorizadas em: 

Entidade
Uma entidade é um objeto com um significado expressivo para o domínio que está sendo modelado, ela que possui uma identidade. Uma entidade pode ter seus atributos alterados, mas sua identidade deve ser definida de forma que possa ser rasteada.

O conceito mais importante das entidades é que elas possuem uma identidade, e é isso que as difere dos demais objetos, é a identidade que permite que as entidades podem ser identificadas de alguma forma.

Em um modelo relacional é comum pensar que um objeto que tem um id é uma entidade, mas todos os objetos para serem gravados e indexados em banco de dados devem ter id. O identificador de uma entidade deve ser expressivo para o domínio, o id relacionado ao banco de dados é mais uma restrição técnica do que uma regra do domínio.

Um identificador deve ser único e imutável dentro do sistema, mesmo que todos os dados do objeto mudem o identificado deve permanecer o mesmo, é através dele que devemos ter condições de identificar um objeto que mesmo tendo todas as propriedades alteradas continua sendo o mesmo. Por exemplo, em um sistema de cadastro de pessoas, para uma pessoa física podemos utilizar como identificador seu CPF, mesmo essa pessoa trocando de nome, endereço, telefone e todos os demais dados, seu CPF jamais mudará. É esse identificador que nos permite encontrar essa pessoa mesmo tento sido alterado todos os dados. O identificador também pode ser formado por um conjunto de dados, como nome e CPF, ou CPF e endereço, tudo vai depender do modelo, a definição da identidade depende do entendimento do domínio.

Objetos de Valor
Os objetos de valor são simulares as entidades, são definidos por seus atributos e frequentemente são imutáveis. Esses objetos nos ajudam a descrever o domínio e compõem as entidades, no entanto não possuem identidade conceitual isso é o que mais os diferencia das entidades.

Podem existir situações em que uma classe em um sistema pode ser uma entidade e em outro pode ser objeto de valor, isso vai depender do domínio da aplicação, por exemplo, em um contexto de um sistema de cadastro de cliente o endereço é apenas um objeto de valor que está atribuído ao objeto cliente, não há necessidade de saber se o endereço é ou já foi cadastrado anteriormente pelo cliente, o importante é saber os dados do endereço, já em um sistema de transporte de carga onde são definidas rotas a partir de um endereço este seria uma entidade. Para sabermos se uma classe será uma entidade ou um objeto de valor precisamos conhecer o domínio do sistema.

Serviços
Algumas operações do domínio não se enquadram em uma entidade ou em objeto de valor, quando desistimos de colocar essas operações em um objeto, passamos gradualmente para a programação procedural, mas se foçamos a operação em um objeto a qual não se enquadra, violamos os princípios de coesão e baixo acoplamento.

Um serviço é uma operação fornecida como uma interface, fica isolado no modelo. Servem para resolver problemas de negócio que não tem relação com entidade nem objeto de valor.

Os nomes das operações de um serviço devem ser provenientes da linguagem onipresente, ou seja, as operações devem fazer parte do domínio, assim como os parâmetros e retornos devem ser objetos do domínio. Um serviço nunca deve roubar o lugar de uma entidade ou objeto de valor, devem ser utilizados com cuidado.

Eric Evans (Evans, 2004) descreve um bom serviço com três características:
  1. A operação está relacionada a um conceito do domínio que não é uma parte natural de uma ENTIDADE ou de um OBJETO DE VALOR.
  2. A interface é definida em termos de outros elementos do modelo de domínio.
  3. A operação não possui um estado
Evans descreve o uso de um serviço da seguinte forma:

Quando um processo significativo ou uma transformação no domínio não é uma responsabilidade natural de uma ENTIDE ou OBJETO DE VALOR, acrescente uma operação no modelo como uma interface autônoma declarada como SERVIÇO. Defina a interface em termo de linguagem do modelo e certifique-se de que o nome da operação faça parte da LINGUAGEM ONIPRESENTE. Faça com que o SERVIÇO não tenha um estado. 

Nenhum comentário:

Postar um comentário