Modelagem de Domínio - Ferramenta Essencial para a Modelagem de Sistemas Computacionais
O termo domínio é utilizado para denotar ou agrupar um conjunto de sistemas ou de áreas funcionais que exibam funcionalidades similares.
Exemplos de domínio incluem:
- Domínio de Telecomunicações
- Domínio Logístico Atacadista
- Domínio Bancário
- Domínio de Seguros de Saúde
- Domínio Acadêmico Escolar
Podemos então descrever o domínio aplicacional como sendo uma coleção de aplicações de software que partilham um determinado conjunto de características. Da mesma forma, o domínio é definido por um conjunto de características que descrevem uma família de problemas para os quais uma determinada aplicação pretende dar solução.
Um modelo de domínio é um artefato comum em várias metodologias (RUP ou escolas ágeis) usado para expressar um determinado domínio, normalmente em linguagem UML.
Antes de definir este artefato, vamos dizer o que não é este modelo. Um modelo de domínio não é um diagrama de classes em nível de análise, um diagrama de classes em nível de desenho, muito menos um modelo de entidades e relacionamentos (DER). Um modelo de domínio não carrega informaçães técnicas (Java ou C#), que devem estar presentes em um modelo de desenho. Um modelo de domínio também não carrega todo o detalhamento do comportamento e estrutura (operações e atributos), que devem estar presentes em um modelo de análise. Um modelo de domínio também não carrega informações de armazenamento de informações ou normalizações, que devem estar presentes em um DER.
Mas, afinal, o que é um modelo de domínio?
1. Um modelo de domínio é um produto da modelagem de negócios, i.e., ele representa, em certa escala, o negócio sendo modelado e compreendido.
2. Um modelo de domínio deve, por consequência, ser realizado inicialmente pelos analistas de negócios e usuários do projeto, e revisado e complementado pelo máximo de participantes de um projeto. O modelo de domínio deve ser um artefato colaborativo, compartilhado por todo o time do projeto.
3. Um modelo de domínio captura o vocabulário do sistema ou negócio sob modelagem. Como exemplo, um modelo de domínio de um sistema acadêmico de uma faculdade irá possuir os elementos Aluno, Professor, Curso, Disciplina ou Matrícula, entre diversos outros. Podemos perceber, então, que o modelo de domínio expressa o glossário do negócios sob modelagem.
4. Um modelo de domínio é uma representação lógica e estrutural de elementos do domínio e seus relacionamentos. Um diagrama de classes UML possui os elementos necessários para esta estruturação. Normalmente os conceitos de classes, associações e generalizações são suficientes para estruturar um modelo de domínio. Como consequência, um modelo de domínio não captura interações temporais ou representações físicas de modelagem.
5. Um modelo de domínio expressa uma visão conceitual preliminar acerca de um sistema e é chamado de diagrama de classes conceitual por alguns autores. Um exemplo extraído do excelente site do Scott Ambler (http://www.agilemodeling.com) de modelagem de domínio representa esta idéia.
(c) Scott Ambler, 2003-2006.
6. Um modelo de domínio deve ser feito no começo do projeto. Temporalmente, ele deve ser expresso e ganhar maturidade até o primeiro décimo do projeto. Por exemplo, se você tem na sua mão uma demanda de dois meses, devemos conseguir um modelo de domínio relativamente estável até o fim da primeira semana. Isso requer, como pode ser imaginado, um esforço intenso com os usuários chave para capturar o vocabulário, glossário e representá-lo em UML.
7. Um modelo de domínio (enquanto artefato) não precisa ser evoluído formalmente no restante do projeto. Isto pode parecer estranho, mas o objetivo do modelo de domínio é capturar o negócio e servir de insumo para a geração de modelos mais formais como o diagrama de classes ou o DER e depois o código executável. Em outras palavras, podemos imaginar o modelo de domínio como um estágio evolucionário para gerarmos os diagramas estruturais, comportamentais e o código de um projeto de software. Cabe citar que o modelo de domínio, enquanto conceito, como bem capturado pelas resenhas a este blog, evolui sempre, isto é, o diagramas de classes, o DER e o código também refletem conceitualmente o domínio do problema e por isso podem ser entendidos como “modelos de domínio”.
8. Um modelo de domínio também é um padrão arquitetural para a modelagem de sistemas OO, padrão este que encapsula lógica de negócios e dados em entidades coesas. Uma referência mais densa sobre este aspecto pode ser encontrada no excelente livro Patterns of Enterprise Application Architectures (http://martinfowler.com/books.html#eaa), do autor Martin Fowler. Recomendo também o artigo Anemic Domain Model (http://www.martinfowler.com/bliki/AnemicDomainModel.html) como anti-exemplo do uso deste padrão.
9. Um modelo de domínio pode carregar padrões de análise. Um padrão de análise não é um padrão técnico (desenho ou arquitetura), mas uma representação conveniente para expressar um aspecto de negócio em sistemas de informação. Exemplos de padrões de análise envolvem a representacão de quantidades (monetárias ou medicamentos), a representação de faixas de valores (início/fim), padrões contábeis (parcelamentos de dívidas, contratos) ou representação de papéis (roles). O site sobre Analysis Patterns (http://martinfowler.com/articles.html#ap) do autor Martin Fowler traz informações valiosas sobre este tópico.
Se você não entendeu nada até o momento, um exemplo pode ajudar a colocar alguma luz neste conceito. Vamos assumir que você precise representar o domínio de sistemas de gestão da geração e transmissão de energia elétrica. Um modelo de domínio que mostra este negócio em termos de seus elementos (ex: transformador, consumidor de energia) e relacionamentos é mostrado aqui.
Compilo aqui, para os mais interessados neste artefato e nesta técnica, uma lista de referências mais técnicas de modelagem de domínio de vários especialistas de mercado.
- ICONIX: http://www.ddj.com/architect/184414689 - Fornece uma visão sobre os 10 erros mais comuns na modelagem de domínio de sistemas computacionais.
- Introduction to Class Normalization - http://www.agiledata.org/essays/classNormalization.html - Fornece uma visão evolutiva sobre modelagem de classes em UML.
- Agile Modeling – http://www.agilemodeling.com/essays/amddPresentation.htm - Traz princípios complementares sobre a modelagem ágil de sistemas.
- Análise Robusta – http://www.agilemodeling.com/artifacts/robustnessDiagram.htm e http://www.ddj.com/architect/184414712 - Técnica complementar à modelagem de domínio para capturar entidades, comportamentos e fronteiras de um sistema.
Excelente explanação Corélio!
Permita-me acrescentar aqui, uma pitada filosófica à sua explanação.
Um modelo de domíno remete-nos a uma ciência poderosa: a ontologia, que nos permite estudar a natureza e a organização das coisas.
Podemos dizer que, se um modelo E-R é um esquema para os dados, então o Modelo de Domínio, isto é a Ontologia de um domínio, é o esquema para os conceitos. Trata-se de uma rede de significados, que traz à tona os conceitos de um determinado problema, seus atributos, seus axiomas e relações.
A utilização dessa poderosa ferramenta, possui uma série de vantagens das quais alisto duas:
1. Ajuda a evitar interpretações ambíguas do conhecimento pertinente ao domínio estudado. Ao contrário da linguagem natural em que as palavras podem ter semântica totalmente diferente conforme o seu contexto, o modelo de domínio, por ser apresentado em linguagem formal, deixa pouco espaço para o “gap” semântico existente na linguagem natural.
2. Permite o compartilhamento desse conhecimento, como é o caso dos padrões de análise, que você muito bem citou.
Sem dúvida, Corélio, o Modelo de Domínio é uma poderosa ferramenta para se catpurar o entendimento de determinado negócio. Se ela for mais explorada e efetivamente utilizada pelos Analistas de Negócio, certamente teremos sistemas melhores, que vão diretamente ao encontro das necessidades de nossos clientes.
Um grande abraço.
Alcebíades
Comentário de Alcebíades — 11 de Julho de 2008 @ 00:33
Para metodologias ágeis (e qualquer alternativa que use Domain-Driven Design, ágil ou não) o modelo de domínio é o código. UML é utilizada apenas como meio de comunicação entre pessoas e não como especificação.
Ainda que você utilize uma metodologia que -seja lá por qual motivo- utiliza documentos de especificação em UML ou qualquer outra notação não faz muito sentido ter um modelo de domínio divergente do código.
A afirmação de que o modelo não evolui com o tempo é estranha para mim. Numa abordagem iterativa -seja RUP ou qualquer metodologia ágil- você não vai coletar todo conhecimento sobre o projeto de uma só vez, isso é extremamente anti-iterativo e sintoma de waterfall. Como você vai coletar conhecimento no decorrer do projeto é esperado que o modelo -seja nexpresso em diagramas ou código apenas- evolua com esta coleta.
[]s
Comentário de Phillip Calçado — 12 de Julho de 2008 @ 02:22
Obrigado pelo comentário, Alcebíades. Contribuições valiosas sobre Ontologia e sobre a Arbol porphyriana - http://wapedia.mobi/pt/Porf%C3%ADrio
Comentário de marco — 14 de Julho de 2008 @ 11:12
Obrigado pelo comentário, Philip. Permita-me apenas ponderar sobre duas opiniões controversas que você capturou bem no seu comentário.
1. Concordo que o modelo de domínio não deve (e não será) divergente do código. Ele será evoluído em modelos mais robustos e código.
2. Sobre a afirmação que “O modelo de domínio não evolui”. Em verdade usei mal o português aqui. Quiz dizer que o modelo de domínio poderia ser comparado a um “bebê” que evolui para um ser humano completo ao se tornar um diagrama de classes mais robusto e código executável. Desta forma, o modelo de domínio (enquanto artefato) termina, mas naturalmente o código e os diagramas extraídos agora possuem o DNA daquele domínio.
Obrigado pelo valioso e esclarecedor comentário…
Comentário de marco — 14 de Julho de 2008 @ 11:17
Marco, ótimo artigo. Apesar de ser contra a produção do Modelo de Domínio como artefato, acredito que esse conceito tem que estar bem disseminado entre aqueles responsáveis pela análise. Nessa linha, a Visão de Futuro do sistema também é essencial. Essas preocupações devem permear todo o processo, mesmo que seja no XP ou similar. Um abraço!
Comentário de Samuel Diniz Casimiro — 17 de Agosto de 2008 @ 16:31
[…] OO: Modelagem de Domínio - Ferramenta Essencial para a Modelagem de Sistemas Computacionais […]
Pingback de Marco Mendes´s Blog » Artigos de Engenharia de Software - 2008 — 31 de Dezembro de 2008 @ 01:19