Escolar Documentos
Profissional Documentos
Cultura Documentos
Introdução ....................................................................................1
O que é design orientado por domínio .........................................3
Construindo conhecimento de domínio .......................................8
A Língua Onipresente ................................................................13
A necessidade de uma linguagem comum .................................13
Criando a linguagem onipresente ...............................................16
Design orientado para modelos .................................................23
Os blocos de construção de um design orientado por modelos .28
Arquitetura em camadas ............................................................29
Entidades ....................................................................................31
Objetos de valor .........................................................................34
Introdução
1
2│ DESIGN ORIENTADO POR DOMÍNIO RAPIDAMENTE
Departure
Aircraft Route
Destination
Conversando com o controlador sobre as rotas que os aviões seguem, você
descobre que na verdade a rota é composta por pequenos segmentos, que
juntos constituem algum tipo de linha torta da partida para o destino. A
linha deve passar por pontos fixos pré-determinados. Assim, uma rota pode
ser considerada como uma série de correções consecutivas. Neste ponto
você não vê mais a partida e o destino como os pontos terminais da rota,
mas apenas mais duas dessas correções. Isso é provavelmente muito
diferente de como o controlador vê-los, mas é uma abstração necessária que
ajuda mais tarde. As mudanças resultantes com base nessas descobertas são:
3DPoint
2DPoint
O
capítulo anterior cedeu que é absolutamente necessário
desenvolver um modelo do domínio, fazendo com que os
especialistas em software trabalhem com os especialistas em
domínio; no entanto, essa abordagem geralmente tem algumas
dificuldades iniciais devido a uma barreira de comunicação
fundamental. Os desenvolvedores têm suas mentes cheias de
classes, métodos, algoritmos, padrões, e tendem a sempre fazer
uma combinação entre um conceito da vida real e um artefato de
programação. Eles querem ver quais classes de objeto criar e
quais relações modelar entre eles. Eles pensam em termos de
herança, polimorfismo, OOP, etc. E eles falam assim o tempo
todo. E é normal que eles façam isso. Desenvolvedores serão
desenvolvedores. Mas os especialistas em domínios geralmente
não sabem nada sobre nada disso. Eles não têm ideia sobre
bibliotecas de software, frameworks, persistência, em muitos
casos nem mesmo bancos de dados. Eles sabem sobre sua área
específica de especialização.
No exemplo de monitoramento do tráfego aéreo, os especialistas
em domínios sabem sobre aviões, sobre rotas, altitudes,
longitudes e latitudes, eles sabem sobre desvios da rota normal,
sobre trajetórias de aviões. E eles falam sobre essas coisas em
seu próprio jargão, que às vezes não é tão simples de seguir por
um estranho.
13
Para superar essa diferença no estilo de comunicação, quando
construímos o modelo, devemos comunicar para trocar ideias sobre o
modelo, sobre os elementos envolvidos no modelo, como os
conectamos, o que é relevante e o que não é. A comunicação nesse
nível é primordial para o sucesso do projeto. Se um diz alguma coisa,
e o outro não entende ou, pior ainda, entende outra coisa, quais são
as chances de o projeto ter sucesso?
Um projeto enfrenta sérios problemas quando os membros da equipe
não compartilham uma linguagem comum para discutir o domínio.
Especialistas em domínios usam seu jargão, enquanto os membros da
equipe técnica têm sua própria linguagem sintonizada para discutir o
domínio em termos de design.
A terminologia das discussões cotidianas é desconectada da
terminologia incorporada no código (em última análise, o produto
mais importante de um projeto de software). E mesmo a mesma
pessoa usa linguagem diferente na fala e na escrita, de modo que as
expressões mais incisivas do domínio muitas vezes emergem de
forma transitória que nunca é capturada no código ou mesmo por
escrito.
Durante essas sessões de comunicação, a tradução é frequentemente
usada para permitir que os outros entendam do que se trata alguns
conceitos. Os desenvolvedores podem tentar explicar alguns padrões
de design usando a linguagem de um leigo, e às vezes sem sucesso.
Os especialistas em domínios se esforçarão para trazer para casa
algumas de suas ideias, provavelmente criando um novo jargão.
Durante esse processo a comunicação sofre, e esse tipo de tradução
não ajuda no processo de construção do conhecimento.
Tendemos a usar nossos próprios dialetos durante essas sessões de
design, mas nenhum desses dialetos pode ser uma linguagem comum
porque nenhum atende às necessidades de todos.
Definitivamente precisamos falar a mesma língua quando nos
encontramos para falar sobre o modelo e defini-lo. Que língua vai
ser? A linguagem dos desenvolvedores? A linguagem dos
especialistas em domínios? Algo no meio?
Um princípio central do design orientado por domínio é usar uma
linguagem baseada no modelo. Como o modelo é o terreno comum, o
lugar onde o software encontra o domínio, é apropriado usá-lo como
base de construção para esta linguagem.
Use o modelo como espinha dorsal de uma linguagem. Solicite que a
equipe use o idioma de forma consistente em todas as comunicações e
no código. Ao compartilhar conhecimento e martelar o modelo, a equipe
usa fala, escrita e diagramas. Certifique-se de que essa linguagem
apareça consistentemente em todas as formas de comunicação utilizadas
pela equipe; por essa razão, a língua é chamada de Língua Onipresente.
A Linguagem Onipresente conecta todas as partes do design, e cria a
premissa para que a equipe de design funcione bem. Leva semanas e até
meses para que projetos de projetos em grande escala tomem forma. Os
membros da equipe descobrem que alguns dos conceitos iniciais foram
incorretos ou usados inapropriadamente, ou descobrem novos elementos
do design que precisam ser considerados e se encaixam no design geral.
Tudo isso não é possível sem uma linguagem comum.
Línguas não aparecem da noite para o dia. É preciso muito trabalho e
muito foco para garantir que os elementos-chave da linguagem sejam
trazidos à tona. Precisamos encontrar esses conceitos-chave que definem
o domínio e o design, e encontrar palavras correspondentes para eles, e
começar a usá-los. Alguns deles são facilmente vistos, mas alguns são
mais difíceis.
Resolver dificuldades experimentando expressões alternativas, que
refletem modelos alternativos. Em seguida, refatorar o código,
renomeando classes, métodos e módulos para se adequar ao novo
modelo. Resolver a confusão sobre os termos da conversa, da maneira
como chegamos a concordar com o significado das palavras comuns.
Construir uma linguagem como essa tem um resultado claro: o modelo e
a linguagem estão fortemente interconectadas entre si. Uma mudança na
linguagem deve se tornar uma mudança no modelo.
Fix
2DPoint
Fix
2DPoint
O
s capítulos anteriores ressaltaram a importância de uma
abordagem para o desenvolvimento de software centrada no
domínio empresarial. Dissemos que é fundamentalmente
importante criar um modelo que esteja profundamente enraizado
no domínio, e que reflita os conceitos essenciais do domínio com
grande precisão. A Linguagem Onipresente deve ser totalmente
exercida durante todo o processo de modelagem, a fim de
facilitar a comunicação entre os especialistas em software e os
especialistas em domínio, e descobrir conceitos-chave de
domínio que devem ser usados no modelo. O objetivo deste
processo de modelagem é criar um bom modelo. O próximo
passo é implementar o modelo em código. Esta é uma fase
igualmente importante do processo de desenvolvimento de
software. Tendo criado um ótimo modelo, mas não transferindo-
o adequadamente para o código acabará em software de
qualidade questionável.
REPOSITORIES
access with
SERVICES
access with
X
mutually exclusive
choices LAYERED encapsulate with
ARCHITECTURE FACTORIES
SMART UI
Arquitetura em Camadas
User Infrastructure
Interface Application Domain
Customer Customer
customerID customerID
name name
street address
city
state
Address
street
city
state