O que leva as pessoas a criar VOs anêmicas?

[quote=peczenyj]- O que leva as pessoas a criar VOs anêmicas?

A pergunta deveria ser

Quem lucra (e como) com pessoas que criam VOs anêmicas?[/quote]

Quem lucra são pessoas que dizem assim: “Classe anêmicas é sempre ruim”.
Depois criam consultorias para modificar o seu sistema para não usar classes anêmicas.
ai vc, crente de que é ruim ( ou com medo que seja ruim) contrata essas consultorias para fazer as alterações.
Depois - ou em paralelo - contrata cursos com elas para ensinarem seu staf a não usar classes anêmicas.
Como é mentira que classes anêmicas são ruins sempre o staf não compreende como o novo paradigma pode ser usado
em alguma ocasião e a consultoria é chamada de novo para resolver o problema. Afinal, o staf é uma cambada de idiotas
e as consultorias que advogam a expurgação do demônio das classe anêmica são as únicas com a verdade.

Detalhe… foram essas mesmas consultorias que criaram as classes anêmicas do sistema quando o paradigma
aceitava e até favorecia isso. É assim que se ganha dinheiro com isso. Muda-se o paradigma e refaz-se tudo de novo.
E cobra-se por isso, caro… perdão… claro.

[quote=sergiotaborda]Existem mais opções que essas que considerou. Partindo agora do principio que se trata de um banco legado ( coisas que eu não parti no post anterior) vc não pode fugir do contrato que o sistema legado tem. Mas vc pode criar mediadores entre esse contrato e o contrato da sua nova aplicação.
Se o objeto original requer um raio porque é o que vai para o banco via introspecção direta do atributo ( eu tinha entendido que o FP lia o get e usada o set ) não vejo problema em criar o get/setDiametro. ( Eu tinha entendido que criar essa propriedade fazia o FP tentar ler e escrever essa propriedade no banco… se isso não acontece, não ha problema alguma)

Vc tem razão, não se pulveriza a regra, criam-se novos métodos.
[/quote]

Na verdade, eu estava falando dos dois.

Há frameworks que vão direto nos atributos.
Há frameworks que sempre usam getters e setters.
Há frameworks que não são nenhum dos dois anteriores (usam annotations, Factory Methods, ou alguma outra coisa).

Na verdade, não vejo como a propriedade virtual possa causar problemas em um framework que trabalhe com getters e setters. A menos que ele faça algumm tipo de idiotice como ligar o nome dos getters e setters aos nomes dos campos, mas supondo que não faça isso, não vejo como poderia dar problema.

Concordo.

Não. Vamos supor que o FP vá direto aos atributos. Para o FP, beleza, é como se fosse público. Mas isso não significa que eles devem ser públicos para o resto da aplicação, caso os VOs sejam reutilizados em outro ponto.

Eu não disse que ele deve ignorar, mas ele não também não deve simplesmente explodir e parar de funcionar. Deve ao menos solicitar para que o usuário corrija o valor errado.

Certo.

Excelente idéia. Porém nem o framework que trabalha com atributos e nem o que trabalha com getters e setters vão conseguir digerir isso porque o construtor sem argumentos não é público. Apenas os frameworks mais avançados vão saber lidar com isso.

É, você tem razão nestes dois pontos.

Sim.

Sim, com certeza, colocar toda a lógica é pior do que não colocar nenhuma.

Sim, ele é legítimo para transferir dados. O problema das arquiteturas anêmicas é usá-los também como entidade.

Inventar necessidades sem ter porque é uma péssima idéia em todos os casos. Não entendi o que você quis dizer com isso.

Sim, problemas simples devem ter soluções simples, problemas complexos talvez precisem de soluções complexas.

Sim, e acrescento. Os frameworks que exigem getters e setters para tudo e morrem de forma sangrenta e dolorosa se estes não forem burros como eles esperam que são também são ruins, eles forçam você a criar o falso encapsulamento de get e set para tudo.

Ok, até aqui acho que concordamos no mais importante: O modelo anêmico tem origem na persistência e fugir disso é algo trabalhoso. O que vejo que você não concorda muito é se deve-se ou não fugir dele.

ah! bom … afinal não estou louco. … :lol: :lol:

Sim. Supondo que o FP é dotado de mapeamento, isso não seria um problema.

Sim quer.
O objetivo se encapsular é encapsular sempre. Se existe um ponto onde não é encapsulado isso anula o encapsulamento como um todo. Logo, se a violação acontece no FP , ele pode acontecer em qualquer outro lugar ( uma violação a mais não é problema, o problema é a primeira violação).

Portanto, se vc está preocupado em encapsular no resto do sistema tb deveria estar no FP. Dois pesos e duas medidas não é coerente.

Mas ai que tá. O FP é um cara lá na ultima camada. ele não pode fazer isso que está pedindo. O máximo que ele pode fazer é lançar exceções que as camadas acima possam interpretar e levar à correção.

Ora ai está. Esse são ainda são escassos.

Será mesmo isso ?
Quanto a mim não. Qaundo o Fowler se queixou do anemismo era porque os objetos não tinham lógicas relativas a eles mesmos - não ao sistema. O caso clássico é o calculo da idade em que o objeto mantêm a data de nascimento mas não sabe calcular idades. Então o calculo é espalhado pelo resto do código.
Até ha quem coloque isso num objeto Utils da vida, mas isso não resolve. O ponto é deixar o calculo da idade junto com o dado que define a idade. Isso torno o seu objeto de dados menos anêmico na perspectiva do Fowler, mas continua não o tornando uma entidade.
Quando vc pensa dessa forma vc descobre rapidamente que objetos especiais tem metodos especiais e recorrentes. Conta sempre tem saldo, mas o objeto Conta não tem um método saldo(). É isso que é o problema. Logicas que dizem respeito ao proprio objeto e que levam a codigos assim:

em vez de :

Isto é muiiiito difernete de codigos que extrapolam as responsabilidades como por exemplo

Que mata o sistema por muito fluente que pareça.

Então, é bom sublinhar o que significa ser anêmico: significa não ter consigo os métodos que dizem respeito (*) a si mesmo.
Isso é muito diferente de ter qualquer método anexado a si.

(*) Que são da responsabilidade de.

O quiz dizer é que não vale a pena fazer alarde que anêmico é ruim quando “anêmico” não está bem definido. Isso so atrapalha.
dizer “Esse seu objeto não faz nada. jogue um métodos ai” é inútil Nem todos os objetos aceitam métodos especiais.

[quote]
Ok, até aqui acho que concordamos no mais importante: O modelo anêmico tem origem na persistência e fugir disso é algo trabalhoso. O que vejo que você não concorda muito é se deve-se ou não fugir dele.[/quote]

Não acho que o modelo anêmico tenha origem na persistência embora, possa , até, concordar que o framework que usa na persistencia influencia bastante o modelo de dados. Eu acho que ele tem origem em falhas de modelagem por decisões erradas
dos desenvolvedores. O banco é um espectador ( exceto quando é legado) logo a responsabilidade recai no desenvolvedor que aceitou um codigo espalhado ( codigo esparguete). O problema real é se ele teve escolha. Se ele vez um modelo anemico mas não tinah escolha não ha realmente culpa, mas se ele pode escolher e escolher errado, ai sim ele tem que ser responsabilizado por um codigo ruim.

Não vejo o TO com maus olhos já que todos os objetos de entidade , são, por construção, TO.
Eles podem até ter uma logica a mais, mas essas logicas aparecem normalmente em objetos de valor como implementações de Money. Para entidades puras ( Pedido, Cliente, etc…) os métodos especiais são mais relativos a relacionamentos, mas podem ser realmente mais espertos como Conta.getSaldo(Date.today())). Só que essa esperteza tem um outro preço que escapa da conversa dos modelos anêmicos que passa pelo design da estrutura interna desses objetos e do ambiente onde eles vivem. Vc onsegue garantir que conta.getSaldo() funciona em qualquer ponto do sistema , mesmo quando o sistema é distribuído ? Garantir isso não é fácil. E é essa dificuldade que leva à criação dos Busines Objects, porque é mais facil.

Portanto, tudo se reduz à dificuldade em implementar um modelo denso e complexo de entidades de forma e performance ótima.