Essa vem de um excelente post do MVP Greg Young (que é um dos poucos MVPs que eu vejo falando enfaticamente de DDD e arquitetura), e de uma discussão que tivemos na última reunião do .Net Architects.

O Greg coloca, com propriedade, que a Microsoft está recomendando um modelo anêmico, através das suas recomendações de aplicações em duas camadas com REST, ou de três camadas com Web. Ou seja, uma reclamação diretamente ligada à arquitetura.

É verdade? É. Querem prova? Eu provo. Vejam estas colocações, tiradas destes documentos:

  1. "Business rules are not implemented within the business entities." (Regras de negócio não são implementadas nas entidades de negócios.)
  2. "Business operations that need to be included in a transaction are combined in a single operation exposed by a business process object that implements the transaction script pattern." (Operações de negócios que precisam ser incluidas em uma transação são combinadas em uma única operação exposta por um processo de negócio que implementa o padrão "transaction script".)
  3. "Within the transaction script operation a transaction is started, one or more business operations are performed, and the transaction is committed or rolled-back based on the outcome of the business operations." (Dentro de operações de "transaction script" uma transação é iniciada, uma ou mais operações de negócio são realizadas, e a transação é completada ou revertida, baseada no resultado das operações de negócio.)

Realmente as recomendações presentes nestes dois documentos levam a aplicação a utilizar um modelo anêmico. Isso é um problema?

Lendo o excelente livro do Fowler PoEAA (review disponível na minha seção de livros recomendados) você ve a descrição do padrão transaction script, assim como vê os padrões table module e active record também. Há problema em utilizar estes padrões? Não, não há. Porque a reclamação então?

Bom, lendo-se a reclamação do Fowler sobre modelos anêmicos (link acima), você logo entende. Resumindo para quem estiver sem tempo: mapear dados relacionais para objetos dá o maior trabalho, e não utilizar um design OO, que une dados e comportamento, para dar lugar a um padrão procedural, como é o caso do transaction script, além de criar um bruta samba do criolo doido, é muito improdutivo. Se você vai trabalhar procedural, não faz sentido ficar criando um modelo de domínio todo bem planejado, faz mais sentido falar logo a lingua dos dados, como por exemplo relacional (maioria dos BDs), ou hierárquico (como no xml). Nada contra transaction scripts, só não chame isso de OO.

E porque este post se chama "evangelismo de código procedural"? Porque, conforme bem colocado na nossa última reunião do .Net Architects, e também pelo Mr. Young, esses padrões vão ser seguidos pela maior parte do mercado. Ah… isso sim é um problema. Não é um problema que a Microsoft publique sugestões de padrões, mas sim que publique sugestões que vão criar aplicações com deficiências, como são estes casos. Neste caso, o P&P faz um grande desserviço ao trabalhar com o foco nos dados, e ainda sugerir um ORM (Entity Framework) que usa Objetos, e um código procedural (transaction script). Também não gosto que a Microsoft faça evangelismo de código altamente procedural a desenvolvedores de software que ouvem a anos que devem trabalhar com OO. Vai causar uma tremanda dor de cabeça. Então, estou aqui, dando continuidade ao inconformismo do Greg, e acrescentando o meu próprio.

E vocês querem saber? They know better. A Microsoft possui mentes brilhantes, e oferecer um guia destes, que falha em pontos críticos, é falta de cuidado.

Eu já li muitos documentos do Patterns and Practices, e no passado os lia como se fossem palavras sagradas (daí também o termo evangelismo). Muita gente vai ler estes documentos assim. Não vai processar, vai seguir e acabou.

Da mesma forma eu também já vi muitas aplicações feitas assim. Querem saber? Depois de algum tempo o que você encontra, na maioria dos casos, é o conhecido "smelly code", o que em português seria um "código fedido". A aplicação, conforme cresce, fica cada vez mais difícil de manter, às vezes a ponto de impactar até o release 1. É o típico caso de aplicação que vai morrer e ser refeita várias vezes pela mesma empresa, sob qualquer pretexto, menos que o código é fedido. Geralmente é "atualização tecnológica", ou performance, ou qualquer outro.

Para mim isso significa mais consultoria. Mas sinceramente, eu prefero ajudar as empresas a ir mais longe, a ter que reensinar a dar os primeiros passos. Infelizmente, faço mais do segundo do que do primeiro.

Sugestão minha: leia o blog do Greg Young, que foi nomeado pela Microsoft como MVP, e portanto é reconhecido por ela como um profissional que sabe o que está falando, e pule estas recomendações do P&P. (Não todas, só essas.) E não siga nada do que leu, mas processe, entenda, e siga só o que te fizer sentido. Incluindo o que estou falando agora, aqui.


Postado na(s) categoria(s) Arquitetura pelo giovanni bassi em 25 de janeiro de 2009 às 00:30 | Tags: ,

Comentários


janeiro 25. 2009 11:39
Antonio Carlos Zegunis Filho
Eu falei na última reunião...eu falei...a tendência agora é piorar...

http://blog.tucaz.net/http://blog.tucaz.net/


Brazil Marcio Rezende
março 5. 2009 12:42
Marcio Rezende
Prezado Giovanni,

Tenho lido bastante sobre arquitetura em camadas no que tange a Análise Orientada a Objeto. Os modelos mais comuns que encontrei são os baseados na análise clássica, que divide o sistema em três camadas distintas e um modelo usando DTO/POCO.

No primeiro a divisão é feita deste modo:
   Boundary (fronteira) -> Control (controlador) -> Entity (entidade)

Nesse modelo as classes de entidades possuem tanto atributos quanto comportamentos, ou seja, a camada de controle atua apenas como um intermediário na comunicação entre fronteira e entidade.

Porém, tenho visto muitas pessoas sugerindo um modelo baseado em DTO/POCO, onde as classes de entidade são divididas em duas partes, sendo uma apenas para guardar os dados e outra para manipular estes dados. A principal vantagem segundo os que defendem esta abordagem é a facilidade de troca de informações remotamente, já que os DTO's/POCO's são objetos leves.

Entretanto há também muitas críticas ao modelo (fragmental.com.br/.../index.php onde se argumenta que se perde muito da característica OO ao dividir dados e comportamentos em objetos distintos, além de criar um pesadelo de manutenção quando há alteração nos atributos das entidades, por causa do acoplamento forte.

Gostaria de saber a sua opinião sobre isto. Quando você diz não recomendar modelos anêmicos, seria este um dos casos?

Obrigado.


no site


março 5. 2009 18:26
Giovanni Bassi
Marcio, é isso mesmo.
Separar dados e comportamento vai diretamente contra a OO. É esse um dos casos sim.
Quanto a DTO/POCO, não use como se fossem sinônimos, porque não são. DTOs são objetos sem comportamento, são guardadores de dados. POCOs são classes feitas em .Net que não têm dependência em nenhuma outra, ou em qualquer framework.
É verdade que DTOs são leves, e são uteis principalmente em um cenário de aplicação distribuída, ou seja, servem para serem mensagens. Mas isso não quer dizer que suas entidades devem ser DTOs. DTOs têm espaço, só não o tem no modelo.

http://unplugged.giggio.net/http://unplugged.giggio.net/

Comentar


(Vai mostrar seu Gravatar)

  Country flag

biuquote
  • Comentário
  • Pré-visualização
Loading



Quem é Giovanni Bassi

Giovanni Bassi Sou uma pessoa apaixonada por tecnologia e especificamente por .Net. Sou consultor independente especialista em .Net, focado em arquitetura e melhores práticas. Tenho dezenas de artigos publicados na .Net Magazine, revista da qual sou editor técnico. Ministro palestras e cursos de vez em quando, e quando dá tempo eu respiro um pouco. Mais detalhes nesta página.

Busca

Selos

Eu vou ao TechEd Brasil 2010, e você?

MVP

MCPD

MCSD

.Net Magazine

Abaixo ao if!

Calendário

«  setembro 2010  »
seteququsedo
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910
Ver detalhamento de posts no calendário

Blogs interessantes

    OPMLDownload OPML file

    Postagens recentes

    Comentários recentes

    Disclaimer / Aviso
    As opiniões colocadas neste blog são minhas e pessoais e não expressam necessariamente as opiniões de meus empregadores, pareceiros e amigos. Da mesma forma, os comentários feitos por leitores do blog não expressam a minha opinião.

    © Copyright 2010 .Net Unplugged
    Log in