Complexidade everywhere

Você realmente está atacando a complexidade? Ou está ajudando a criá-la? 🤔

O que quero dizer com isso?

Trabalhar em consultoria me traz a oportunidade de atuar em vários projetos de empresas completamente diferentes e, embora difiram, certas práticas parecem não mudar.

Percebo em diversos lugares aplicações sendo criadas utilizando arquitetura de N camadas e com conceitos de DDD. Por que será? Porque virou boilerplate! Tornou-se sinônimo de “projeto bem arquiteturado”, logo, TODO projeto segue essa estrutura, dois mais simples ao mais complexos.

O DDD existe para nos ajudar a atacar as complexidades no coração do software

…quando elas existem! E não para justificar a criação de um projeto com inúmeras camadas e com seus conceitos “só porque é legal e/ou porque parece ser mais certo”.

Se você é desenvolvedor, já deve ter encontrado um projeto com uma estrutura mais ou menos assim (Se é desenvolvedor .NET, 99% são as chances que sim):

[Empresa].[Projeto].[API] -> Controllers
[Empresa].[Projeto].[Domain] -> Entities
[Empresa].[Projeto].[Application] -> Services, Handlers
[Empresa].[Projeto].[Infrastructure] -> Repositories, Context

Vamos supor que os projetos mais simples de uma empresa sejam CRUDs, não há regras de negócio, apenas validações de inputs. O “Domain” (que não existe) naturalmente só vai conter Modelos anêmicos. Aqui é apenas CRUD, não tem como dar muito errado… Por que então gerar toda essa complexidade?

Agora vamos supor um cenário de um projeto mais complexo: uma empresa que tenha necessidades muito específicas com regras de negócio que evoluam constantemente. O projeto precisa evoluir conforme a empresa evolui e nesse caso é necessário tratar o Domínio (que dessa vez realmente existe) com muita delicadeza.

Ocorre que muito provalvemente, o suposto projeto mais complexo será tratado como o projeto mais simples!

– Mas agora a complexidade existe. Faria sentido criar as N camadas e “usar” DDD, não?

NÃO! A ideia é atacar a complexidade, não gerá-la. Criar camadas e mais camadas e utilizar conceitos de DDD como foi feito nos projeto CRUDs, não resolve NADA por si só. É preciso entender os PORQUÊS das escolhas.

Além do mais, muito provavelmente o projeto será executado como os mais simples:

1. 'Criar o projeto com o Boilerplate ("N Camadas" + "DDD")'
2. 'Criar Models'
3. 'Criar tabelas no banco de dados'
4. 'Criar services e mais services'
5. 'Repetir os itens [2, 3, 4, 5]'

Diagamos que esse projeto realmente exista e a primeira entrega tenha sido um sucesso…

…MAS VÍRGULA

Acontece que o Domínio é complexo! Ele vai evoluir, mais processos surgirão e o projeto e nem a equipe estão preparados para isso. A Domain Model é anêmica, os processos e regras de negócio estão acoplados com serviços de aplicação. Como serão as próximas entregas dessa equipe?

Pela minha experência, posso dizer que geralmente termina com a famosa Big Ball of Mud.

Conclusão

Mantenha simples o que é para ser simples (Keep it simple, stupid)! Lembre-se que não existe bala de prata e trate de complexidades como elas devem ser tratadas. Uma dica: foque no domínio.

Sim, a palavra “complexid4de” foi utilizada 7 vezes, e essa não é a oitava.

Marcelo Ribeiro
Marcelo Ribeiro
.NET Developer