Giovanni Bassi Consultor independente giovannibassi.com [email_address]
Giovanni Bassi
Online @ Giovanni Bassi Email:  [email_address] Blog: unplugged.giggio.net  Consultoria: giovannibassi.com  Scrum Dev: scrumdev.com.br  Podcast:  tecnoretorica.com.br  Twitter:  @giovannibassi .Net Architects Grupo: www.dotnetarchitects.net  Podcast: podcast.dotnetarchitects.net  Online:  tinyurl.com/DotNetArch  Dojo: dojo.dotnetarchitects.net Twitter:  #DotNetArchitects @NetArchitects
Orientação a objetos? 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?
 
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; } }      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...
Ou assim...
Mais regras...
 
Ciclo de vida: Factories criam Repositórios recuperam Repositórios alteram Repositórios destroem
Processo
Funciona assim? Levantamento Análise Codificação Testes Implantação
Feedback é fundamental
Assim é bem mais fácil
Abrace 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
 
 
 
 
 
 
 
 
 
Downloads 
Referências
Recomendação de leitura
 
Online @ Giovanni Bassi Email:  [email_address] Blog: unplugged.giggio.net  Consultoria: giovannibassi.com  Scrum Dev: scrumdev.com.br  Podcast:  tecnoretorica.com.br  Twitter:  @giovannibassi .Net Architects Grupo: www.dotnetarchitects.net  Podcast: podcast.dotnetarchitects.net  Online:  tinyurl.com/DotNetArch  Dojo: dojo.dotnetarchitects.net Twitter:  #DotNetArchitects @NetArchitects

Domain Driven Design (DDD) - DevIsland, BH

  • 1.
    Giovanni Bassi Consultorindependente giovannibassi.com [email_address]
  • 2.
  • 3.
    Online @ GiovanniBassi Email: [email_address] Blog: unplugged.giggio.net Consultoria: giovannibassi.com Scrum Dev: scrumdev.com.br Podcast: tecnoretorica.com.br Twitter: @giovannibassi .Net Architects Grupo: www.dotnetarchitects.net Podcast: podcast.dotnetarchitects.net Online: tinyurl.com/DotNetArch Dojo: dojo.dotnetarchitects.net Twitter: #DotNetArchitects @NetArchitects
  • 4.
  • 5.
  • 6.
    NHibernate Datasets CamadasOrientação a objetos Waterfall Agilidade Injeção de dependência Entity Framework Rails Cloud Computing SOA Linguagens Dinâmicas
  • 7.
    Visão de futuroou... Porque o arquiteto deve ser preocupar com DDD
  • 8.
    Começando pelo começo:o que é DDD? “ É uma abordagem para o desenvolvimento de software”
  • 9.
  • 10.
  • 11.
    Qual o focodo DDD?
  • 12.
  • 13.
  • 14.
    “ Para amaioria 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
  • 15.
    Domínio? Esfera deconhecimento, influência ou atividade. A área em que o usuário utiliza o software.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
    Modelos são baseadosem abstrações
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
    Modelos são abstraçõesIsso 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
  • 27.
    Não há padrão para um modelo
  • 28.
    Ele pode serassim...
  • 29.
  • 30.
  • 31.
    Ubiquitous Language (estáem toda parte) Vem dos business experts É refletida no modelo É refletida no código É falada pelo time
  • 32.
    “ 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”
  • 33.
    Ouça o BusinessExpert É ele quem conhece o problema, não você
  • 34.
  • 35.
    Camadas devem fazersentido (verifique suas responsabilidades) Se não separou não é camada Layers != Tiers Camadas
  • 36.
  • 37.
    “ Esta camadaé o coração de um software de negócios” Eric Evans
  • 38.
  • 39.
    Entidades possuemidentidade Entidades têm significado no domínio
  • 40.
    Objetos de valornão tem identidade para o negócio Freqüentemente são imutáveis São reconhecidos por seus atributos Cores: Azul Amarelo Verde Vermelho
  • 41.
    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; } }     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; }        }
  • 42.
    Agregações reunementidades 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
  • 43.
  • 44.
  • 45.
    Serviços resolvemproblemas de negócio mas não são entidades nem objetos de valor Serviços não possuem estado de negócio
  • 46.
  • 47.
    Factories criamobjetos Levemente diferente das factories de padrões de projeto Será responsabilidade de um objeto se construir? Objetos devem ser criados consistentes
  • 48.
    Como criar qualquerdestes objetos? Só com factories
  • 49.
    Repositórios fingemque 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
  • 50.
    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...
  • 51.
  • 52.
  • 53.
  • 54.
    Ciclo de vida:Factories criam Repositórios recuperam Repositórios alteram Repositórios destroem
  • 55.
  • 56.
    Funciona assim? LevantamentoAnálise Codificação Testes Implantação
  • 57.
  • 58.
    Assim é bemmais fácil
  • 59.
    Abrace as mudanças...... não brigue com elas
  • 60.
  • 61.
  • 62.
    Mas pode dartrabalho Então o foco são projetos com regras de negócio complexas
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 76.
  • 77.
    Online @ GiovanniBassi Email: [email_address] Blog: unplugged.giggio.net Consultoria: giovannibassi.com Scrum Dev: scrumdev.com.br Podcast: tecnoretorica.com.br Twitter: @giovannibassi .Net Architects Grupo: www.dotnetarchitects.net Podcast: podcast.dotnetarchitects.net Online: tinyurl.com/DotNetArch Dojo: dojo.dotnetarchitects.net Twitter: #DotNetArchitects @NetArchitects

Notas do Editor