Domain-Driven Design é Simples: Basta Chamar DAOs de Repositórios

Um fenômeno notado no Oriente e no Ocidente é a notável incapacidade de se entender o que raios é Domain-Driven Design. Na minha opinião isso é causado elo fato de que para chegar num nível onde DDD te ajuda você já precisa ter uma base formada e essa base não é comum. Eu vejo muitas pessoas tentando entender a solução quando na verdade elas deviam estar tentando chegar ao problema primeiro.

Uma das conseqüências deste comportamento é a síndrome do Padrão-de-Prata. Todo mundo sabe que Não existe bala de prata mas, hei, ninguém falou nada sobre padrões (ou frameworks, ou plataformas…) então, buscando respostas fáceis é comum se associar Domain-Driven Design aos padrões Entity, Repository, Value Object e amigos.

O que parece bem difícil de entender é que o ponto todo não é usar os padrões e sim porque você os usa. As técnicas dos padrões em si é muito antiga e o livro não traz nada de novo exceto sobre como utiliza-los para atingir o Domain-Driven Design. O que qualquer tópico no GUJ sobre o assunto (e mesmo na lista sobre Domain-Driven Design) não parece entender é que os padrões são um meio e não um fim.

Eu já repeti algumas vezes que você pode utilizar todos os padrões do Eric Evans e ainda assim não usar DDD. Nos últimos meses eu vivi um exemplo claro.

O cliente em questão é uma empresa de comunicação. Ela produz algo que você pode simplificar como um jornal de classificados. Os jornais em si são gerenciados e impressos por um sistema antigo e uma equipe de mais de 30 pessoas foi destacada para criar a versão online deste.

Como o sistema é antigo ele não oferece qualquer interface para conexão, logo a solução encontrada foi acessar o banco de dados diretamente. Como os dados continuam sendo inseridos pelo sistema antigo (e este não muda desde 1998) não existe muito problema nisso.

O projeto possui um time excelente, um dos grupos de pessoas mais capacitadas com quem já trabalhei, mas ainda assim não conseguiam andar. A velocidade da entrega das histórias estava bem abaixo do esperado e o nível de retrabalho era ridiculamente grande, mesmo com clientes on-site. Apos verificar que se a deadline não fosse cumprida eles teriam corte no orçamento chamaram consultores para avaliar a situação.

A primeira coisa que um consultor pensa quando chega num lugar desse é que eles não estão seguindo um processo ágil de verdade. É extremamente comum entrar numa empresa “Agile de carteirinha”e ver um processo que na verdade é composto por mini-waterfalls, tão comum que a solução default é mudar o processo. Não era o caso. O processo era legitimamente ágil, da análise de negócios à homologação, e a equipe, como disse, era excelente.

Apos alguns dias fazendo pair programming percebi uma coisa errada com o vocabulário. Era extremamente difícil entender conceitos simples da aplicação e cada reunião que se ia o vocabulário era diferente. Daí vamos analisar o caso melhor.

O banco de dados em questão, como era de se esperar numa aplicação legada, trazia um bando de regras de negocio embutidas em flags absurdos. O time fez um fabuloso trabalho criando um mecanismo que transformava dados do domínio antigo para o novo, formando um excelente Context Map.

Dentro do domínio o código era extremamente enxuto, fazendo uso de JPA e Spring para deixar o Domain Model apenas com regras de negocio. Eles usam Repositories como interfaces para DAOs que implementam a lógica JPA de maneira bem interessante.

Ainda assim a velocidade era ridícula. 5 pares e apenas 4 pontos por iteração(semanal). Após verificar que o problema não era nem o processo nem o código em si só restava continuar pareando para tentar ver o que estava acontecendo.

Um dia, após reescrever a mesma funcionalidade duas ou três vezes, meu par e eu saímos para um café na Starbucks. Enquanto conversávamos eu perguntei:

- Mas quando é que vocês vão começar a outra parte do sistema?
- Outra parte?
- Sim, a parte que substitui o legado…
- Ah. Não, não vamos.
- Não?
- Quer dizer, vamos sim mas ele não vai ficar muito diferente, na verdade para nós do sistema web a única diferença é que eles vão disponibilizar um web service ao invés do banco de dados…
- Mas vocês não vão mudar aqueles conceitos legados para o modelo novo?!?
- Conceitos legados? Aqueles não são conceitos legados, são os conceitos que nossa indústria usa. Se você parar de usar aqueles termos seus clientes não vão entender o que está falando…

E aí eu entendi o problema da comunicação. Na retrospectiva eu levantei um ponto e conversamos sobre o problema.

A coisa era bem simples, em verdade. Os usuários internos do sistema são vendedores. Quando você vende um anuncio você fala em estilos e estes estilos são padronizados nacionalmente. O sistema antigo, por pior que seja, tem os estilos e os outros conceitos editoriais modelados mas nós não tínhamos isso no sistema web. O nosso domínio, por mais bonito e bem-feitinho, foi criado pensando na melhor forma de disponibilizar dados na Internet e por isso o nosso modelo não falava a língua do usuário. Os usuários falavam os conceitos do modelo antigo e para entender o que eles diziam nós tínhamos que fazer todo o mapeamento para o que aquilo representava em código.

Com apenas algumas iterações para um grande release não há a menor possibilidade de mudar todo o domínio. A solução vai ser implementar as mudanças de maneira incremental, toda vez que código novo é escrito ou código antigo refatorado caminha-se para o novo modelo, que é algo parecido com o abaixo.

Este foi um exemplo real do que não é Domain-Driven Design. Todos os desenvolvedores desta empresa possuíam o livro do Evans nas suas baias, não existia BO ou VO no sistema e as Camadas eram bem definidas. Ainda assim a linguagem do código não era a linguagem do usuário e sem isso você pode até ter um modelo Orientado a Objetos de alta qualidade mas não tem Domain-Driven Design.

11 Responses to “Domain-Driven Design é Simples: Basta Chamar DAOs de Repositórios”

  1. FredMP says:

    Pode crer! Aqui na empresa em que trabalho a equipe tem errado muito ao montar um modelo de objetos segundo a NOSSA visão superficial do negócio. Estamos tentando corrigir isso tentado absorver o jargão do ambiente de negócios do cliente, entender as prioridades e satisfazer a necessidade real do cliente da forma mais simples possível. Essa tarefa não é nada fácil.

    []’s

  2. [...] estava escrevendo um comentário para o artigo “Domain-Driven Design é Simples: Basta Chamar DAOs de Repositórios” do Philip Calçado, mas acabei escrevendo muito e achei melhor comentar por [...]

  3. Rafael Ponte says:

    Excelente post Shoes!

    O que vejo em várias discussões, assim como no GUJ, é que muitos desenvolvedores simplesmente acham que utilizando-se dos patterns existentes no livro do Eric Evans vão está usando Domain-Driven Design. O que acaba sendo um grande engano! E o pior é que eles fazem questão de ler somente sobre os patterns no livro ou em resumos e não se preocupam com a cerne do DDD, que é a ubiquitous language e o domain model.

    Por isso houve aquela grande discussão no GUJ na thread sobre a matéria na MundoJava do Rodrigo Yoshima, muitos desenvolvedores simplesmente queriam ver patterns, pois acham que utilizando-se dos patterns estarão usando DDD.

    Enfim, parabéns Shoes, tenho acompanhado há muito tempo seu blog (os dois) e muitas discussões no GUJ e tenho aprendido bastante com elas.

    Abraços.

  4. André Faria says:

    Muito bom! Vejo muitas pessoas preocupadas em aplicar patterns, parace que se sentem importantes por isso, mas nem sempre se preocupam com a com a essencia desses patterns a razão pela qual eles foram criados, e os aplicam de maneira ineficiente.

  5. Diogo Souza says:

    Mais um ótimo texto.

    Conheci este conceito de ubiquitous language na já citada materia da Mundo Java, mas antes já havia absorvido esta ideia de forma superficial, após problemas semelhantes ao descrito em um projeto.

    Acredito os patterns servem para amenizar dificuldades em implementação, sendo um suporte a modelagem e DDD em geral.

  6. Leandro says:

    “As técnicas dos padrões em si é muito antiga e o livro não traz nada de novo…” Na sua apostila de Spring você já citava tais padrões e na mesma resaltava que mais importante era o [i]negocio[/i].

    Essa linguagem comum deixa tudo mais fácil…
    +1vez bom post!

  7. Fred de Castro says:

    Gostei muito do artigo, estou lendo alguns outros artigos sobre o assunto e percebí que minha equipe já fazia DDD, mesmo sem saber o que era.

    Acho que é só uma questão de bom senso e maturidade para que todo mundo perceba os benefícios do DDD.

  8. [...] linkando para um excelente post do Philip Calçado que ele publicou essa semana (parece até que combinamos) sobre DDD falando justo que o que conta [...]

  9. George Queiroz says:

    Como foi falado, tudo o que foi descrito existe desde os primórdios, a diferença é que agora temos grandes times de desenvolvedores, componentes etc etc, antigamente um mesmo cara, conhecia o problema, desenhava, fechava com o usuário e implementava, ou na época do clipper era diferente? Pois é, hoje sempre se negligencia na parte de levantamento dos requisitos(entimento do problema) e como se trabalha em esquemas de fábricas, soltam um monte de UC e manda construir, e em muitos o desenvolvedor que ver que a coisa não funcionar, e quando se volta ao time de requisitos, nem eles mesmos tem certeza. Por certo o problema é que se é dedicado muito tempo para código haja visto que o histórico de gasto de tempo para desenvolvimento é alto, então o conhecimento de negócio fica de lato, passo por isso todo dia…

    [s]
    Baiano

  10. Valder Lemes Zacarkim says:

    Um exemplo simples e eficaz!

    Parabens pelo post!

  11. [...] Artigo interessante: Domain-Driven Design [...]

Leave a Reply