SlideShare uma empresa Scribd logo
Sérgio Lopes
sergio.lopes@caelum.com.br
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Domain-Driven Design
Domain-Driven Design
Domain
Domain Driven Design - Sergio Lopes - Falando em Java 2008
?
Domain Driven Design - Sergio Lopes - Falando em Java 2008
?
Domain
Domain
Problema real
Negócio complicado



      Domain
Problema real
Negócio complicado
                Pessoas reais

      Domain
Problema real
Negócio complicado
                  Pessoas reais

      Domain
Problema real
                Palavriado do negócio
CONVERSA
CONVERSA
Sobre o domínio
CONVERSA
  Sobre o domínio
Para criar um sistema
CONVERSA
  Sobre o domínio
Para criar um sistema
Precisamos falar a mesma língua!



       CONVERSA
        Sobre o domínio
      Para criar um sistema
Língua Ubíqua
  (Ubiquitous Language)
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Domain Driven Design - Sergio Lopes - Falando em Java 2008
E aí
programador!
 Tudo beleza?
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Temos alguns
lagos aqui na fazenda
com vários peixes
    diferentes...
Nosso cliente
chega na loja e usará o sistema
para buscar os melhores
      peixes para ele.
Domain Driven Design - Sergio Lopes - Falando em Java 2008
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.
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.
Domain Driven Design - Sergio Lopes - Falando em Java 2008
O cliente
 normalmente também
quer escolher a espécie
 (uma carpa, uma tilápia,
   etc)
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Peixe
 - cor
-espécie
Peixe
         - cor
 Cor    -espécie
-nome
Peixe
         - cor
 Cor    -espécie      Espécie
-nome              (Tilápia, Lambari,
                        Carpa, ...)
Isso! E nossos
peixes ainda recebem
um nome e um código
  de identificação.
Isso! E nossos
peixes ainda recebem
um nome e um código
  de identificação.
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Peixe
           - id
         - nome
          - cor
 Cor    -espécie      Espécie
-nome              (Tilápia, Lambari,
                        Carpa, ...)
Mas nosso cliente geralmente
vai estar interessado em buscar
  apenas por cor e espécie...
Mas nosso cliente geralmente
vai estar interessado em buscar
  apenas por cor e espécie...
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Ótimo!
É isso mesmo!
Peixe
           - id
         - nome
          - cor
 Cor    -espécie      Espécie
-nome              (Tilápia, Lambari,
                        Carpa, ...)
Repositório
         de Peixes




           Peixe
            - id
          - nome
           - cor
 Cor     -espécie        Espécie
-nome                 (Tilápia, Lambari,
                           Carpa, ...)
Repositório
         de Peixes

                    buscarPorCor
                    buscarPorEspécie


           Peixe
            - id
          - nome
           - cor
 Cor     -espécie               Espécie
-nome                        (Tilápia, Lambari,
                                  Carpa, ...)
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.
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.
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Acho que
 usando nosso
repositório fica bem
    fácil de saber né?
Repositório
         de Peixes

                    buscarPorCor
                    buscarPorEspécie


           Peixe
            - id
          - nome
           - cor
 Cor     -espécie               Espécie
-nome    - irmãos            (Tilápia, Lambari,
                                  Carpa, ...)
Codificar!
public class Peixe {

	   private Long id;
	   private String nome;

	   private Especie especie;
	   private Cor cor;

}
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;
	   }
}
Repositório... BD? DAO?
 O que o cliente quer?
public interface PeixeRepository {
	 List<Peixe> getTodosOsPeixes();

	   List<Peixe> getPeixesDeCor(Cor cor);

	   List<Peixe> getPeixesDaEspecie(Especie especie);

	   Peixe getPeixePeloId(Long id);
}
// 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);
	   }

}
UI Layer
 Application Layer
   Domain Layer
Infrastructure Layer
UI Layer
 Application Layer
   Domain Layer
Infrastructure Layer
Ei, programador!!
O sistema tá ficando muito
   bom mesmo hein!
Ei, programador!!
O sistema tá ficando muito
   bom mesmo hein!
Domain Driven Design - Sergio Lopes - Falando em Java 2008
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
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
A regra é bem simples: para
os nossos peixes, só podem viver
juntos se forem da mesma espécie.
  Seria legal verificarmos isso
Domain Driven Design - Sergio Lopes - Falando em Java 2008
Model



Código
Model



Código
public class Peixe {

	   // ...
	
	   public boolean podeViverCom(Peixe outroPeixe) {
	   	 return this.especie.equals(outroPeixe.especie);
	   }



}
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
Domain-Driven Design


• Não detalhei os patterns
• Podia ter usado framework mais decente
• Podia ter usado Inversão de controle
Não importa a
 tecnologia. O que
importa é o domain.
Obrigado!

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

Mais conteúdo relacionado

Domain Driven Design - Sergio Lopes - Falando em Java 2008

Notas do Editor

  1. 1 min
  2. 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.
  3. 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;
  4. 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;
  5. 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;
  6. 15 seg
  7. 30 seg
  8. 30 seg
  9. 30 seg
  10. 30 seg CACHORRO: &amp;#x201C;Temos lambaris, carpas, tambaquis, tilapias e outros cicl&amp;#xED;deos&amp;#x201D;
  11. 30 seg CACHORRO: &amp;#x201C;Temos lambaris, carpas, tambaquis, tilapias e outros cicl&amp;#xED;deos&amp;#x201D;
  12. 30 seg PROGRAMADOR: &amp;#x201C;Humm, se fizermos a TilapiaVO estender de AbstractCiclideo, acho que d&amp;#xE1;&amp;#x201D;
  13. 30 seg PROGRAMADOR: &amp;#x201C;Humm, se fizermos a TilapiaVO estender de AbstractCiclideo, acho que d&amp;#xE1;&amp;#x201D;
  14. TODO Revisar esse texto 1 min
  15. TODO Revisar esse texto 1 min
  16. TODO Revisar esse texto 1 min
  17. TODO Revisar esse texto 1 min
  18. - tenho pessoas do dominio e pessoas tecnicas conversando - elas PRECISAM conversar
  19. - tenho pessoas do dominio e pessoas tecnicas conversando - elas PRECISAM conversar
  20. - Precisam se entender, &amp;#xE9; necessaria uma lingua comum!
  21. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  22. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  23. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  24. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  25. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  26. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  27. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  28. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  29. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  30. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  31. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  32. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  33. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  34. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  35. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  36. TODO cachorro falando mudo di&amp;#xE1;logo todo at&amp;#xE9; primeiro model
  37. repository eh domain DAO eh ORM
  38. citar IoC &amp;#x201C;e como implemento o repositorio? sei la, isso nao eh domain layer, eh infra&amp;#x201D;
  39. mostrar rodando no browser falar do struts
  40. qualquer mudanca no model se reflete no codigo
  41. qualquer mudanca no codigo tbm se reflete no model! model e codigo andam juntos, tem que refletir a mesma coisa