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:
-
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.
-
A interface é definida em termos de outros elementos do modelo de domínio.
-
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