What Is Domain-Driven DesignO desenvolvimento de software é mais frequentemente aplicado a automatizar processos que existem no mundo real, ou fornecer soluções aos problemas de negócio reais; Os processos do negócio que estão sendo automatizados ou problemas reais do mundo é o domínio do software. Nós devemos compreender do começo que o software está originado e relacionado profundamente a este domínio.
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.
Considere a fabricação de um carro em tempos passados. Os trabalhadores envolvidos na fabricação podem especializar-se em produzir as peças do carro, mas estes trabalhadores frequentemente tem uma vista limitada do processo de fabricação do carro. Ao final da fabricação eles verão o carro porque uma coleção enorme de peças começaram a se encaixar, mas a frabricação do carro é muito mais que simples encaixes.
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.
O desenvolvimento do software é similar. Nós não podemos apenas sentar e datilografar o código, mesmo sendo um especialista em programação.
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.
É possível criar um software de operação bancária complexo sem o pleno conhecimento do domínio? Nunca. Quem sabe o caixa do banco? arquiteto do software? Não. O analista do software? Não realmente. O analista sabe analisar um tópico dado, quando é dado todos os ingredientes necessários. O desenvolvedor? Esquece. Quem então? Os banqueiros, é obvio. O sistema de operação bancária é bem compreendido pelos responsáveis e por seus specialistas. Eles sabem todos os detalhes. Este é o lugar onde nós devemos sempre começar: o domínio
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.
O modelo é nossa respresentação interna do domínio, e é muito necessário durante todo o projeto e o processo do desenvolvimento. Durante o processo do projeto nós recordamos e fazemos consultas as referências ao modelo.
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.
Um modelo é uma parte essencial do design do software. Nós necessitamos tratar da complexidade. Todo nosso processo de pensamento sobre o domínio sintetizado dentro deste modelo. Isso é bom, mas tem que sair de nossa cabeça. Nós necessitamos comunicar este modelo com os peritos do domínio, com os designers, e com os developers. O modelo é a essência do software, mas nós necessitamos criar maneiras expressá-lo, para comunicá-lo com o outro. Nós não estamos sozinhos neste processo, assim que nós necessitamos compartilhar do conhecimento e da informação, e nós necessitamos fazê-la bem, precisamente e sem ambigüidade.
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.
Há diferentes abordagens para o design do software. Um é o waterfall design method. Este método envolve um número de estágios. Os peritos do negócio expõem as exigências mais importantes que são comunicadas aos analistas do negócio. Os analistas críam um modelo baseado nessas exigências, e passam os resultados aos desenvolvedores, que começam a codificar baseado em o que receberam. É um fluxo de sentido único do conhecimento. Esta é uma abordagem tradicional no design do software, e foi usada com um determinado nível de sucesso sobre os anos, tem seus falhas e limites. O problema principal é que não há nenhum retorno dos analistas aos peritos do negócio ou dos desenvolvedores aos analistas.
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.
Building Domain KnowledgeVamos considerar o exemplo de um projeto para um sistema de controle do vôo, e como o conhecimento do domínio pode ser construído.
Milhares de aviões estão no ar sobreveando todo o planeta planeta. Estão voando seus próprios trajetos para seus devidos destinos, e é muito importantes certificar-se que não colidem no ar. Nós não tentaremos elaborar um sistema inteiro de controle do tráfego, mas em um subconjunto menor que seja um sistema de monitoração do vôo. O projeto proposto é um sistema de monitoração de trilhas de cada vôo sobre alguma área, determina se o vôo esta seguindo sua rota suposta ou não, e se existe a possibilidade de uma colisão.
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.
Os controladores de tráfego de aéreop possum um vasto conhecimento sobre seu domínio, mas para contruir um modelo será necessário extrair as informações essenciais e centraliza-la. Quando você começar a falar com eles, você vai ouvir muito sobre os aviões que decolam, aterrisam, os perigo de colisão, os aviões que estão esperando a autorização de pouso, e etc. Para encontrar ordem nesta aparentemente quantidade caótica de informação, temos que começar de algum lugar.
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.
The Need for a Common LanguageO capítulo anterior descreveu que é absolutamente necessário desenvolver um modelo do domínio tendo o trabalho dos specialists do software com os peritos do domínio; entretanto, essa aproximação tem geralmente algumas dificuldades iniciais devido a uma barreira fundamental de uma comunicação. Os desenvolvedores têm em suas mentes uma visão das classes, métodos, algoritmos, testes padrões, e eles tendem sempre a fazer uma mistura entre conceito da vida e os conceitos de programação. Querem ver um montante de classes para criar uma relação do modelo e eles. Eles pensam nos termos herança, polimorfismo, OOP, etc. Eles conversam como todo um time faria. E é normal para eles fazer assim. Desenvolvedores serão desenvolvedores. Mas os peritos do domínio não sabem geralmente nada sobre desenvolvimento. Não têm nenhuma idéia sobre bibliotecas de software, frameworks, persistence, em muitos casos nem sequer que bases de dados existe. Eles sabem sobre sua área de perícia específica.
No exemplo de monitoração de tráfego aéreo, os peritos do domínio sabem sobre planos, sobre rotas, alturas, longitudes e latitudes, eles sabem sobre o exercício de itinerário normal, sobre a trajetoria dos aviões. E fala-se na sua própria gíria, que por vezes não é tão fácil de seguir por um outro lado.
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?
Um projeto enfrenta problemas sérios quando os membros da equipe não compartilham de uma língua comum para discutir o domínio. Os peritos do domínio usam seu jargão quando os membros técnicos da equipe tiverem sua própria língua ajustada discutindo o domínio nos termos do design.
A terminologia utilizada no dia-a-dia das discussões é desconectada da terminologia encaixada no código (afinal de contas o produto mais importante é o software do projeto). E mesmo assim a mesma pessoa usa uma língua diferente no discurso e outra na escrita, de modo que a formar incisivas expressões do domínio muitas vezes transientes saindo de uma forma que nunca é capturado em código, ou mesmo por escrito.
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
MODEL-DRIVEN DESIGN (DDD)Os capítulos anteriores salientou a importância de uma aproximação ao desenvolvimento do software que é centrado no domínio do negócio. Dissemos que é fundamental a importancia de criar um modelo que esta profundamente enraizado no domínio, e refletir os conceitos essenciais do domínio com grande precisão. A língua comum deve ser plenamente exercida durante todo o processo, a fim de facilitar a comunicação entre os specialists do software e os peritos do domínio, e descobrir os conceitos chaves do domínio que devem ser usados no modelo. A finalidade deste processo é criar um modelo bom. A etapa seguinte é implementar o modelo no código. Isto processo é igualmente importante para o desenvolvimento do software. Ter criado um grande modelo, mas não transferi-lo corretamente no código acabará criando software da qualidade questionável.
Acontece que os analistas do software trabalham com os peritos do domínio do negócio durante meses, descobrem os elementos fundamentais do domínio, enfatizam os relacionamentos entre eles, e cría um modelo correto, que capta com precisão o domínio. Então, o modelo é transferido para os desenvolvedores de softwares. Os desenvolvedores puderam olhar o modelo e descobrir que alguns dos conceitos ou dos relacionamentos encontrados neles não podem corretamente ser expressados no código.
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 desenvolvedores serão obrigados a tomar as decisões próprias, e fará mudanças no design a fim resolver um problema real que não foi considerado quando o modelo foi criado. Eles criam um design afastado do modelo, o que torna menos relevante.
Se os analistas trabalharem independentemente, criarão eventualmente um modelo. Quando este modelo é passado aos designers, alguns conhecimento dos analistas sobre o domínio e o modelo é perdido. Enquando o modelo pôde ser expressado nos diagramas e na escrita, As mudanças dos designers que definirão o sentido inteiro do modelo, ou os relacionamentos entre alguns objetos, ou seu comportamento. Existem detalhes em um modelo que não são expressados fàcilmente em um diagrama, e não pode inteiramente ser apresentado sequer por escrito. Os desenvolvedores passão por momentos complicados para esboçar isso. Em alguns casos farão algumas suposições sobre o comportamento pretendido, e é possível tais suposições estejam erradas, resultando em um funcionamento incorreto do programa.
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.
Uma melhor abordagem é estreitar a relação modelagem do domínio e design. O modelo deve ser construído com um olho aberto às considerações do desidn do software. Os desenvolvedores devem ser incluídos no processo de modelagem. A idéia principal é escolher um modelo que possa apropriadamente ser expressado no software, de modo que o processo do design seja direto e baseado no modelo. Firmemente relacionar o código de um modelo subjacente dá o signigicado do código e torna o modelo relevante.
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.
Projetar uma parcela do design do sistema de software e refletir o modelo do domínio é uma maneira, de modo que a transição seja óbvia. Revisitar o modelo e modificá-lo a ser executado mais naturalmente no software, mesmo enquanto você procura refletir uma introspecção mais profunda no domínio. Procurar um único modelo que sirva as ambas finalidades, além de suportar uma língua ambigua comumente usada entre os participantes.
Extrair do modelo a terminologia utilizada no design e a atribuição de responsabilidades. O código se torne uma expressão do modelo, de modo que a modificação do código pode ser uma mudança do modelo. O seu efeito deve flutuações através do resto do projecto.
Amarrar firmemente a execução a um modelo requer geralmente as ferramentas e as languages de desenvolvimento de software que suportam um paradigm modelando, tal como programação orientada a objeto.
A programação orientada a objeto é apropriada para o modelo de execução porque ambos são baseados no mesmo paradigm. A programação orientada a objetos fornece classes dos objetos e associações das classes, dos exemplos do objeto, e da relação entre eles. As línguas de OOP fazem a possíveis criar mapeamentos diretos entre os objetos modelo com seus relacionamentos, e suas contrapartes de programação.
The Building Blocks Of A Model-Driven DesignAs seguintes seções deste capítulo apresentarão o mais importante dos pattern a ser usado no DDD. A finalidade destes testes patterns é apresentar alguns dos elementos chaves de modelagem de objetos e design software do ponto de vista do DDD. O seguinte diagrama é um mapa dos patterns apresentados e dos relacionamentos entre eles.

Quando nós criamos uma aplicação do software, uma parte grande da aplicação não está relacionada diretamente ao domínio, mas é parte da infraestrutura ou serve ao próprio software. Isto é possível e aprovado para uma parte do domínio de uma aplicação para ser completamente pequeno comparado ao restante, desde que a típica aplicação contenha as dezenas de código relacionados ao acesso ao base de dados, ao arquivo ou acesso da rede, interfaces com o usuario e etc.
Em um programa orientado a objeto, UI, base de dados, e outros código da sustentação, são desenvolvidos frequentemente direto nos objetos do negócio. A lógica adicional do negócio é encaixada no comportamento de interfaces e de acesso a base de dados. Isto as vezes acontecem porque é a maneira mais fácil de fazer o sistema rapidamente.
Entretanto, quando ao código do domínio relacionado é misturado com as outras camadas, dessa forma torna-se extremamente difícil de ver e pensar no codigo orientado a objetos. As mudanças Superficial na interface podem realmente mudar a lógica do negócio. Mudar uma regra de negócio pode alterar a interface, ou o código da base de dados, ou outros elementos do programa. Implementar incoerencia no codigo, torna o uso do DDD impraticavel. O programa deve ser mantido muito simples ou torna-se impossível compreender com todas as tecnologias e lógica envolvidas na interface do usuario junto com as logicas do dominio.
É necessário um complexo particionamento do programa em camadas. Desenvolver uma concepção dentro de cada camada que é coerente e que depende apenas das camadas inferiores. seguir padrões arquitectónico padrão para fornecer um engate avulso para as camadas acima. Concentrar todo o código relacionado ao modelo do domínio em uma camada e isolá-lo da relação de usuário, da aplicação, e do código da infraestrutura. Objetos de domínio, sem resposabilidade de se mostrar, armazenando neles mesmos, administrando tarefas de aplicativos e assim por diante, podem estar focados em expressar o modelo do domínio. Isso permite o modelo envolvido ser rico e claro o bastante para capturar a essencia do conhecimento do negócio e colocoar isso para trabalhar
A solução para uma arquitetura comum para DDD contem quatro camadas essenciais
User Interface (Presentation Layer):Responsável por apresentar a informação ao usuário e interpretar os comandos do usuário
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 LayerEsta 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 LayerEsta 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.
É importante dividir uma aplicação em camadas separadas, e estabelecer regras de interações entre elas. Se o código não for separado claramente em camadas, ficará muito dificil fazer ou controlar as mudanças. Uma simples mudança em uma seção do código pode gerar resultados inesperado e indesejáveis em outras seções. A camada do domínio deve ser focalizada no nucleo das tarefas do domínio. Não deve ser envolvida em atividades da infraestrutura. A interface com o usuario nao deve ser firmemente conectado à lógica do negócio, nem às tarefas que pertencer normalmente à camada de infraestrutura. Uma camada de aplicação é necessário em muitos casos. Tem que haver um gerente sobre a lógica do negócio que supervisiona e coordena a atividade total da aplicação.
Um exemplo típico de interação da aplicação, domínio e infraestrutura podiam funcionar dessa forma: O usuário deseja um livro de rotas de vôos, e pergunta ao serviço da aplicação na camada de aplicação como fazer isso. Um parte da aplicação busca os objetos relevantes do domínio da infraestrutura e invoca métodos relevantes para fazer isso, por exemplo: para verificar margens da segurança a outros vôos já registrados. Uma vez que os objetos do domínio fizeram todas as verificações e atualizaram seu status para “decidido”, o serviço da aplicação persiste os objetos para a infraestrutura.