Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
O software é composto do código. Nós podemos ser tentados a gastar demasiado tempo e
muita hora com o código, e vê o software como simplesmente objetos e métodos.
Bons Começos para a frabicação de um carro em tempos atuais. Começa com extrema
atenção quando se escreve as especificações. O mesmo continua para o design. Meses,
talvez anos do tempo gastados em design, mudando e refinando para alcançar a perfeição,
até refletir a visão original. O processo de design não está só em papel. Muita dele inclui
fazer modelos do carro, e testá-los sob determinadas circunstâncias para ver se funcionam.
O design pode ser modificado baseado nos resultados dos teste. O carro é emitido à
produção eventualmente, e as peças são criadas e montadas junto.
A fim de criar um software bom, você tem que saber o que esse software é como um todo.
Você não pode criar um software de operação bancária a menos que você tenha uma
compreensão clara do é uma operação bancária como um todo, é seu dever compreender o
domínio da operação bancária.
Quando nós começamos um projeto de software, nós devemos focalizar no domínio que se
esteja operando. A finalidade inteira do software é realçar um domínio específico. Fazendo
isso, o software tem que caber harmoniosamente com o domínio que foi criado. O contrário
introduzirá em tensão do domínio, no mau funcionamento provocando danos, e até mesmo
no caos.
Alguém sem conhecimento da operação bancária deve aprende muito apenas lendo o código
em um modelo do domínio. Isto é essencial. O software que não tem suas raizes plantadas
profundamente no domínio não reagirá bem à mudança sobre o tempo.
Assim nós começamos com o domínio. Então como? Um domínio é algo deste mundo. Não
pode apenas ser feito sobre o teclado no computador para transformar-se em código. Nós
necessitamos criar um abstraction do domínio. Nós aprendemos muito sobre um domínio ao
falar com os peritos do domínio. Mas este conhecimento não será facilmente introduzido
como código na construções do software, a menos que nós construirmos uma abstração
dele, uma visão em nossas mentes deve ser criado. No começo, essa visão sempre será
incompleta. Mas com o tempo, trabalhando nele, nós fazemos ele melhor, e assim ele
torna-se mais e mais claro para nós. O que é este abstraction ? É um modelo, um modelo
do domínio. De acordo com Eric Evans, um modelo do domínio não é um diagrama
particular; é a idéia a que o diagrama é pretendido fazer saber. Não é justo o conhecimento
na cabeça de um perito do domínio; é uma rigorosa organização e seleção desse
conhecimento.
Mesmo um domínio específico poderiam ser mais do que uma mente humana pode aguentar
de uma so vez. Nós precisamos organizar a informação, dividir a parte macro em partes
menores, para agrupar aquelas partes nos módulos lógicos, e fazer testes de cada
componente um de cada vez. Nós necessitamos deixar para fora algumas partes do
domínio. Um domínio contem apenas informação para inclui-lo no modelo. E muito dele não
é mesmo necessário para ser considerado. Este é o desafio. O que eu devo manter e o que
eu devo jogar fora? Esta é a função do design, o processo da criação do software. O
software de operação bancária certamente contem o endereço do cliente, mas não deve
importar-se com a cor do olho do cliente. Este é um caso óbvio, mas outros exemplos não
serão óbvios.
Existem muitas maneiras diferentes de fazer isso. Um gráfico: diagramas, casos de uso,
desenhos, figuras, escrevendo. Outro é a língua. Nós podemos e devemos criar uma
línguagem de comunicação sobre detalhes do domínio. Nós detalharemos todo o estes mais
tarde, mas o ponto principal é que nós necessitamos comunicar o modelo.
Quando nós temos um modelo expressado, nós podemos começar fazer o design do codigo.
Isto é diferente do design do software. Design do software é como criar a arquitetura de
uma casa.Na outra mão, o design do código está trabalhando nos detalhes, como a posição
de uma pintura em uma determinada parede. O design do código é também muito
importante, mas não mais importante que os fundamentos do design do software. Um erro
do design do código geralmente é corrigido mais facilmente, os erros do design do software
são muito mais caros de reparar. Uma coisa é mover a pintura para a esquerda, e outra
coisa completamente diferente mover a casa de lugar.
Mas no final o produto não será bom se o design do código não for bom. Aqui os patterns do
design do codigo deverão ser apresentados, e devem ser aplicados quando necessários. As
boas técnicas de programação irão ajudam a criar um código limpo.
Uma outra abordagem é a Agile methodologies, tais como a Extreme Programming (XP).
Estas metodologias são movimentos coletivos contra à aborgadem da waterfall, isso é
resultando das dificuldades de tentar vir a expor as exigências do projeto dentro da equipe.
É realmente dificil criar um modelo completo que cubra todos os aspectos das exigencias
mais importantes do domínio. Isto exige muita averiguação, e frequentemente você apenas
não pode ver todas as exigencia envolvidas no começo, nem pode prever alguns dos efeitos
laterais ou dos erros negativos de seu design. Outro problema que precisa ser resolvido é
conhecido tambem como "analysis paralysis", os membros da equipe ficam receosos em
tomar algumas decisões sobre o projeto como um todo. Eles reconhecem a importancia do
design e temem expor as exigencia erradas. Empregar um grande ideal de implementação
com flexibilidade, com o desenvolvimento iterativo, participação da parte interessada do
negócio e muitas refatorações contínuas, a equipe do desenvolvimento começa aprender
mais sobre o domínio do cliente e pode melhorar o software do produto que se encontra
com as necessidades dos clientes.
Os métodos ágeis têm seus próprios problemas e limitações; eles protegem a simplicidade,
mas todos tem sua própria visão do que esta acontecendo. Veja bem, refatoração contínua
feita pelos desenvolvedores sem princípios solidos de design irá produzir códigos que é são
dificies de compreender ou mudar. Por outro lado a abordagem da waterfall poder conduzir
ao overengineering, o medo do overengineering pode conduzir a um outro medo: o medo
de fazer um design completamente fora do escopo e refazer tudo novamente.
Este "livro" apresenta os princípios do domain driven design(projeto dirigido por domínio,
DDD), que quando aplicado pode aumentar muito a abilidade dos processos de
desenvolvimento para modelar e implementar os problemas complexos em um dominio
reutilizavel. O DDD combina a prática e desenvolvimento e design, e mostras como o design
e o desenvolvimento podem trabalhar junto para criar uma solução melhor. Um bom design
acelera o desenvolvimento.
Quando será que vamos começar a ter uma perspectiva de desenvolvimento do software ?
Na secção anterior dissemos que devemos começar por compreender o domínio, que neste
caso, é o monitoramento do tráfego aéreo. controladores de tráfego aéreo são os
especialistas desta área. Mas os controladores não são designs do sistema ou specialistas do
software. Você não pode esperá que eles vao lhe entregar uma descrição completa do
domínio de seu problema.
O controlador e você concordam que cada avião tem uma partida e um aeroporto de
destino. Sendo assim nós temos um avião, uma partida e um destino, como mostrado na
figura abaixo
Enfim, o avião sai de algum lugar e chega em outro. Mas o que acontece no ar? Qual o
trajeto do vôo? Realmente nós estamos mais interessados no que acontece durante o vôo.
O controlador diz que avião será atribuído um plano do vôo que seja suposta deve
descrever o curso inteiro do avião. Enquanto você aguardava sobre a definição de um plano
de vôo, você imaginou qual o caminho seguido pelo avião enquanto ele esta no ar. Após
uma discussão mais aprofundada, você ouve uma palavra interessante: rota. Ela
instantaneamente captura sua atenção, e por uma boa razão. A rota contem um conceito
importante sobre o curso do avião.O que os aviões fazem durante o vôo, eles seguem uma
rota. É óbvio que os pontos de partida e os de destino do avião são também os pontos que
começam e de terminam a rota. Assim, em vez de associar a aeronave a pontos de partida
e destino, parece mais natural associá-la com uma rota, que seja associada por sua vez
com a partida e o destino correspondentes.
Falando com o controlador sobre as rotas que os aviões seguirão, você descobriu que
realmente a rota é composto por pequenos segmentos, que juntos constituem uma espécie
de uma linha torta desde a partida com o seu destino. A linha é suposto de passar por pré-
determinados pontos fixos. Assim, uma rota pode ser considerada uma série de pontos
consecutivos. Neste momento você já não vê a partida e o destino como pontos terminais
da rota, mas apenas outros dois pontos entre outros existentes. Isto é provavelmente
completamente diferente de como o controlador os vê, mas é um abstraction necessária
para ajudar mais tarde. As mudanças resultantes baseadas nestas descobertas são
O diagrama mostra um outro elemento, o fato que cada ponto é um reparo no mapa
seguido pela rota, e é expressado como um mapa tridimensional. Mas quando você falar ao
controlador, você descobrirá que não ele vê dessa maneira. Realmente vê a rota como a
projeção na terra do plano de vôo. Os pontos são ajustes na superfície do trajeto
determinado excepcionalmente por suas latitude e longitude. Assim o diagrama correto é:
Que está acontecendo realmente aqui? Você e os peritos do domínio estão falando, vocês
estão trocando conhecimentos. Você começa fazer perguntas, e eles respondem. Enquanto
fazem isso, os conceitos essenciais do dominio do tráfego de aéreo estão sendo definidos.
Esses conceitos podem sair desorganizado, mas ainda assim são essenciais para
compreender o domínio. Você e os peritos do dominio precisam aprender o máximo possível
sobre o domínio do controle de trafego aereo. E fazendo as perguntas certas, processando a
informação de maneira correta, em você e os peritos começarão esboçar uma visão do
domínio, um modelo do domínio. Esta visão está incompleta e não revisionada, mas é o
começo que você precisa. Tente entender os conceitos essenciais do domínio.
Esta é uma parte importante do design. Geralmente há umas discussões longas entre
arquitetos do software ou desenvolvedores e os peritos do domínio. Os especialistas do
software querem extrair o conhecimento dos peritos do domínio, e também têm que
transformá-lo em uma forma útil. Em algum momento, eles desejam criar um primeiro
protótipo para ver como funciona até hoje. Ao fazê-lo podemos encontrar algumas questões
com os seus modelos, ou sua abordagem, e podem querer mudar o modelo. Uma
comunicação é não somente de sentido único, dos peritos do domínio aos arquiteto do
software e ainda mais para os desenvolvedores. Há também um retorno de informação, que
ajuda a criar uma modelo melhor, e tornar mais clara compreensão do domínio. Os peritos
do domínio sabem sua área de perícia, mas as organizam e usam o conhecimento de uma
maneira específica, que não é sempre a melhor a ser executado em um software. A mente
analítica dos designes e desenvolvedores do software contribui para alguns dos conceitos
chaves da "Aircraft Route * Fix 2DPoint" do domínio durante discussões com peritos do
domínio, e ajuda também construir uma estrutura para as discussões futuras porque nós
veremos no capítulo seguinte. Nós, specialists do software (arquitetos do software e os
desenvolvedores) e os peritos do domínio, estamos criando o modelo do domínio juntos, e o
modelo é o lugar onde essas duas áreas de competência reunir-se. Isto parece como um
processo muito moroso, e é, mas este é como deve ser, porque a finalidade na extremidade
do software é resolver problemas de negócio em um domínio real da vida, por isso, a
informação dominio do software tem de ser sincronizada com o dominio real.
Para superar esta diferença no estilo de uma comunicação, quando nós construímos o
modelo, nós devemos comunicar-se para trocar aproximadamente idéias o modelo, sobre os
elementos envolvidos no modelo, como nós lidamos com o modelo, o que é relevante e o
que não é. Comunicação neste nível é primordial para o êxito do projeto. Se um disser algo,
e o outro não compreender ou, pior ainda, que entenda de outra coisa, quais são as
hipóteses para que o projecto sejam bem sucedidos?
Durante essas sessões de comunicação, a tradução é muitas vezes utilizadas para deixar os
outros compreender o que alguns conceitos estão abordando. Os desenvolvedores poderiam
tentar explicar alguns design patterns utilizando termos incompreensiveis, e às vezes sem
sucesso. Os peritos do domínio podem suas idéias criando um jargão novo. Durante este
processo uma comunicação é falha, e este tipo da tradução não ajuda ao processo de
construção do conhecimento.
Temos a tendência de utilizar a nossa própria linguagem durante estas sessões concedidas,
mas nenhuma destas linguas pode ser uma linguagem comum porque nenhuma atende a
todas as necessidades.
Nós necessitamos definitivamente falar a mesma língua quando nós nos encontramos com
para falar e definir o modelo. Que língua é esta então? Língua dos desenvolvedores? Língua
dos peritos do domínio? Algo entre as duas?
Um princípio fundamental do DDD é usar uma língua baseada no modelo. Desde que o
modelo é um terreno comum, o lugar onde o software se encontra com o domínio, que é
adequado para a utilização de contrução da linguagem do dominio.
Usar o modelo como a espinha dorsal de uma língua. Pedindo para que a equipe use essa
língua consistentemente em todas as comunicações, e também no código. Enquanto
compatilhamos conhecimento e resolvemos o modelo, a equipe usa esse dialeto para a
escrrver os diagramas. Garanta que a linguagem seja consistentemente usada em todas as
formas de comunicação utilizadas pela equipe; por esta razão, a linguagem é denominado
ubiquidade língua.
A língua Ambiqua conecta todas as partes do projeto, e cría a premissa para que a equipe
de projeto funcione bem. Ela demora semanas ou meses para tomar forma em um projeto
de grande escala. Os membros da equipe descobrem que alguns dos conceitos iniciais eram
eram incorrectos ou mal utilizados, ou descobrem novos elementos do projeto que
necessitam ser considerados e enquadrar-se na concepção global. Tudo isso não é possível
sem uma linguagem comum.
Uma lingua comum não aparecem do dia para a noite. É um trabalho duro e que exige
muito foco para certificar-se de que os elementos chaves da língua estão trazidos a
percepção de todos. Nós necessitamos encontrar aqueles conceitos chaves que definem o
domínio do projeto, e devemos encontrar as palavras correspondentes para os termos do
dominio, e começar a usá-las. Alguns destes são facilmente identificados, mas alguns são
mais dificeis.
Iron para fora dificuldades experimentando com as expressões alternativas, que refletem
modelos alternativos. Então refactor o código, rebatizando classes, métodos, e módulos
para conformar-se ao modelo novo. Resolver a confusão sobre termos na conversação,
apenas na maneira que nós vimos concordar com o meaning de palavras ordinárias.
A construção de uma língua comum tem um resultado claro: o modelo e a língua estão
fortemente interligados entre si. Uma mudança na língua deveria tornar-se em uma
mudança do modelo.
Os peritos do domínio devem opinar aos termos ou às estruturas que são inábeis ou
inadequadas para à compreensão do domínio. Se os peritos do domínio não puderem
compreender algo no modelo ou na língua, então é mais provável que algo está errado com
o dominio. Por outro lado, os desenvolvedores devem prestar atenção para a ambigüidade
ou a inconsistência que tenderá a surgir no design
Assim usam o modelo como a fonte original da inspiração, mas eles críam seu próprio
design que obtém algumas idéias do modelo, e adiciona alguma do seus próprios. O
desenvolvimento o processo continua mais longe, e mais classes são adicionadas ao código,
expandindo dividindo-se entre o modelo original e a implementação definitiva. Um resultado
final bom não é assegurado. Bom desenvolvedores poderiam entregar um produto que
funcione, mas será que vai defender os julgamentos de tempo? Será que vai ser facilmente
extendido? Será facil de dar manutenção?
Qualquer domínio pode ser expressado com muitos modelos, e qualquer modelo pode ser
expressado em várias maneiras no código. Para cada problema particular pode haver mais
do que uma solução. Qual escolha fazer? Ter um modelo analìticamente correto não
significa que o modelo pode diretamente ser expressado no código.
Ou talvez a sua execução quebrará alguns princípios do design do software, que não é
aconselhável. É importante escolher um modelo que possa ser fàcilmente e exatamente
extraido para o código. Como fazer a abordagem e a transição do modelo para o código?
Uma das técnicas de design recomendadas é chamado de analysis model, que é visto
separado do design do código e geralmente usado por pessoas diferentes. O modelo da
análise é o resultado da análise do domínio do negócio, resultando um modelo que não
tenha consideração para o software utilizado para a execução. Tal modelo é usado para
compreender o domínio. Um determinado nível de conhecimento é construído, e o resultado
do modelo pode ser analìticamente correto. O software não é levado em consideração nesta
fase, uma vez que é considerado ser um fator confuso. Este modelo atinge os
desenvolvedores que estão destinados a compreender e fazer o design. Uma vez que o
modelo não foi construído com princípios de design em mente, ele provavelmente não
servirá muito bem a essa finalidade. Os desenvolvedores terão que adaptá-la, ou criar um
design separado. E não é facil fazer essa adaptação entre o design e o código. O resultado é
que os modelos da análise são abandonados logo depois que a codificação começa.
Uma das principais questões com esta abordagem é que os analistas não podem prever
alguns dos defeitos em seu modelo, e todos as complexidades do domínio. Os analistas
podem ter entrado em detalhes com alguns componentes do modelo, e não detalharam
bastante outro. Os detalhes muito importantes são descobertos durante o processo de
design e o processo de execução. Um modelo que seja indigno ao domínio pode vir a ter
problemas sérios com os objeto de persistencia, ou comportamento inaceitável de
desempenho
Os analistas têm suas próprias reuniões fechadas onde muitas coisas são discutidas sobre o
domínio, e há um grande conhecimento sendo compartilhado. Eles críam um modelo que
supostamente contem toda a informação necessária de uma forma condensada, e os
desenvolvedores têm que assimilar tudo lendo os documentos originais que lhes foram
passado. Seria muito mais produtivo se os desenvolvedores pudessem se juntar as reuniões
dos analista e assim alcançar uma vista desobstruída e completa do domínio e do modelo
antes de começarem projetar o código.
Pegar os desenvolvedores envolvidos fornece um retorno. Isto cria um modelo correto para
ser implementado no software. Se existe algo errado, é identificado em um estágio
adiantado, e o problema pode fàcilmente ser corrigido.
Aqueles que escrevem o código devem conhecer o modelo muito bem, e se sentem
responsáveis pela sua integridade. Deviam compreender que a alteração do código implica
uma mudança para o modelo; entretanto ele vão refatorar o codigo ao ponto que não
expressa mais o modelo original. Se o analista for separado do processo da execução, ele
perderá logo o conceito sobre as limitações introduzidas pelos desenvolvedores. O resultado
é um modelo que não seja prático.
Toda a pessoa técnica que contribui ao modelo deve gastar algum tempo para olhar o
código, qualquer que seja o papel primordial que ele ou ela desempenham sobre o projecto.
Alguém responsável por mudar o código deve aprender a se expressar no modelo do código.
Cada colaborador deve ser envolvido em algum nível da discussão sobre o modelo e ter o
contato com peritos do domínio. Aqueles que contribuem de maneiras diferentes devem
conscientemente notar aqueles que fazem o código em uma troca dinâmica das idéias do
modelo através da línguagem ambigua.
Se o design, ou alguma parte central dele, não traçarem ao modelo do domínio, que o
modelo é de pouco valor, a exatidão do software então é suspeito. Ao mesmo tempo,
complexos mapeamentos entre modelos e funções do design são difíceis de compreender e,
na prática, impossível manter o design sem mudanças. O ideal é divide-se entre a análise e
design de modo que que a perspicácia adquirida em cada uma dessas atividades não
prejudique a outros.
A solução para uma arquitetura comum para DDD contem quatro camadas essenciais
Application Layer:
Esta é uma fina camada que coordena a atividade da aplicação. Não contem a lógica de
negócio. Não segura o estado dos objetos de negócio, mas pode segurar o estado do
progresso de uma tarefa da aplicação.
Domain Layer
Esta camada contem a informação sobre o domínio. Este é o coração do negócio do
software. O estado de objetos do negócio é prendido aqui. A persistencia dos objetos do
negócio e possivelmente seu estado é delegado à camada da infraestrutura.
Infrastructure Layer
Esta camada age como uma biblioteca de suporte para todas as outras camadas. Ela
fornece uma comunicação entre as camadas, adiciona persistencia objetos de negócio,
contem bibliotecas de suportande para a camada de interação com o usuario, e etc.