SlideShare uma empresa Scribd logo
1 de 73
.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? ,[object Object],[object Object]
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

Mais procurados

Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalEduardo Bregaida
 
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)Fábio Nogueira de Lucena
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehaveMarcelo Zeferino
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Rodrigo Kono
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverEduardo Jorge
 
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
 
Refinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoRefinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoAécio Costa
 
RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteEduardo Mendes
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoJuciellen Cabrera
 

Mais procurados (20)

Java+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso TotalJava+DDD+BDD+TDD=Sucesso Total
Java+DDD+BDD+TDD=Sucesso Total
 
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)Especificação por meio de exemplos (BDD, testes de aceitação, ...)
Especificação por meio de exemplos (BDD, testes de aceitação, ...)
 
Domain-Driven Design
Domain-Driven DesignDomain-Driven Design
Domain-Driven Design
 
Código limpo
Código limpoCódigo limpo
Código limpo
 
Uml
UmlUml
Uml
 
Behaviour driven development, com jbehave
Behaviour driven development, com jbehaveBehaviour driven development, com jbehave
Behaviour driven development, com jbehave
 
Behaviour-Driven Development com Ruby
Behaviour-Driven Development com RubyBehaviour-Driven Development com Ruby
Behaviour-Driven Development com Ruby
 
DDD - Linguagem Ubíqua
DDD - Linguagem UbíquaDDD - Linguagem Ubíqua
DDD - Linguagem Ubíqua
 
Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)Boas práticas técnica para um código limpo (Clean Code)
Boas práticas técnica para um código limpo (Clean Code)
 
Intro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserverIntro padroesprojetoadaptertemplateobserver
Intro padroesprojetoadaptertemplateobserver
 
Clean code
Clean codeClean code
Clean code
 
DDD in PHP
DDD in PHPDDD in PHP
DDD in PHP
 
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
 
Code Smells
Code SmellsCode Smells
Code Smells
 
Refinamento e boas práticas de programação
Refinamento e boas práticas de programaçãoRefinamento e boas práticas de programação
Refinamento e boas práticas de programação
 
Clean code
Clean codeClean code
Clean code
 
RSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em TesteRSpec - Desenvolvimento Baseado em Teste
RSpec - Desenvolvimento Baseado em Teste
 
Clean code em C#
Clean code em C#Clean code em C#
Clean code em C#
 
Refatoração - aquela caprichada no código
Refatoração - aquela caprichada no códigoRefatoração - aquela caprichada no código
Refatoração - aquela caprichada no código
 
Test First, TDD e outros Bichos
Test First, TDD e outros BichosTest First, TDD e outros Bichos
Test First, TDD e outros Bichos
 

Destaque

REST - Padroes e Melhores Praticas
REST - Padroes e Melhores PraticasREST - Padroes e Melhores Praticas
REST - Padroes e Melhores PraticasFelipe Firmo
 
Story and Emergent Design
Story and Emergent DesignStory and Emergent Design
Story and Emergent DesignHugh Graham
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Alan Christensen
 
Emergent design - PHP Jo'burg 2015
Emergent design - PHP Jo'burg 2015Emergent design - PHP Jo'burg 2015
Emergent design - PHP Jo'burg 2015rouanw
 
ASP.NET Identity - O Novo componente de Membership do ASP.NET
ASP.NET Identity - O Novo componente de Membership do ASP.NETASP.NET Identity - O Novo componente de Membership do ASP.NET
ASP.NET Identity - O Novo componente de Membership do ASP.NETEduardo Pires
 
Domain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVCDomain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVCSteven Smith
 
Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#Pascal Laurin
 
Neal Ford Emergent Design And Evolutionary Architecture
Neal Ford Emergent Design And Evolutionary ArchitectureNeal Ford Emergent Design And Evolutionary Architecture
Neal Ford Emergent Design And Evolutionary ArchitectureThoughtworks
 
Refactoring, Emergent Design & Evolutionary Architecture
Refactoring, Emergent Design & Evolutionary ArchitectureRefactoring, Emergent Design & Evolutionary Architecture
Refactoring, Emergent Design & Evolutionary ArchitectureBrad Appleton
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET CoreGiovanni Bassi
 

Destaque (14)

Workshop DDD
Workshop DDDWorkshop DDD
Workshop DDD
 
REST - Padroes e Melhores Praticas
REST - Padroes e Melhores PraticasREST - Padroes e Melhores Praticas
REST - Padroes e Melhores Praticas
 
Introdução ao DDD
Introdução ao DDDIntrodução ao DDD
Introdução ao DDD
 
Story and Emergent Design
Story and Emergent DesignStory and Emergent Design
Story and Emergent Design
 
Domain Driven Design Demonstrated
Domain Driven Design Demonstrated Domain Driven Design Demonstrated
Domain Driven Design Demonstrated
 
Web Services Rest
Web Services RestWeb Services Rest
Web Services Rest
 
Emergent design - PHP Jo'burg 2015
Emergent design - PHP Jo'burg 2015Emergent design - PHP Jo'burg 2015
Emergent design - PHP Jo'burg 2015
 
ASP.NET Identity - O Novo componente de Membership do ASP.NET
ASP.NET Identity - O Novo componente de Membership do ASP.NETASP.NET Identity - O Novo componente de Membership do ASP.NET
ASP.NET Identity - O Novo componente de Membership do ASP.NET
 
DDD - Domain Driven Design
DDD - Domain Driven DesignDDD - Domain Driven Design
DDD - Domain Driven Design
 
Domain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVCDomain-Driven Design with ASP.NET MVC
Domain-Driven Design with ASP.NET MVC
 
Implementing DDD with C#
Implementing DDD with C#Implementing DDD with C#
Implementing DDD with C#
 
Neal Ford Emergent Design And Evolutionary Architecture
Neal Ford Emergent Design And Evolutionary ArchitectureNeal Ford Emergent Design And Evolutionary Architecture
Neal Ford Emergent Design And Evolutionary Architecture
 
Refactoring, Emergent Design & Evolutionary Architecture
Refactoring, Emergent Design & Evolutionary ArchitectureRefactoring, Emergent Design & Evolutionary Architecture
Refactoring, Emergent Design & Evolutionary Architecture
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET Core
 

Semelhante a DDD > Experiências

Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmGuilherme Blanco
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOWesley Lemos
 
Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]Felipe Pimentel
 
Maratona Windows Phone 7
Maratona Windows Phone 7Maratona Windows Phone 7
Maratona Windows Phone 7Felipe Pimentel
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dadosHenrique Fernandes
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptJean Carlo Emer
 
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgBarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgjqrd
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated QueryDalton Valadares
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-ptPedro Sousa
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em Javaelliando dias
 
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1ariovaldodias
 
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1ariovaldodias
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)Helder da Rocha
 
Rails - EXATEC2009
Rails - EXATEC2009Rails - EXATEC2009
Rails - EXATEC2009Caue Guerra
 

Semelhante a DDD > Experiências (20)

Aula1
Aula1Aula1
Aula1
 
Desenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine OrmDesenvolvimento Agil Com Doctrine Orm
Desenvolvimento Agil Com Doctrine Orm
 
Javascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POOJavascript para CSharpers 4 - POO
Javascript para CSharpers 4 - POO
 
Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]Desenvolvendo com Silverlight para WP7 Mango [Update]
Desenvolvendo com Silverlight para WP7 Mango [Update]
 
Wicket 2008
Wicket 2008Wicket 2008
Wicket 2008
 
Maratona Windows Phone 7
Maratona Windows Phone 7Maratona Windows Phone 7
Maratona Windows Phone 7
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 
Como conectar programas em linguagem java a bases de dados
Como conectar programas em linguagem java  a bases de dadosComo conectar programas em linguagem java  a bases de dados
Como conectar programas em linguagem java a bases de dados
 
Evolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScriptEvolução e futuro do uso de paradigmas no JavaScript
Evolução e futuro do uso de paradigmas no JavaScript
 
Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3Introdução Ruby 1.8.7 + Rails 3
Introdução Ruby 1.8.7 + Rails 3
 
Oficial
OficialOficial
Oficial
 
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.orgBarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
BarCamp 2007 - CodeIgniter e OncologiaPediátrica.org
 
LINQ - Language Integrated Query
LINQ - Language Integrated QueryLINQ - Language Integrated Query
LINQ - Language Integrated Query
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-pt
 
AspectJ — Programação orientada a aspectos em Java
AspectJ — Programação orientada a aspectos em JavaAspectJ — Programação orientada a aspectos em Java
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 1Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1
 
Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1Introdução à análise orientada a objetos parte 1
Introdução à análise orientada a objetos parte 1
 
Java e orientação a objetos
Java e orientação a objetosJava e orientação a objetos
Java e orientação a objetos
 
Introdução a JPA (2010)
Introdução a JPA (2010)Introdução a JPA (2010)
Introdução a JPA (2010)
 
Rails - EXATEC2009
Rails - EXATEC2009Rails - EXATEC2009
Rails - EXATEC2009
 

Mais de Giovanni Bassi

O que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosO que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosGiovanni Bassi
 
Analisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETAnalisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETGiovanni Bassi
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraGiovanni Bassi
 
Conhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesConhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesGiovanni Bassi
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Giovanni Bassi
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8Giovanni Bassi
 
Engenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployEngenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployGiovanni Bassi
 
Entrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresEntrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresGiovanni Bassi
 
.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2Giovanni Bassi
 
.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux.NET com contêineres Windows e Linux
.NET com contêineres Windows e LinuxGiovanni Bassi
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraGiovanni Bassi
 
Compartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsCompartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsGiovanni Bassi
 
Construindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsConstruindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsGiovanni Bassi
 
Um mergulho nos containers windows
Um mergulho nos containers windowsUm mergulho nos containers windows
Um mergulho nos containers windowsGiovanni Bassi
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com dockerGiovanni Bassi
 
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Giovanni Bassi
 
Backend na nuvem com docker
Backend na nuvem com dockerBackend na nuvem com docker
Backend na nuvem com dockerGiovanni Bassi
 

Mais de Giovanni Bassi (20)

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

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.
  • 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.