Rodrigo Branas - @rodrigobranas – http://www.agilecode.com.br




      Domain-Driven Design
http://www.slideshare.net/rodrigobranas
@rodrigobranas
  rodrigo.branas@gmail.com
 http://www.agilecode.com.br
Formação Acadêmica
Ciências da Computação – UFSC
Gerenciamento de Projetos - FGV

Certificações

SCJA, SCJP, SCJD, SCWCD, SCBCD, PMP, MCP e CSM
Rodrigo Branas – rodrigo.branas@gmail.com
10 anos de experiência na plataforma Java
1000 horas em sala de aula
Mais de 50 palestras em eventos

Líder da área de desenvolvimento na Gennera
Autor da revista Java Magazine
Palestrante
Instrutor da Academia Java e Agile da Globalcode
Criador dos treinamentos de Clean Code, Selenium e
Maven da Agile Code

Trabalhou com as empresas:
EDS, HP, GM, Citibank, OnCast, Globalcode, V.Office, Dígitr
o, Softplan, Unimed, Suntech, Vale do Rio
Software é uma abstração da
         realidade
A realidade é formada por
conhecimento tácito
Conhecimento Tácito

“Conhecimento formado no dia-a-dia
 das pessoas, intangível e difícil de
  ser descrito através de palavras.”


  Exemplos: Dirigir, Tocar um instrumento
      musical, Praticar um esporte.
Esse conhecimento é
denominado de Domain
Domain

“Campo de ação, conhecimento e
         influência.”

É completamente abstrato e
   intangível inicialmente
Cuidado: Domain não é um
 diagrama ou algo do tipo
Domain Model
Estruturar, organizar e esclarecer
             o Domain
Sua principal importância está
         no feedback
Cuidado: Também não é um
 diagrama ou algo do tipo
Domain Model é a idéia que o
  diagrama tenta transmitir
O conhecimento está na cabeça
     dos Domain Experts
Domain Experts
Quem é o Domain Expert?
Alguém que conhece profundamente
     os detalhes de um Domain
O que diferencia um Domain
Expert de um Product Owner?
Distância entre Domain Experts
      e desenvolvedores
Cuidado: Problemas de
comunicação pela frente!
Aprendizagem do Domain
Você já teve a sensação de estar
    perdido em um projeto?
Como começar?
Não entre em detalhes, crie uma
definição superficial e abrangente do
 escopo do projeto e a utilize como
base para continuar evoluindo rumo a
    um entendimento completo e
             profundo.
Problemas de falta de contexto
Montando o quebra-cabeça com
 apenas um pedaço do mapa
Cuidado: Tentar entender apenas
uma pequena parte do todo, em
 detalhes, pode ser complicado
Nunca vá a frente sem entender
tudo que é discutido e conversado
Linguagem e Comunicação
Convivemos em tribos
      diferentes
Por conta disso, utilizamos de
 linguagens muito diferentes
Domain Experts tem dificuldade
  em entender de tecnologia
Cuidado: Não imponha uma
linguagem focada na tecnologia
É muito importante criar e estabelecer
uma linguagem oficial, entendida por
  Domain Experts e desenvolvedores
Ubiquitous Language
A linguagem é o conhecimento
      de forma dinâmica
Deve ser utilizada todo o tempo
    no decorrer do projeto
Debate: Utilizar inglês ou
português dentro do código?
Diagramas
Existe algum diagrama específico
para trabalhar com Domain-Driven
             Design?
Facilitando a comunicação e
 melhorando o aprendizado
Breakthrough
Model-Driven Design
O que é o Design de um
       software?
Cuidado: Design não é relacionado
as cores utilizadas na interface gráfica
Qual é a diferença entre o Design
e a Arquitetura de um software?
O código deve
    refletir a
  linguagem
Isolando e fortalecendo o
      Domain Model
Smart UI
Produtividade parece ser alta no início
Desvantagens:

1.   Não é reutilizável
2.   Pouco flexível
3.   Dificilmente integrável
4.   Ambiente torna-se caótico
     rapidamente
Arquitetura
em camadas
User Interface
Camada responsável por
 abrigar ações e comandos
capazes de interpretar ações
  realizadas por usuários.

 (Inclusive outro sistema)
Application
Camada responsável por
 suportar diversos tipos de UI,
realizar traduções e conversões
de dados e ainda exposição das
  operações de negócios para
      quem tiver interesse
           na aplicação
Domain
Camada onde os artefatos
 expressam o domínio. Essa
camada é onde fica o coração
 do software. Deve refletir o
       Domain Model.
Infrastructure
Suporte técnico para as outras
 camadas. Responsável pela
  persistência, segurança, e
          auditoria.
Domain Objects
Entity
Cuidado: O conceitos de ORM
 sobre entidades é diferente
Possuem uma identidade
   dentro do domínio
Value Object
Não tem identidade
Exemplo: Cor RGB

Public class RGBColor {
  public int red;
  public int green;
  public int blue;

    public RGBColor(int red, int green, int blue) {
          this.red = red;
          this.green = green;
          this.blue = blue;
    }
}
Representam valores imutáveis
Service
Services são objetos que
gerenciam a execução de fluxos
   de negócio orquestrando a
 interação entre os objetos do
            domínio
Cuidado: Modelo Anêmico
Services em geral não possuem
            estado
Entendendo SOA

Service-Oriented Architecture
Isolando conceitos
Aggregates
Grupo lógico de objetos
Uma entity deve ser a raiz e
  único ponto de acesso
Entendendo o ciclo de vida
   dos Domain Objects
Factory
Facilitar e assumi a
responsabilidade pela criação
   de objetos, ocultando a
       complexidade.
Tipos de Factory
Simple Factory
Factory Method
Abstract Factory
Repository
Guardando e recuperando
    Domain Objects
Faz uso da camada de
    infraestrutura
Repository não é parecido com
       o padrão DAO?
Supple Design
Aumentando a expressão do
    Domain no código
Intention revealing interfaces
Interface   Implementação
Side-effect free functions
Métodos que realizam
consultas (Queries) e possuem
retorno, no entanto modificam
     o estado de objetos
         (Comandos)
Assertions
Contorno conceitual
Qual é a precisão da
    abstração?
Classes independentes
Voltando as raízes da
Orientação a Objetos
Coesão
A importância da
responsabilidade única
Acoplamento
Lei de Demeter
Strategic Design
Modularizando sistemas
 grandes e complexos
Trabalhar com equipes
       externas
Bounded Context
Domain Models diferentes
Redução do acoplamento
Como fica o reuso?
Continuous Integration
Integrando diferentes
      contextos
Cuidado: Contextos individuais
podem deixar de funcionar em
          conjunto
Context Map
Visualizar o todo
Descrição de cada ponto de
contato entre os modelos de
       cada contexto
Exercício: Criar o Context Map
    para o Domain Model.
Shared Kernel
Quando dois times alteram uma mesma base de
 código comum. É importante que esse pedaço
  de código esteja bem definido e que possua
  muitos testes automatizados, que devem ser
   rodados por qualquer um dos grupos que
        desejar fazer alguma alteração.
Cuidado: Comunicar a outra
equipe sempre que for realizar
     qualquer alteração
Customer/Suplier Teams
Contextos tecnologicamente
diferentes, tornando inviável a
  utilização do Shared Kernel
Uma equipe fará o papel de
 consumidora e a outra de
       fornecedora
Conformist
A outra equipe não está
interessada em colaborar
Como resultado temos um
Shared Kernel sem colaboração
Separate Ways
O trabalho para integrar é tão
grande que vale mais a pena
   seguir por um caminho
          separado
Open Host Service
API consumida como serviço
externo através de protocolos
           de rede
Published API
Documentando e orientando a
     utilização da API
Anticorruption Layer
Quando temos um sistema legado, com código
 muito bagunçado e uma interface complexa, e
  estamos escrevendo um sistema novo com o
 código razoavelmente bem feito, criamos uma
      camada entre esses dois sistemas .

O nosso sistema novo e bem feito falará com essa
 camada, que possui uma interface bem feita. E a
camada anti-corrupção é responsável por traduzir
  e adaptar as chamadas para o sistema legado,
          usando uma fachada interna.
“Any fool can write code that a
  computer can understand.
Good programmers write code
that humans can understand.”

         Martin Fowler

Domain-Driven Design