SlideShare uma empresa Scribd logo
.Net Architects
Descobrir o que o DDD pode fazer por você Objetivo
 
 
NHibernate Datasets Camadas Orientação a objetos Waterfall Agilidade Injeção de dependência Entity Framework Rails Cloud Computing SOA Linguagens Dinâmicas
Visão de futuro ou...  Porque o arquiteto deve ser preocupar com DDD
Começando pelo começo: o que é DDD? “ É uma abordagem para o desenvolvimento de software”
 
 
Qual o foco do DDD?
X
Focado no domínio!
“ Para a maioria dos projetos de software o foco principal deve ser no  domínio  e na  lógica do domínio .” “ Desenhos complexos de domínio devem ser baseados em um  modelo .” Quais são as duas principais premissas do DDD? Eric Evans
Domínio? Esfera de conhecimento, influência ou atividade. A área em que o usuário utiliza o software.
Modelo? Não...
O mundo Século XI
O mundo Século XVIII
O mundo
Modelos são baseados em abstrações
O mundo
 
 
 
 
Modelos são abstrações Isso quer dizer que o que não interessa fica de fora Se você conseguir equalizar isso, o modelo é perfeito Modelos devem refletir o código ou são irrelevantes
Não há padrão  para um modelo
Ele pode ser assim...
Ou até assim...
No modelo vão...
Ubiquitous Language (está em toda parte) Vem dos business experts É refletida no modelo É refletida no código É falada pelo time
“ Tabela” “ Classe” “ Thread” “ Banco de dados” “ Façade” “ .Net 3.5” “ Carga” “ Conta corrente” “ Serviço de tradução de itinerário” “ Repositório de clientes” “ Agendamento de horário”
Ouça o Business Expert É ele quem conhece o problema,  não você
 
Camadas devem fazer sentido (verifique suas responsabilidades) Se não separou não é camada Layers != Tiers Camadas
 
“ Esta camada é o coração de um software de negócios” Eric Evans
Utilize: ( )
Entidades  possuem identidade Entidades  têm significado  no domínio
Objetos de valor não tem identidade  para o negócio Freqüentemente são imutáveis São reconhecidos por seus atributos Cores: Azul Amarelo Verde Vermelho
public   struct   Categoria {      public   string  Nome   {  get ;  private   set ; }      public   int   Id      {  get ;  private   set ; }        private   static   Categoria  _Veiculos =  new   Categoria () { Id =  1 , Nome =  "Veiculos"  };      public   static   Categoria  Veiculos       {  get  {  return  _Veiculos; } }      private   static   Categoria  _Livros =  new   Categoria () { Id =  2 , Nome =  "Livros"  };      public   static   Categoria  Livros      {  get  {  return  _Livros;} }      public   override   bool  Equals( object  obj)      {          if  (!(obj  is   Categoria ))              return   false ;          return  (( Categoria )obj).Nome ==  this .Nome;                  }      public   static   bool   operator  ==( Categoria  objA,  Categoria  objB)      {  return  objA.Equals(objB); }       public   static   bool   operator  !=( Categoria  objA,  Categoria  objB)      {  return  !objA.Equals(objB); }       public   override   int  GetHashCode()      {  return   this .Id; }         }
Agregações  reunem entidades e objetos de valor de maneira que faça sentido para o negócio Agregações  definem fronteiras  claras Toda  agregação  tem uma raiz
 
Algumas regras...
Serviços  resolvem problemas de negócio mas não são entidades nem objetos de valor Serviços  não possuem estado de negócio
 
Factories  criam objetos Levemente diferente das  factories  de padrões de projeto Será responsabilidade de um objeto se construir? Objetos devem ser criados consistentes
Como criar qualquer destes objetos? Só com factories
Repositórios  fingem que têm todos os dados na memória Para o consumidor do  repositório  não faz muita diferença onde está o objeto Os  Repositórios  são os responsáveis por persistir e destruir os objetos
public   class   RepositoryCargaSQLServer  :  IRepositoryCarga {      public   Carga  RecuperarCarga( int  id)      {          var  cmd =  new   SqlCommand ( "SELECT ..." );          var  adapter =  new   SqlDataAdapter (cmd);          var  dataset =  new   DataSet ();          adapter.Fill(dataset);          var  factory =  new   FactoryCarga ();          var  carga = factory.CriaCarga(dataset.Tables[0].Rows[0]);          return  carga;      }      public   void  ArmazenaCarga( Carga  carga)      {          var  cmd =  new   SqlCommand ();          if  (carga.ID == -1)              cmd.CommandText =  "INSERT..." ;          else              cmd.CommandText =  "UPDATE..." ;                      cmd.ExecuteNonQuery();      } } Podem ser assim...
public   void  SalvarVeiculacao( IVeiculacao  veiculacao) {      using  ( var  db =  new   VendasOnlineEntities ( this ._conn)      {        var  veiculacaoDB = ( from  veics  in  db.Veiculacao.Include( "Produto" )             .Include( "Pagamento.PagamentoBoleto" )             .Include( "Pagamento.PagamentoCartaoCredito" )                   where  veics.Id == veiculacao.Id                 select  veics).First();        AtualizarVeiculacao(veiculacaoDB, veiculacao, db);        db.SaveChanges();      } } Assim...
veiculacaoDB.Custo = veiculacao.Custo; veiculacaoDB.DataLiberacao = veiculacao.DataLiberacao; veiculacaoDB.Dias = veiculacao.Dias; veiculacaoDB.EstaLiberada = veiculacao.EstaLiberada; veiculacaoDB.Inicio = veiculacao.Inicio; veiculacaoDB.Prioridade = (short)veiculacao.Prioridade; pgtoDB.Aprovado = pgto.Aprovado; pgtoDB.MeioPagamento = (short)pgto.MeioDePagamento; pgtoDB.Valor = pgto.Valor; if (pgto.DataDaRealizacaoDoPagamento.HasValue) pgtoDB.DataDaRealizacaoDoPagamento =  pgto.DataDaRealizacaoDoPagamento.Value;
Ou assim...
Ciclo de vida: Factories criam Repositórios recuperam Repositórios alteram Repositórios destroem
Processo
Funciona assim?
Feedback é fundamental O tempo todo!
Assim é bem mais fácil
Aceite as mudanças... ... não brigue com elas
 
 
Mas pode dar trabalho Então o foco são projetos com regras de negócio complexas
Arquitetos são chamados para trabalhar em projetos que não são complexos?
 
 
 
 
 
 
 
 
 
 
 

Mais conteúdo relacionado

PPT
Domain Driven Design (DDD) - DevIsland, BH
PPTX
Programando com prazer com DDD
PDF
Domain Driven Design – DDD além da teoria!, por Paulo Victor Gomes
PDF
DDD + BDD + TDD - RF 2015
PDF
DDD – Domain Driven Design
PDF
Domain Driven Design com Python
PPTX
DDD – Domain Driven Design
PDF
Domain Driven Design PHP TDC2014
Domain Driven Design (DDD) - DevIsland, BH
Programando com prazer com DDD
Domain Driven Design – DDD além da teoria!, por Paulo Victor Gomes
DDD + BDD + TDD - RF 2015
DDD – Domain Driven Design
Domain Driven Design com Python
DDD – Domain Driven Design
Domain Driven Design PHP TDC2014

Mais procurados (20)

PDF
Java+DDD+BDD+TDD=Sucesso Total
PPTX
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
PPTX
Domain-Driven Design
PPT
Código limpo
PPTX
Behaviour driven development, com jbehave
PDF
Behaviour-Driven Development com Ruby
PDF
DDD - Linguagem Ubíqua
PPTX
Boas práticas técnica para um código limpo (Clean Code)
PDF
Intro padroesprojetoadaptertemplateobserver
KEY
Clean code
PDF
DDD in PHP
PPTX
Framework Entities - Apresentação da Defesa da Dissertacao
PPTX
Code Smells
PDF
Refinamento e boas práticas de programação
PPTX
PDF
RSpec - Desenvolvimento Baseado em Teste
PPTX
Clean code em C#
PDF
Refatoração - aquela caprichada no código
PDF
Test First, TDD e outros Bichos
Java+DDD+BDD+TDD=Sucesso Total
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Domain-Driven Design
Código limpo
Behaviour driven development, com jbehave
Behaviour-Driven Development com Ruby
DDD - Linguagem Ubíqua
Boas práticas técnica para um código limpo (Clean Code)
Intro padroesprojetoadaptertemplateobserver
Clean code
DDD in PHP
Framework Entities - Apresentação da Defesa da Dissertacao
Code Smells
Refinamento e boas práticas de programação
RSpec - Desenvolvimento Baseado em Teste
Clean code em C#
Refatoração - aquela caprichada no código
Test First, TDD e outros Bichos
Anúncio

Destaque (14)

PDF
Workshop DDD
PDF
REST - Padroes e Melhores Praticas
PPTX
Introdução ao DDD
PDF
Story and Emergent Design
PPT
Domain Driven Design Demonstrated
PPT
Web Services Rest
PDF
Emergent design - PHP Jo'burg 2015
PPT
ASP.NET Identity - O Novo componente de Membership do ASP.NET
PPTX
DDD - Domain Driven Design
PDF
Domain-Driven Design with ASP.NET MVC
PPTX
Implementing DDD with C#
PDF
Neal Ford Emergent Design And Evolutionary Architecture
PPTX
Refactoring, Emergent Design & Evolutionary Architecture
PPTX
Por dentro do .NET Core
Workshop DDD
REST - Padroes e Melhores Praticas
Introdução ao DDD
Story and Emergent Design
Domain Driven Design Demonstrated
Web Services Rest
Emergent design - PHP Jo'burg 2015
ASP.NET Identity - O Novo componente de Membership do ASP.NET
DDD - Domain Driven Design
Domain-Driven Design with ASP.NET MVC
Implementing DDD with C#
Neal Ford Emergent Design And Evolutionary Architecture
Refactoring, Emergent Design & Evolutionary Architecture
Por dentro do .NET Core
Anúncio

Semelhante a DDD > Experiências (20)

PPT
Aula1
PPT
Desenvolvimento Agil Com Doctrine Orm
PPTX
Javascript para CSharpers 4 - POO
PPTX
Desenvolvendo com Silverlight para WP7 Mango [Update]
PDF
Wicket 2008
PPTX
Maratona Windows Phone 7
PDF
Evento Front End SP - Organizando o Javascript
PDF
Como conectar programas em linguagem java a bases de dados
PDF
Evolução e futuro do uso de paradigmas no JavaScript
PDF
Aula ASP.NET.pdf whatsap Whatsap pdf.com
PPT
Introdução Ruby 1.8.7 + Rails 3
PPT
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
PPT
LINQ - Language Integrated Query
PDF
Workshop Ruby on Rails dia 2 ruby-pt
PPT
AspectJ — Programação orientada a aspectos em Java
PPT
Introdução à análise orientada a objetos parte 1
PPT
Introdução à análise orientada a objetos parte 1
PPTX
Java e orientação a objetos
PDF
Introdução a JPA (2010)
Aula1
Desenvolvimento Agil Com Doctrine Orm
Javascript para CSharpers 4 - POO
Desenvolvendo com Silverlight para WP7 Mango [Update]
Wicket 2008
Maratona Windows Phone 7
Evento Front End SP - Organizando o Javascript
Como conectar programas em linguagem java a bases de dados
Evolução e futuro do uso de paradigmas no JavaScript
Aula ASP.NET.pdf whatsap Whatsap pdf.com
Introdução Ruby 1.8.7 + Rails 3
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
LINQ - Language Integrated Query
Workshop Ruby on Rails dia 2 ruby-pt
AspectJ — Programação orientada a aspectos em Java
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1
Java e orientação a objetos
Introdução a JPA (2010)

Mais de Giovanni Bassi (20)

PPTX
O que aprendi montando a arquitetura de microsserviços
PPTX
Sendo ágil com git
PDF
Analisando dumps de memória de aplicações .NET
PPTX
Novidades do c# 7 e 8
PPTX
Async e await com JavaScript: entenda e use agora
PPTX
Conhecendo o AKS, o azure container services com kubernetes
PPTX
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
PPTX
C#7, 7.1, 7.2, 7.3 e C# 8
PPTX
Engenharia ágil de ponta a ponta do clone ao deploy
PPTX
Entrega contínua fica mais fácil com contêineres
PPTX
.NET Core, ASP.NET Core e .NET Standard 2
PPTX
.NET com contêineres Windows e Linux
PPTX
Async e await com JavaScript: entenda e use agora
PPTX
Compartilhando código entre frontend e backend com Node.js
PPTX
Construindo uma ferramenta CLI multiplataforma com Node.js
PDF
O Futuro do C#: C#8
PDF
Um mergulho nos containers windows
PPTX
Build e release pipeline com docker
PPTX
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
PPTX
Backend na nuvem com docker
O que aprendi montando a arquitetura de microsserviços
Sendo ágil com git
Analisando dumps de memória de aplicações .NET
Novidades do c# 7 e 8
Async e await com JavaScript: entenda e use agora
Conhecendo o AKS, o azure container services com kubernetes
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
C#7, 7.1, 7.2, 7.3 e C# 8
Engenharia ágil de ponta a ponta do clone ao deploy
Entrega contínua fica mais fácil com contêineres
.NET Core, ASP.NET Core e .NET Standard 2
.NET com contêineres Windows e Linux
Async e await com JavaScript: entenda e use agora
Compartilhando código entre frontend e backend com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.js
O Futuro do C#: C#8
Um mergulho nos containers windows
Build e release pipeline com docker
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Backend na nuvem com docker

Último (11)

PPTX
Utilizando code blockes por andre backes
PDF
Manejo integrado de pragas na cultura do algodão
PPTX
Arquitetura de computadores - Memórias Secundárias
PPTX
Eng. Software - pontos essenciais para o início
PPTX
Tipos de servidor em redes de computador.pptx
PDF
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
PPTX
Viasol Energia Solar -Soluções para geração e economia de energia
PDF
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
PPTX
Design - Introdução a Gestalt e teoria das formas
PPTX
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
PPTX
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...
Utilizando code blockes por andre backes
Manejo integrado de pragas na cultura do algodão
Arquitetura de computadores - Memórias Secundárias
Eng. Software - pontos essenciais para o início
Tipos de servidor em redes de computador.pptx
eBook - GUIA DE CONSULTA RAPIDA EM ROTEADORES E SWITCHES CISCO - VOL I.pdf
Viasol Energia Solar -Soluções para geração e economia de energia
Termos utilizados na designação de relação entre pessoa e uma obra.pdf
Design - Introdução a Gestalt e teoria das formas
Proposta de Implementação de uma Rede de Computador Cabeada.pptx
Informática Aplicada Informática Aplicada Plano de Ensino - estudo de caso NR...

DDD > Experiências

  • 2. Descobrir o que o DDD pode fazer por você Objetivo
  • 3.  
  • 4.  
  • 5. NHibernate Datasets Camadas Orientação a objetos Waterfall Agilidade Injeção de dependência Entity Framework Rails Cloud Computing SOA Linguagens Dinâmicas
  • 6. Visão de futuro ou... Porque o arquiteto deve ser preocupar com DDD
  • 7. Começando pelo começo: o que é DDD? “ É uma abordagem para o desenvolvimento de software”
  • 8.  
  • 9.  
  • 10. Qual o foco do DDD?
  • 11. X
  • 13. “ Para a maioria dos projetos de software o foco principal deve ser no domínio e na lógica do domínio .” “ Desenhos complexos de domínio devem ser baseados em um modelo .” Quais são as duas principais premissas do DDD? Eric Evans
  • 14. Domínio? Esfera de conhecimento, influência ou atividade. A área em que o usuário utiliza o software.
  • 19. Modelos são baseados em abstrações
  • 21.  
  • 22.  
  • 23.  
  • 24.  
  • 25. Modelos são abstrações Isso quer dizer que o que não interessa fica de fora Se você conseguir equalizar isso, o modelo é perfeito Modelos devem refletir o código ou são irrelevantes
  • 26. Não há padrão para um modelo
  • 27. Ele pode ser assim...
  • 30. Ubiquitous Language (está em toda parte) Vem dos business experts É refletida no modelo É refletida no código É falada pelo time
  • 31. “ Tabela” “ Classe” “ Thread” “ Banco de dados” “ Façade” “ .Net 3.5” “ Carga” “ Conta corrente” “ Serviço de tradução de itinerário” “ Repositório de clientes” “ Agendamento de horário”
  • 32. Ouça o Business Expert É ele quem conhece o problema, não você
  • 33.  
  • 34. Camadas devem fazer sentido (verifique suas responsabilidades) Se não separou não é camada Layers != Tiers Camadas
  • 35.  
  • 36. “ Esta camada é o coração de um software de negócios” Eric Evans
  • 38. Entidades possuem identidade Entidades têm significado no domínio
  • 39. Objetos de valor não tem identidade para o negócio Freqüentemente são imutáveis São reconhecidos por seus atributos Cores: Azul Amarelo Verde Vermelho
  • 40. public struct Categoria {     public string Nome  { get ; private set ; }     public int Id      { get ; private set ; }       private static Categoria _Veiculos = new Categoria () { Id = 1 , Nome = "Veiculos" };     public static Categoria Veiculos     { get { return _Veiculos; } }     private static Categoria _Livros = new Categoria () { Id = 2 , Nome = "Livros" };     public static Categoria Livros     { get { return _Livros;} }     public override bool Equals( object obj)     {         if (!(obj is Categoria ))             return false ;         return (( Categoria )obj).Nome == this .Nome;                }     public static bool operator ==( Categoria objA, Categoria objB)     { return objA.Equals(objB); }      public static bool operator !=( Categoria objA, Categoria objB)     { return !objA.Equals(objB); }      public override int GetHashCode()     { return this .Id; }        }
  • 41. Agregações reunem entidades e objetos de valor de maneira que faça sentido para o negócio Agregações definem fronteiras claras Toda agregação tem uma raiz
  • 42.  
  • 44. Serviços resolvem problemas de negócio mas não são entidades nem objetos de valor Serviços não possuem estado de negócio
  • 45.  
  • 46. Factories criam objetos Levemente diferente das factories de padrões de projeto Será responsabilidade de um objeto se construir? Objetos devem ser criados consistentes
  • 47. Como criar qualquer destes objetos? Só com factories
  • 48. Repositórios fingem que têm todos os dados na memória Para o consumidor do repositório não faz muita diferença onde está o objeto Os Repositórios são os responsáveis por persistir e destruir os objetos
  • 49. public class RepositoryCargaSQLServer : IRepositoryCarga {     public Carga RecuperarCarga( int id)     {         var cmd = new SqlCommand ( "SELECT ..." );         var adapter = new SqlDataAdapter (cmd);         var dataset = new DataSet ();         adapter.Fill(dataset);         var factory = new FactoryCarga ();         var carga = factory.CriaCarga(dataset.Tables[0].Rows[0]);         return carga;     }     public void ArmazenaCarga( Carga carga)     {         var cmd = new SqlCommand ();         if (carga.ID == -1)             cmd.CommandText = "INSERT..." ;         else             cmd.CommandText = "UPDATE..." ;                    cmd.ExecuteNonQuery();     } } Podem ser assim...
  • 50. public void SalvarVeiculacao( IVeiculacao veiculacao) {     using ( var db = new VendasOnlineEntities ( this ._conn)     {       var veiculacaoDB = ( from veics in db.Veiculacao.Include( "Produto" )             .Include( "Pagamento.PagamentoBoleto" )             .Include( "Pagamento.PagamentoCartaoCredito" )                 where veics.Id == veiculacao.Id               select veics).First();       AtualizarVeiculacao(veiculacaoDB, veiculacao, db);       db.SaveChanges();     } } Assim...
  • 51. veiculacaoDB.Custo = veiculacao.Custo; veiculacaoDB.DataLiberacao = veiculacao.DataLiberacao; veiculacaoDB.Dias = veiculacao.Dias; veiculacaoDB.EstaLiberada = veiculacao.EstaLiberada; veiculacaoDB.Inicio = veiculacao.Inicio; veiculacaoDB.Prioridade = (short)veiculacao.Prioridade; pgtoDB.Aprovado = pgto.Aprovado; pgtoDB.MeioPagamento = (short)pgto.MeioDePagamento; pgtoDB.Valor = pgto.Valor; if (pgto.DataDaRealizacaoDoPagamento.HasValue) pgtoDB.DataDaRealizacaoDoPagamento = pgto.DataDaRealizacaoDoPagamento.Value;
  • 53. Ciclo de vida: Factories criam Repositórios recuperam Repositórios alteram Repositórios destroem
  • 56. Feedback é fundamental O tempo todo!
  • 57. Assim é bem mais fácil
  • 58. Aceite as mudanças... ... não brigue com elas
  • 59.  
  • 60.  
  • 61. Mas pode dar trabalho Então o foco são projetos com regras de negócio complexas
  • 62. Arquitetos são chamados para trabalhar em projetos que não são complexos?
  • 63.  
  • 64.  
  • 65.  
  • 66.  
  • 67.  
  • 68.  
  • 69.  
  • 70.  
  • 71.  
  • 72.  
  • 73.