segunda-feira, 14 de março de 2011

DDD: Melhorando a forma de carregar as Views utilizando Modelo Rico.

DDD sem dúvida é uma excelente ferramenta para auxiliar a resolver problemas que surgem em domínios complexos porém, como todo mundo diz, não é bala de prata. Mas o problema que eu vou expor aqui não é exclusivo de quem utiliza DDD e sim de qualquer solução que se utiliza de Modelo de Domínio Rico.

Quando você tem um Modelo de domínio rico as operações de escrita ficam mais coesas, as responsabilidades ficam mais claras além de outros benefícios, no entando, você pode ganhar alguns problemas nas operações de leitura.
Imagine uma tela onde você tenha três combobox, cada combobox populada com uma entidade diferente. Agora imagine essas entidades com um número significativo de propriedades (não vou definir aqui o quanto seria esse número, essa discussão não vem ao caso agora) e uma cadeia de relacionamento complexa (A relacionada com B que se relaciona com C e assim por diante). Como faríamos para popular esses combos da tela?

Certamente você utilizaria o repositorio especifico para cada uma das entidades e faria a consulta apropriada para popular os combos.

Você conseguiu identificar alguma problema nisso? Não? Então deixa eu ajudar.

Você percebeu quantas chamadas ao banco de dados você teve que fazer? Se você tiver utilizando alguma forma de serviço (WCF, WCF Data Services, ou qualquer outro tipo de serviço) você teve que chamar no mínimo três chamadas de serviço e cada chamada de serviço resultou em uma chamada de banco de dados.

Pronto, ta ai o pretesto que o seu companheiro de trabalho ou o seu gerente de projetos precisava para falar que DDD não presta! Mas esse tipo de problema também tem solução.

Primeira coisa: Pelo amor de Deus, use um ORM. Se você é daqueles programadores que ainda tem resistência a um ORM (como eu tinha) pare com isso agora antes que a coisa fique feia!
Com a utilização de ORM podemos utilizar recursos que nos ajudam na performance da aplicação como Lazy Loading, Cache, operações em Batch. O NHibernate tem funcionalidades excelentes para esses tipos de caso, por exemplo, com o Future poríamos popular os três combobox com uma única chamada para o banco de dados.

Segundo: Popule sua View somente com dados que ela precisa. Se para um combobox só precisamos de um Id e Descrição, pra que vamos trazer todos os dados da entidade? Novamente ferramentas como o NHibernate nos ajudam com esse tipo de situação.

De onde eu tirei essas soluções? CQRS.

Pretendo colocar algumas soluções práticas para esse tipo de situação, mas ja adianto as dicas apresentadas aqui é apenas uma das várias formas que temos para resolver esse problema. O importante é reconhecer que o problema esta lá e ter a mente aberta para as muitas formas de resolve-lo.

Até mais.

Nenhum comentário: