Successfully reported this slideshow.
Your SlideShare is downloading. ×

Domain Driven Design - Sergio Lopes - Falando em Java 2008

Ad

Sérgio Lopes
sergio.lopes@caelum.com.br

Ad

Domain-Driven Design

Ad

Domain-Driven Design

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Ad

Upcoming SlideShare
Workshop DDD
Workshop DDD
Loading in …3
×

Check these out next

1 of 78 Ad
1 of 78 Ad

More Related Content

More from Caelum (20)

Domain Driven Design - Sergio Lopes - Falando em Java 2008

  1. 1. Sérgio Lopes sergio.lopes@caelum.com.br
  2. 2. Domain-Driven Design
  3. 3. Domain-Driven Design
  4. 4. Domain
  5. 5. ?
  6. 6. ?
  7. 7. Domain
  8. 8. Domain Problema real
  9. 9. Negócio complicado Domain Problema real
  10. 10. Negócio complicado Pessoas reais Domain Problema real
  11. 11. Negócio complicado Pessoas reais Domain Problema real Palavriado do negócio
  12. 12. CONVERSA
  13. 13. CONVERSA Sobre o domínio
  14. 14. CONVERSA Sobre o domínio Para criar um sistema
  15. 15. CONVERSA Sobre o domínio Para criar um sistema
  16. 16. Precisamos falar a mesma língua! CONVERSA Sobre o domínio Para criar um sistema
  17. 17. Língua Ubíqua (Ubiquitous Language)
  18. 18. E aí programador! Tudo beleza?
  19. 19. Temos alguns lagos aqui na fazenda com vários peixes diferentes...
  20. 20. Nosso cliente chega na loja e usará o sistema para buscar os melhores peixes para ele.
  21. 21. Por exemplo, temos peixes aqui de várias cores. O cliente vai querer escolher uma cor que combine melhor com seu aquário e sua casa.
  22. 22. Por exemplo, temos peixes aqui de várias cores. O cliente vai querer escolher uma cor que combine melhor com seu aquário e sua casa.
  23. 23. O cliente normalmente também quer escolher a espécie (uma carpa, uma tilápia, etc)
  24. 24. Peixe - cor -espécie
  25. 25. Peixe - cor Cor -espécie -nome
  26. 26. Peixe - cor Cor -espécie Espécie -nome (Tilápia, Lambari, Carpa, ...)
  27. 27. Isso! E nossos peixes ainda recebem um nome e um código de identificação.
  28. 28. Isso! E nossos peixes ainda recebem um nome e um código de identificação.
  29. 29. Peixe - id - nome - cor Cor -espécie Espécie -nome (Tilápia, Lambari, Carpa, ...)
  30. 30. Mas nosso cliente geralmente vai estar interessado em buscar apenas por cor e espécie...
  31. 31. Mas nosso cliente geralmente vai estar interessado em buscar apenas por cor e espécie...
  32. 32. Ótimo! É isso mesmo!
  33. 33. Peixe - id - nome - cor Cor -espécie Espécie -nome (Tilápia, Lambari, Carpa, ...)
  34. 34. Repositório de Peixes Peixe - id - nome - cor Cor -espécie Espécie -nome (Tilápia, Lambari, Carpa, ...)
  35. 35. Repositório de Peixes buscarPorCor buscarPorEspécie Peixe - id - nome - cor Cor -espécie Espécie -nome (Tilápia, Lambari, Carpa, ...)
  36. 36. E, viu, outro tipo de busca que normalmente quero saber é, dado um peixe, dizer quais são os peixes irmãos dele, os da mesma espécie.
  37. 37. E, viu, outro tipo de busca que normalmente quero saber é, dado um peixe, dizer quais são os peixes irmãos dele, os da mesma espécie.
  38. 38. Acho que usando nosso repositório fica bem fácil de saber né?
  39. 39. Repositório de Peixes buscarPorCor buscarPorEspécie Peixe - id - nome - cor Cor -espécie Espécie -nome - irmãos (Tilápia, Lambari, Carpa, ...)
  40. 40. Codificar!
  41. 41. public class Peixe { private Long id; private String nome; private Especie especie; private Cor cor; }
  42. 42. public enum Especie { TILÁPIA, CARPA, LAMBARI, TRAÍRA; } public class Cor { private String nome; public Cor(String cor) { this.nome = cor; } public String getNome() { return this.nome; } @Override public String toString() { return this.nome; } }
  43. 43. Repositório... BD? DAO? O que o cliente quer?
  44. 44. public interface PeixeRepository { List<Peixe> getTodosOsPeixes(); List<Peixe> getPeixesDeCor(Cor cor); List<Peixe> getPeixesDaEspecie(Especie especie); Peixe getPeixePeloId(Long id); }
  45. 45. // quero saber os irmaos do Peixe public class Peixe { // ..... private PeixeRepository peixeRepository; public void setPeixeRepository(PeixeRepository peixeRepository) { this.peixeRepository = peixeRepository; } public List<Peixe> getPeixesIrmaos() { return this.peixeRepository.getPeixesDaEspecie(this.especie); } }
  46. 46. UI Layer Application Layer Domain Layer Infrastructure Layer
  47. 47. UI Layer Application Layer Domain Layer Infrastructure Layer
  48. 48. Ei, programador!! O sistema tá ficando muito bom mesmo hein!
  49. 49. Ei, programador!! O sistema tá ficando muito bom mesmo hein!
  50. 50. Mas eu esqueci um negócio: os clientes aqui, quando compram seus peixes, também querem saber se os peixes podem viver no mesmo aquário
  51. 51. Mas eu esqueci um negócio: oséclientes aqui, quando A regra bem simples: para compram seus peixes, podem viver os nossos peixes, só também juntos se forem da mesma espécie. querem saber se os peixes podem Seria legal verificarmos isso viver no mesmo aquário
  52. 52. A regra é bem simples: para os nossos peixes, só podem viver juntos se forem da mesma espécie. Seria legal verificarmos isso
  53. 53. Model Código
  54. 54. Model Código
  55. 55. public class Peixe { // ... public boolean podeViverCom(Peixe outroPeixe) { return this.especie.equals(outroPeixe.especie); } }
  56. 56. Domain-Driven Design • Voltado (driven) totalmente ao problema a ser resolvido (domain) • Ubiquitous Language • Funciona muito bem com Agile • Modelos ricos (não anêmicos) • Nomes importam! • Patterns: Entity,Value Object, Repository, Aggregate, Module, Service
  57. 57. Domain-Driven Design • Não detalhei os patterns • Podia ter usado framework mais decente • Podia ter usado Inversão de controle
  58. 58. Não importa a tecnologia. O que importa é o domain.
  59. 59. Obrigado! Sérgio Lopes sergio.lopes@caelum.com.br

Editor's Notes

  • 1 min
  • 30 SEG
    Tudo comecou em uma bela fazenda muito distante daqui.
    START
    L&amp;#xE1; moram o Cachorro, o Sapo, o Peixe, bla bla
    Um belo dia, o cachorro resolveu abrir um negocio. E para isso, precisava de um sistema.

  • 30 seg
    E ele veio conversar com a equipe tecnica!

    CACHORRO: &amp;#x201C;Ola, eu tive a fantastica ideia de abrir uma loja de peixes. E preciso de um sistema para isso.&amp;#x201D;

  • 30 seg
    E ele veio conversar com a equipe tecnica!

    CACHORRO: &amp;#x201C;Ola, eu tive a fantastica ideia de abrir uma loja de peixes. E preciso de um sistema para isso.&amp;#x201D;

  • 30 seg
    E ele veio conversar com a equipe tecnica!

    CACHORRO: &amp;#x201C;Ola, eu tive a fantastica ideia de abrir uma loja de peixes. E preciso de um sistema para isso.&amp;#x201D;

  • 15 seg
  • 30 seg
  • 30 seg
  • 30 seg
  • 30 seg

    CACHORRO: &amp;#x201C;Temos lambaris, carpas, tambaquis, tilapias e outros cicl&amp;#xED;deos&amp;#x201D;

  • 30 seg

    CACHORRO: &amp;#x201C;Temos lambaris, carpas, tambaquis, tilapias e outros cicl&amp;#xED;deos&amp;#x201D;

  • 30 seg

    PROGRAMADOR: &amp;#x201C;Humm, se fizermos a TilapiaVO estender de AbstractCiclideo, acho que d&amp;#xE1;&amp;#x201D;

  • 30 seg

    PROGRAMADOR: &amp;#x201C;Humm, se fizermos a TilapiaVO estender de AbstractCiclideo, acho que d&amp;#xE1;&amp;#x201D;

  • TODO Revisar esse texto
    1 min
  • TODO Revisar esse texto
    1 min
  • TODO Revisar esse texto
    1 min
  • TODO Revisar esse texto
    1 min
  • - tenho pessoas do dominio e pessoas tecnicas conversando
    - elas PRECISAM conversar
  • - tenho pessoas do dominio e pessoas tecnicas conversando
    - elas PRECISAM conversar
  • - Precisam se entender, &amp;#xE9; necessaria uma lingua comum!

  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model

  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model




  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model

  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model



  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  • TODO cachorro falando mudo
    di&amp;#xE1;logo todo at&amp;#xE9; primeiro model




  • repository eh domain
    DAO eh ORM

  • citar IoC
    &amp;#x201C;e como implemento o repositorio? sei la, isso nao eh domain layer, eh infra&amp;#x201D;

  • mostrar rodando no browser
    falar do struts






  • qualquer mudanca no model se reflete no codigo
  • qualquer mudanca no codigo tbm se reflete no model!

    model e codigo andam juntos, tem que refletir a mesma coisa





×