SlideShare uma empresa Scribd logo
1 de 74
http://netponto.org 16ª Reunião Presencial - 11/12/2010 DomainDriven DesignJoão Nicolau Oliveira
Patrocinadores desta reunião
João Oliveira ,[object Object]
 12 anos de experiência em TI
 Adepto das metodologias ágeis
 Release Manager na Solutions FactoryC# ASP.Net WPF WCF DNN jQuery Delphi Java Zope
Citação... «Domain modeling is not a matter of making as “realistic” a model as possible. It is more like moviemaking, loosely representing reality to a particular purpose.» EricEvans
Agenda O que é? Quando usar? Como? UbiquousLanguage, BoundedContexts, Integração Contínua, ContextMap, PersistenceIgnorance Command and Query Responsability Segregation Patterns: ValueObject, Entity, Aggregate, Factory, Repository, UnitOfWork, Specification
Também disponível em vídeo... Assista! http://www.vimeo.com/21488644
O que é DDD? Focalização no domínio Um domínio é um âmbito.  É definido por um conjunto de características que descrevem uma família de problemas para os quais procuramos uma solução. A análise do domínio identifica, captura e organiza informação para que seja reutilizável aquando da criação de novos sistemas.
O que é o modelo do domínio?
O que é o modelo do domínio? É umarepresentação
O que é DDD? Focalizar no modelo Elaborar uma representação abstracta do domínio que nos ajude a cumprir o propósito Linguagem omnipresente Os peritos do domínio e os programadores partilham uma linguagem comum É Object-Oriented e combina bem com outras metodologias ágeis TDD, BDD, … Reduz complexidade/facilita manutenção.
Quando usar? Projectos em que os desenhadores do modelo estão dispostos a “pôr as mãos na massa” Colaboração efectiva entre peritos do domínio e os developers Abertura para explorar e experimentar (os primeiros modelos não são satisfatórios) Contexto explicito e bem definido Apenas adequando para o núcleo do domínio
Modelar - Como? Processo de melhoria, ajuste, adaptação, aprendizagem, experimentação Modelos Emergentes Linguagem Omnipresente
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores “Alhos”
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores Tradução complexa “Alhos”
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores Tradução complexa “Bugalhos?” “Alhos”
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores “Alhos”
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores MODELO “Alhos”
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores MODELO “Alhos”
Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua  Peritos de Domínio Programadores MODELO “Alhos”
Linguagem Omnipresente O nosso Modelo sustenta a nossa linguagem Experts de Domínio Programadores Negócio MODELO Código
Uma mesma linguagem para tudo O código também deve reflectir a linguagem. Exemplo: Nomes => Classes Verbos => métodos, serviços, … Uma entidade empregadora coloca um anúncio de emprego: Classes: Job, JobBoard Acções: JobBoard.PostJob(Job)
Bounded Context Em projectos grandes temos vários modelos em jogo É importante circunscrever o contexto ao qual o modelo se aplica Explicitar fronteiras relativamente às diferentes equipas envolvidas, espaços físicos e repositórios de código e de dados Preocupar-se apenas em garantir consistência dentro dessas fronteiras
Continuous Integration Quanto maior é a equipa, maior é a tendência para fragmentar o modelo: Instituir um processo de integração contínua que faça merging do código e dos artefactos Testes automatizados que detectem os erros ASAP
Context Map Os contextos de outros modelos podem ser vagos e estar em permanente mudança Identificar todos os modelos em jogo (inclusivé subsistemas  não object-oriented) Dar nomes a esses contextos e fazer com que esses nomes se tornem parte da nossa linguagem ubíqua Identificar os pontos de contacto e desenhar tradutores.
Persistence Ignorance
Ignorar a Persistência Porquê? Não queremos um modelo data-driven Queremos liberdade na escolha do mecanismo de persistência dos nossos dados Facilitar os nossos testes unitários e a abordagem TDD Como? Adoptar frameworks de acesso a dados “DDD-friendly” Rejeitar ORMs estilo Active Objects Usar ORMs pouco intrusivos (Ex: NHibernate, EF4) Tirar partido dos Repositórios e Agregados
Arquitectura DDD UI Application / Services Domain Data Access Infrastructure
Arquitectura DDD Infrastructure Funcionalidades genéricas que suportam as camadas superiores Componentes de UI Utilitários Domain Lógica e regras  Estado do negócio É o núcleo/coração da aplicação
Arquitectura DDD Application Orquestrador, Serviços, Tarefas de negócio Interacção com outros sistemas Esta camada deve ser fina Não deve ter regras nem conhecimentos do negócio Não guarda o estado do negócio Pode guardar estado do progresso de uma tarefa User Interface Mostrar informação ao utilizador Interpretar comandos
Single ResponsabilityPrinciple Uma classe deve ter apenas uma razão para sofrer mudanças. Se tivermos 2 razões para mudar então deveremos separar em duas classes distintas. Imprimir Gerar PDF Martin, Robert C. (2002). Agile Software Development, Principles, Patterns, andPractices
Command and Query Responsibility Segregation Performance Simplicidade Auditoria BI Agilidade Commands Queries Diagrama de Mark Nijhof
CQRS – Divisão de tarefas e rentabilidade Equipa de baixo  custo produz código  sem exigências de qualidade. Ideal para outsourcing. Equipa pequena altamentequalificada Diagrama de Mark Nijhof Equipa especializada em UI
Command and Query Responsibility Segregation UI: Orientados à tarefa Comandos:  Mudam o estado do domínio Event Store:  Armazena literalmente os eventos Query Store: Uma tabela por View (UI) Exposta via SOA web services, WCF, WCF RIA
Osblocos de código Patterns
Entidades São objectos definidos pela sua identidade (identificadores únicos) A sua forma ou conteúdo podem mudar, mas a identidade tem de ser preservada ao longo do ciclo de vida Entidade
Entidades São ainda definidos por: Responsabilidades Estrutura Comportamentos  A persistência nunca é responsabilidade da entidade (não usar entidades com métodos CRUD)
Exemplo:
ValueObjects Imutáveis Uma mesma instância pode ser usada em várias entidades Se queremos um valor diferente então criamos uma nova instância Exemplos: Moradas, Dinheiro, Códigos e até identificadores de entidades
Exemplo:
Agregados Fronteira Raíz do Agregado
Agregados É um agrupamento de objectos associados com os quais lidamos como se se tratassem de uma só unidade. Dão consistência ao modelo Definem relações de pertença Definem fronteiras Salvaguardam as invariantes (regras)
Agregados Qualquer mudança de estado tem de garantir sempre as invariantes do agregado. Fronteira Separa o interior do exterior Raiz É sempre uma Entidade Responsável por garantir as invariantes Pode ser livremente referenciada do exterior
Agregados Os membros Podem ser Entidades e ValueObjects Estas entidades apenas precisam de identidade “local” Os objectos exteriores não devem ver estes membros fora do contexto da entidade raiz
NestedAggregates Quando o membro do agregado referencia a raiz de outro agregado Evitar encadeamentos com demasiada profundidade Exemplo de encadeamento: Agregado Job Board (membros: Job) Agregado Job (membros: Skill, Applicant) Agregado Applicant (membros: ApplicantSkill)
Exemplo: Agregado Cargo
Factory Criar (e reconstruir) os objectos e agregados mais complexos Encapsular a estrutura interna Para objectos simples usar somente o construtor é suficiente Deve ser uma operação atómica Garantir todas as invariantes
Factory Diferentes tipos: StandaloneFactory FactoryMethod Util em aggregates Situações em que temos um objecto com grande relação de proximidade sobre o outro AbstractFactory Builder (para fluent interfaces)
Factory E as invariantes onde pertencem? Pode-se delegar a validação ao próprio produto Em agregados pode ser melhor ter as regras também na própria factory (porque tipicamente estão dispersas por vários objectos) Regras do membro Identificador de uma entidade ou dum ValueObjecttêm existir na Factory
Exemplo: Utilizamos internalno método construtor de Car para obrigar o projecto cliente a utilizar sempre a Factory  na instanciação da classe Car.
Repositório e UnitOfWork Repositório Abstrai o acesso aos dados Funciona como uma colecção de objectos em memória: Add, Remove, Get, Count UnitOfWork Registar as alterações ao estado dos objectos Gerir as transacções: Commit, Rollback ISession (NHibernate), DataContext (LinqToSQL)
Citação... «Leave transaction control to the client. (…) Transaction management will be simpler if the REPOSITORY keeps its hands off.» Eric Evans
Repositório Um por cada Agregado O agregado é sempre devolvido válido e completo Abstrair a implementação Facilitar os testes unitários Maior liberdade para mudar a implementação Facilitar optimizações de performance Implementar mecanismos de caching
Exemplo: Implementação NHibernate
Exemplo: Implementação NHibernate
Exemplo: Implementação NHibernate
RepositoryPerAggregate GetById(int id) GetByName(string name) GetByCityAndState(City city, State state) Add(Person person) Count(), Sum() Uma classeRepositórioporcadaAgregado Dá-nosmaistrabalho do que o repositóriogenéricomaspermite-nosafinarmelhor as queries
GenericRepository Uma classe genérica para todos os Agregados GetById<TId>(TIdid) Query<T>(Expression<Func<T, bool>> query) Insert<T>(T entity) Delete<T>(T entity) Ex: newRepository<Person, int>(…) GetById (20) Query (p => p.Idade > 20) Tipo Entidade Tipo Identificador
IQueryable com Paginação
IQueryable com Paginação
IQueryable com Paginação
IQueryable com Paginação
Specification Pode ser usada para: Validar um objecto e verificar se cumpre certos requisitos ou se está preparado para um dado propósito Seleccionar um objecto de uma colecção Especificar as características de um objecto que vai ser instanciado Podemos passar ao repositório com a especificação dos critérios de pesquisa traduzidos para a linguagem de acesso aos dados (SQL/Linq/NHibernate).
Exemplo:
Resumo Entidade (Tem identidade) ValueObject (Imutável) Aggregate (Garante consistência) Factory (Facilita início do ciclo de vida) Repository(Faz gestão da persistência) Specification(Definir requisitos/características)
Dúvidas?
Referências Domain-Driven Design: Tackling Complexity in the Heart of Software Eric Evans Applying Domain-Driven Design and Patterns  Jimmy Nilsson
Referências DomainDriven Design Community http://domaindrivendesign.org/ Apresentação Domaindriven Design - CatapultSystems http://www.slideshare.net/panesofglass/domain-driven-design UnitOfWork - MartinFowler http://martinfowler.com/eaaCatalog/unitOfWork.html Repositories and IQueryable, the paging case http://thinkbeforecoding.com/post/2009/01/19/Repositories-and-IQueryable-the-paging-case CQRS: Recording of an online class – Greg Young http://cqrsinfo.com/video/

Mais conteúdo relacionado

Mais procurados

Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHGiovanni Bassi
 
Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVAMoises Omena
 
Programando com prazer com DDD
Programando com prazer com DDDProgramando com prazer com DDD
Programando com prazer com DDDGiovanni Bassi
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoMarcius Brandão
 
Introdução a Linguagem Java
Introdução a Linguagem JavaIntrodução a Linguagem Java
Introdução a Linguagem JavaUFPA
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projetoejdn1
 
Domain Driven Design – DDD além da teoria!, por Paulo Victor Gomes
Domain Driven Design – DDD além da teoria!, por Paulo Victor GomesDomain Driven Design – DDD além da teoria!, por Paulo Victor Gomes
Domain Driven Design – DDD além da teoria!, por Paulo Victor GomesiMasters
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaÁlvaro Farias Pinheiro
 
Modelagem de sistemas
Modelagem de sistemasModelagem de sistemas
Modelagem de sistemassauloroos01
 
Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos JavaMarcio Marinho
 
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVAProgramação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVACristiano Almeida
 
Padrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyPadrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyEduardo Nicola F. Zagari
 
Java 01 Java Visao Geral Resumo
Java 01 Java Visao Geral ResumoJava 01 Java Visao Geral Resumo
Java 01 Java Visao Geral ResumoRegis Magalhães
 
Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Luis Ferreira
 

Mais procurados (20)

Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
DDD > Experiências
DDD > ExperiênciasDDD > Experiências
DDD > Experiências
 
Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVA
 
Programando com prazer com DDD
Programando com prazer com DDDProgramando com prazer com DDD
Programando com prazer com DDD
 
Framework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da DissertacaoFramework Entities - Apresentação da Defesa da Dissertacao
Framework Entities - Apresentação da Defesa da Dissertacao
 
Introdução a Linguagem Java
Introdução a Linguagem JavaIntrodução a Linguagem Java
Introdução a Linguagem Java
 
Padroes De Projeto
Padroes De ProjetoPadroes De Projeto
Padroes De Projeto
 
Domain Driven Design – DDD além da teoria!, por Paulo Victor Gomes
Domain Driven Design – DDD além da teoria!, por Paulo Victor GomesDomain Driven Design – DDD além da teoria!, por Paulo Victor Gomes
Domain Driven Design – DDD além da teoria!, por Paulo Victor Gomes
 
Programação Orientada a Objetos com Java
Programação Orientada a Objetos com JavaProgramação Orientada a Objetos com Java
Programação Orientada a Objetos com Java
 
Modelagem de sistemas
Modelagem de sistemasModelagem de sistemas
Modelagem de sistemas
 
Introdução ao Java
Introdução ao JavaIntrodução ao Java
Introdução ao Java
 
Análise de sistemas oo 1
Análise de sistemas oo   1Análise de sistemas oo   1
Análise de sistemas oo 1
 
Conhecendo Java
Conhecendo JavaConhecendo Java
Conhecendo Java
 
Apostila de Fundamentos Java
Apostila de Fundamentos JavaApostila de Fundamentos Java
Apostila de Fundamentos Java
 
Educação e certificação na Plataforma .NET
Educação e certificação na Plataforma .NETEducação e certificação na Plataforma .NET
Educação e certificação na Plataforma .NET
 
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVAProgramação Orientada a Objetos - Conceitos básicos da linguagem JAVA
Programação Orientada a Objetos - Conceitos básicos da linguagem JAVA
 
Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001Programação Orientada a Objetos - 001
Programação Orientada a Objetos - 001
 
Padrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - ProxyPadrões-13 - Padrões Estruturais - Proxy
Padrões-13 - Padrões Estruturais - Proxy
 
Java 01 Java Visao Geral Resumo
Java 01 Java Visao Geral ResumoJava 01 Java Visao Geral Resumo
Java 01 Java Visao Geral Resumo
 
Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos Módulo 9 - Introdução à Programação Orientada a Objectos
Módulo 9 - Introdução à Programação Orientada a Objectos
 

Semelhante a DDD: Domain Driven Design

DDD e PHP - TDC 2012
DDD e PHP - TDC 2012DDD e PHP - TDC 2012
DDD e PHP - TDC 2012Luís Cobucci
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven DesignAndré Borgonovo
 
Inovando na plataforma Java
Inovando na plataforma JavaInovando na plataforma Java
Inovando na plataforma JavaEteg
 
Domain-Driven Design - Uma Abordagem Introdutória
Domain-Driven Design - Uma Abordagem IntrodutóriaDomain-Driven Design - Uma Abordagem Introdutória
Domain-Driven Design - Uma Abordagem Introdutóriaarmeniocardoso
 
Automação de testes para equipes agile
Automação de testes para equipes agileAutomação de testes para equipes agile
Automação de testes para equipes agileAlini Rebonatto
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorDickson S. Guedes
 
Estratégias de Estruturação de Código-fonte e Controlo de Versão
Estratégias de Estruturação de Código-fonte e Controlo de VersãoEstratégias de Estruturação de Código-fonte e Controlo de Versão
Estratégias de Estruturação de Código-fonte e Controlo de VersãoComunidade NetPonto
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioRalph Rassweiler
 
Evolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicEvolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicRicardo Guerra Freitas
 
Integração de Tecnologias
Integração de TecnologiasIntegração de Tecnologias
Integração de Tecnologiaselliando dias
 
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutosTDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutosRafael Chaves
 
TDC Floripa 2015 Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
TDC Floripa 2015  Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...TDC Floripa 2015  Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
TDC Floripa 2015 Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...Rafael Chaves
 
Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVAMoises Omena
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfAndreCosta502039
 
Padrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsPadrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsHerval Freire
 
Java No Setor Público: Produtividade, Flexibilidade e Baixo Custo
Java No Setor Público: Produtividade, Flexibilidade e Baixo CustoJava No Setor Público: Produtividade, Flexibilidade e Baixo Custo
Java No Setor Público: Produtividade, Flexibilidade e Baixo CustoÉberli Cabistani Riella
 

Semelhante a DDD: Domain Driven Design (20)

Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
DDD e PHP - TDC 2012
DDD e PHP - TDC 2012DDD e PHP - TDC 2012
DDD e PHP - TDC 2012
 
Introdução ao Domain-Driven Design
Introdução ao Domain-Driven DesignIntrodução ao Domain-Driven Design
Introdução ao Domain-Driven Design
 
Inovando na plataforma Java
Inovando na plataforma JavaInovando na plataforma Java
Inovando na plataforma Java
 
Inovando na Plataforma Java
Inovando na Plataforma JavaInovando na Plataforma Java
Inovando na Plataforma Java
 
Domain-Driven Design - Uma Abordagem Introdutória
Domain-Driven Design - Uma Abordagem IntrodutóriaDomain-Driven Design - Uma Abordagem Introdutória
Domain-Driven Design - Uma Abordagem Introdutória
 
Automação de testes para equipes agile
Automação de testes para equipes agileAutomação de testes para equipes agile
Automação de testes para equipes agile
 
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhorPorque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
Porque aprender várias linguagens me tornou um DBA (e desenvolvedor) melhor
 
Estratégias de Estruturação de Código-fonte e Controlo de Versão
Estratégias de Estruturação de Código-fonte e Controlo de VersãoEstratégias de Estruturação de Código-fonte e Controlo de Versão
Estratégias de Estruturação de Código-fonte e Controlo de Versão
 
Arquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócioArquitetura web para sistemas de negócio
Arquitetura web para sistemas de negócio
 
Evolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual BasicEvolução do .NET Framework e do Visual Basic
Evolução do .NET Framework e do Visual Basic
 
Integração de Tecnologias
Integração de TecnologiasIntegração de Tecnologias
Integração de Tecnologias
 
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutosTDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
TDC SP 2016 - Construindo um microserviço Java 100% funcional em 30 minutos
 
TDC Floripa 2015 Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
TDC Floripa 2015  Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...TDC Floripa 2015  Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
TDC Floripa 2015 Desenvolvendo Sistemas de Gestão a partir de Modelos Execut...
 
Aula de Introdução - JAVA
Aula de Introdução  - JAVAAula de Introdução  - JAVA
Aula de Introdução - JAVA
 
Treinamento DDD .Net
Treinamento DDD .NetTreinamento DDD .Net
Treinamento DDD .Net
 
Uml
UmlUml
Uml
 
POO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdfPOO2-Pre-32-PadroesProjetos_.pdf
POO2-Pre-32-PadroesProjetos_.pdf
 
Padrões De Projeto e Anti Patterns
Padrões De Projeto e Anti PatternsPadrões De Projeto e Anti Patterns
Padrões De Projeto e Anti Patterns
 
Java No Setor Público: Produtividade, Flexibilidade e Baixo Custo
Java No Setor Público: Produtividade, Flexibilidade e Baixo CustoJava No Setor Público: Produtividade, Flexibilidade e Baixo Custo
Java No Setor Público: Produtividade, Flexibilidade e Baixo Custo
 

Mais de Comunidade NetPonto

Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Comunidade NetPonto
 
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Comunidade NetPonto
 
MVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaMVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaComunidade NetPonto
 
Deep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaDeep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaComunidade NetPonto
 
The power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloThe power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloComunidade NetPonto
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoComunidade NetPonto
 
NoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazNoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazComunidade NetPonto
 
De Zero a Produção - João Jesus
De Zero a Produção - João JesusDe Zero a Produção - João Jesus
De Zero a Produção - João JesusComunidade NetPonto
 
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComo deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComunidade NetPonto
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsComunidade NetPonto
 
Aspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpAspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpComunidade NetPonto
 
Utilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosUtilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosComunidade NetPonto
 
Dinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoDinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoComunidade NetPonto
 
KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realComunidade NetPonto
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComunidade NetPonto
 
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteWindows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteComunidade NetPonto
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIComunidade NetPonto
 

Mais de Comunidade NetPonto (20)

Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
Continuous Delivery for Desktop Applications: a case study - Miguel Alho & Jo...
 
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
Criando aplicações para windows phone 8.1 e windows 8.1 com o app studio da...
 
MVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara SilvaMVVM Light e Cimbalino Toolkits - Sara Silva
MVVM Light e Cimbalino Toolkits - Sara Silva
 
Deep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo CostaDeep dive into Windows Azure Mobile Services - Ricardo Costa
Deep dive into Windows Azure Mobile Services - Ricardo Costa
 
The power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno CanceloThe power of templating.... with NVelocity - Nuno Cancelo
The power of templating.... with NVelocity - Nuno Cancelo
 
ASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis PaulinoASP.Net Performance – A pragmatic approach - Luis Paulino
ASP.Net Performance – A pragmatic approach - Luis Paulino
 
ASP.NET Signal R - Glauco Godoi
ASP.NET Signal R - Glauco GodoiASP.NET Signal R - Glauco Godoi
ASP.NET Signal R - Glauco Godoi
 
NoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor TomazNoSQL em Windows Azure Table Storage - Vitor Tomaz
NoSQL em Windows Azure Table Storage - Vitor Tomaz
 
HTML5 - Pedro Rosa
HTML5 - Pedro RosaHTML5 - Pedro Rosa
HTML5 - Pedro Rosa
 
De Zero a Produção - João Jesus
De Zero a Produção - João JesusDe Zero a Produção - João Jesus
De Zero a Produção - João Jesus
 
OData – Super Cola W3
OData – Super Cola W3OData – Super Cola W3
OData – Super Cola W3
 
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone AppsComo deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
Como deixar de fazer "copy and paste" entre Windows Store e Windows Phone Apps
 
Case studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store AppsCase studies about Layout & View States & Scale in Windows 8 Store Apps
Case studies about Layout & View States & Scale in Windows 8 Store Apps
 
Aspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharpAspect-oriented Programming (AOP) com PostSharp
Aspect-oriented Programming (AOP) com PostSharp
 
Utilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes UnitáriosUtilização de Mock Objects em Testes Unitários
Utilização de Mock Objects em Testes Unitários
 
Dinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de ProjectoDinâmica e Motivacao de Equipas de Projecto
Dinâmica e Motivacao de Equipas de Projecto
 
KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida real
 
Como ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noiteComo ser programador durante o dia e mesmo assim dormir bem à noite
Como ser programador durante o dia e mesmo assim dormir bem à noite
 
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto ProieteWindows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
Windows 8: Desenvolvimento de Metro Style Apps - C. Augusto Proiete
 
Uma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web APIUma Introdução a ASP.NET Web API
Uma Introdução a ASP.NET Web API
 

DDD: Domain Driven Design

  • 1. http://netponto.org 16ª Reunião Presencial - 11/12/2010 DomainDriven DesignJoão Nicolau Oliveira
  • 3.
  • 4. 12 anos de experiência em TI
  • 5. Adepto das metodologias ágeis
  • 6. Release Manager na Solutions FactoryC# ASP.Net WPF WCF DNN jQuery Delphi Java Zope
  • 7. Citação... «Domain modeling is not a matter of making as “realistic” a model as possible. It is more like moviemaking, loosely representing reality to a particular purpose.» EricEvans
  • 8. Agenda O que é? Quando usar? Como? UbiquousLanguage, BoundedContexts, Integração Contínua, ContextMap, PersistenceIgnorance Command and Query Responsability Segregation Patterns: ValueObject, Entity, Aggregate, Factory, Repository, UnitOfWork, Specification
  • 9. Também disponível em vídeo... Assista! http://www.vimeo.com/21488644
  • 10. O que é DDD? Focalização no domínio Um domínio é um âmbito. É definido por um conjunto de características que descrevem uma família de problemas para os quais procuramos uma solução. A análise do domínio identifica, captura e organiza informação para que seja reutilizável aquando da criação de novos sistemas.
  • 11. O que é o modelo do domínio?
  • 12. O que é o modelo do domínio? É umarepresentação
  • 13. O que é DDD? Focalizar no modelo Elaborar uma representação abstracta do domínio que nos ajude a cumprir o propósito Linguagem omnipresente Os peritos do domínio e os programadores partilham uma linguagem comum É Object-Oriented e combina bem com outras metodologias ágeis TDD, BDD, … Reduz complexidade/facilita manutenção.
  • 14. Quando usar? Projectos em que os desenhadores do modelo estão dispostos a “pôr as mãos na massa” Colaboração efectiva entre peritos do domínio e os developers Abertura para explorar e experimentar (os primeiros modelos não são satisfatórios) Contexto explicito e bem definido Apenas adequando para o núcleo do domínio
  • 15. Modelar - Como? Processo de melhoria, ajuste, adaptação, aprendizagem, experimentação Modelos Emergentes Linguagem Omnipresente
  • 16. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio
  • 17. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores
  • 18. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores
  • 19. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores
  • 20. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores “Alhos”
  • 21. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores Tradução complexa “Alhos”
  • 22. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores Tradução complexa “Bugalhos?” “Alhos”
  • 23. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores “Alhos”
  • 24. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores MODELO “Alhos”
  • 25. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores MODELO “Alhos”
  • 26. Linguagem Omnipresente Só nos entendemos se falarmos a mesma língua Peritos de Domínio Programadores MODELO “Alhos”
  • 27. Linguagem Omnipresente O nosso Modelo sustenta a nossa linguagem Experts de Domínio Programadores Negócio MODELO Código
  • 28. Uma mesma linguagem para tudo O código também deve reflectir a linguagem. Exemplo: Nomes => Classes Verbos => métodos, serviços, … Uma entidade empregadora coloca um anúncio de emprego: Classes: Job, JobBoard Acções: JobBoard.PostJob(Job)
  • 29. Bounded Context Em projectos grandes temos vários modelos em jogo É importante circunscrever o contexto ao qual o modelo se aplica Explicitar fronteiras relativamente às diferentes equipas envolvidas, espaços físicos e repositórios de código e de dados Preocupar-se apenas em garantir consistência dentro dessas fronteiras
  • 30. Continuous Integration Quanto maior é a equipa, maior é a tendência para fragmentar o modelo: Instituir um processo de integração contínua que faça merging do código e dos artefactos Testes automatizados que detectem os erros ASAP
  • 31. Context Map Os contextos de outros modelos podem ser vagos e estar em permanente mudança Identificar todos os modelos em jogo (inclusivé subsistemas não object-oriented) Dar nomes a esses contextos e fazer com que esses nomes se tornem parte da nossa linguagem ubíqua Identificar os pontos de contacto e desenhar tradutores.
  • 33. Ignorar a Persistência Porquê? Não queremos um modelo data-driven Queremos liberdade na escolha do mecanismo de persistência dos nossos dados Facilitar os nossos testes unitários e a abordagem TDD Como? Adoptar frameworks de acesso a dados “DDD-friendly” Rejeitar ORMs estilo Active Objects Usar ORMs pouco intrusivos (Ex: NHibernate, EF4) Tirar partido dos Repositórios e Agregados
  • 34. Arquitectura DDD UI Application / Services Domain Data Access Infrastructure
  • 35. Arquitectura DDD Infrastructure Funcionalidades genéricas que suportam as camadas superiores Componentes de UI Utilitários Domain Lógica e regras Estado do negócio É o núcleo/coração da aplicação
  • 36. Arquitectura DDD Application Orquestrador, Serviços, Tarefas de negócio Interacção com outros sistemas Esta camada deve ser fina Não deve ter regras nem conhecimentos do negócio Não guarda o estado do negócio Pode guardar estado do progresso de uma tarefa User Interface Mostrar informação ao utilizador Interpretar comandos
  • 37. Single ResponsabilityPrinciple Uma classe deve ter apenas uma razão para sofrer mudanças. Se tivermos 2 razões para mudar então deveremos separar em duas classes distintas. Imprimir Gerar PDF Martin, Robert C. (2002). Agile Software Development, Principles, Patterns, andPractices
  • 38. Command and Query Responsibility Segregation Performance Simplicidade Auditoria BI Agilidade Commands Queries Diagrama de Mark Nijhof
  • 39. CQRS – Divisão de tarefas e rentabilidade Equipa de baixo custo produz código sem exigências de qualidade. Ideal para outsourcing. Equipa pequena altamentequalificada Diagrama de Mark Nijhof Equipa especializada em UI
  • 40. Command and Query Responsibility Segregation UI: Orientados à tarefa Comandos: Mudam o estado do domínio Event Store: Armazena literalmente os eventos Query Store: Uma tabela por View (UI) Exposta via SOA web services, WCF, WCF RIA
  • 42. Entidades São objectos definidos pela sua identidade (identificadores únicos) A sua forma ou conteúdo podem mudar, mas a identidade tem de ser preservada ao longo do ciclo de vida Entidade
  • 43. Entidades São ainda definidos por: Responsabilidades Estrutura Comportamentos A persistência nunca é responsabilidade da entidade (não usar entidades com métodos CRUD)
  • 45. ValueObjects Imutáveis Uma mesma instância pode ser usada em várias entidades Se queremos um valor diferente então criamos uma nova instância Exemplos: Moradas, Dinheiro, Códigos e até identificadores de entidades
  • 48. Agregados É um agrupamento de objectos associados com os quais lidamos como se se tratassem de uma só unidade. Dão consistência ao modelo Definem relações de pertença Definem fronteiras Salvaguardam as invariantes (regras)
  • 49. Agregados Qualquer mudança de estado tem de garantir sempre as invariantes do agregado. Fronteira Separa o interior do exterior Raiz É sempre uma Entidade Responsável por garantir as invariantes Pode ser livremente referenciada do exterior
  • 50. Agregados Os membros Podem ser Entidades e ValueObjects Estas entidades apenas precisam de identidade “local” Os objectos exteriores não devem ver estes membros fora do contexto da entidade raiz
  • 51. NestedAggregates Quando o membro do agregado referencia a raiz de outro agregado Evitar encadeamentos com demasiada profundidade Exemplo de encadeamento: Agregado Job Board (membros: Job) Agregado Job (membros: Skill, Applicant) Agregado Applicant (membros: ApplicantSkill)
  • 53. Factory Criar (e reconstruir) os objectos e agregados mais complexos Encapsular a estrutura interna Para objectos simples usar somente o construtor é suficiente Deve ser uma operação atómica Garantir todas as invariantes
  • 54. Factory Diferentes tipos: StandaloneFactory FactoryMethod Util em aggregates Situações em que temos um objecto com grande relação de proximidade sobre o outro AbstractFactory Builder (para fluent interfaces)
  • 55. Factory E as invariantes onde pertencem? Pode-se delegar a validação ao próprio produto Em agregados pode ser melhor ter as regras também na própria factory (porque tipicamente estão dispersas por vários objectos) Regras do membro Identificador de uma entidade ou dum ValueObjecttêm existir na Factory
  • 56. Exemplo: Utilizamos internalno método construtor de Car para obrigar o projecto cliente a utilizar sempre a Factory na instanciação da classe Car.
  • 57. Repositório e UnitOfWork Repositório Abstrai o acesso aos dados Funciona como uma colecção de objectos em memória: Add, Remove, Get, Count UnitOfWork Registar as alterações ao estado dos objectos Gerir as transacções: Commit, Rollback ISession (NHibernate), DataContext (LinqToSQL)
  • 58. Citação... «Leave transaction control to the client. (…) Transaction management will be simpler if the REPOSITORY keeps its hands off.» Eric Evans
  • 59. Repositório Um por cada Agregado O agregado é sempre devolvido válido e completo Abstrair a implementação Facilitar os testes unitários Maior liberdade para mudar a implementação Facilitar optimizações de performance Implementar mecanismos de caching
  • 63. RepositoryPerAggregate GetById(int id) GetByName(string name) GetByCityAndState(City city, State state) Add(Person person) Count(), Sum() Uma classeRepositórioporcadaAgregado Dá-nosmaistrabalho do que o repositóriogenéricomaspermite-nosafinarmelhor as queries
  • 64. GenericRepository Uma classe genérica para todos os Agregados GetById<TId>(TIdid) Query<T>(Expression<Func<T, bool>> query) Insert<T>(T entity) Delete<T>(T entity) Ex: newRepository<Person, int>(…) GetById (20) Query (p => p.Idade > 20) Tipo Entidade Tipo Identificador
  • 69. Specification Pode ser usada para: Validar um objecto e verificar se cumpre certos requisitos ou se está preparado para um dado propósito Seleccionar um objecto de uma colecção Especificar as características de um objecto que vai ser instanciado Podemos passar ao repositório com a especificação dos critérios de pesquisa traduzidos para a linguagem de acesso aos dados (SQL/Linq/NHibernate).
  • 71. Resumo Entidade (Tem identidade) ValueObject (Imutável) Aggregate (Garante consistência) Factory (Facilita início do ciclo de vida) Repository(Faz gestão da persistência) Specification(Definir requisitos/características)
  • 73. Referências Domain-Driven Design: Tackling Complexity in the Heart of Software Eric Evans Applying Domain-Driven Design and Patterns Jimmy Nilsson
  • 74. Referências DomainDriven Design Community http://domaindrivendesign.org/ Apresentação Domaindriven Design - CatapultSystems http://www.slideshare.net/panesofglass/domain-driven-design UnitOfWork - MartinFowler http://martinfowler.com/eaaCatalog/unitOfWork.html Repositories and IQueryable, the paging case http://thinkbeforecoding.com/post/2009/01/19/Repositories-and-IQueryable-the-paging-case CQRS: Recording of an online class – Greg Young http://cqrsinfo.com/video/
  • 75. Referências DDDSample (em Java) http://dddsample.sourceforge.net/ ndddsample (C# DomainDriven Design sampleapplication) http://code.google.com/p/ndddsample/ DDDSample .Net http://dddsamplenet.codeplex.com/ Rhino Commons, AyendeRahien http://ayende.com/blog/archive/2007/06/08/rhino-commons-repositorylttgt-and-unit-of-work.aspx
  • 77. Obrigado! João Oliveira joao@nicolauoliveira.com http://blog.nicolauoliveira.com http://www.facebook.com/joaonoliveira http://pt.linkedin.com/in/jnicolau

Notas do Editor

  1. Domain Driven Design não é uma tecnologia ou metodologia. DDD é uma abordagem à modelação de software que providencia uma estrutura de práticas, padrões de programação e terminologias que ajudam à sua concepção.Nesta sessão vamos conhecer o que é Domain Driven Design, quando usar e como implementar. Para além disso serão apresentadas as principais Patterns acompanhadas com exemplos práticos de código.