MVC, OO e herança múltipla

Eu vi esse esse artigo um tempo atrás. O autor afirma que a separação da apresentação do modelo (como no MVC) é contra os princípios de orientação a objeto. A justificativa é que para os objetos da View saberem mostrar o conteúdo de um objeto eles precisam, de alguma forma, ter acesso aos internals do objeto - violando o encapsulamento. Note que declarar os fields private e criar uma porção de get/set não altera o fato que a implementação está ‘vazando’. O autor (Allen Holub) sugere que os objetos tenham a capacidade de se exibir sozinhos.

Quando eu li na primeira vez eu pensei “Tá, violamos um pouco o encapsulamento - e daí? Encapsulamento é uma diretriz, não um axioma irrevogável. A separação View/Model é uma decisão de projeto como qualquer outra”.

Eu estou postando esse tópico agora porque me ocorreu um negócio (e porque é sexta-feira e eu não tenho nada melhor para fazer :? ). Se pudéssemos usar herança múltipla, a View poderia ter acesso às private parts do modelo, sem obrigar este a se expor públicamente. O acoplamento formalmente seria um pouco maior do que é sem o relacionamento pai/filho entre o modelo e a view. Mas na prática a View já é muito depentente do modelo. O sistema todo ficaria um pouco mais elegante. Por outro lado, herança múltipla é um abacaxi e, além da elegância, não se ganharia muito.

O que vocês acham?

Ick. Nao precisa meter heranca ou hierarquia de classes no meio do rolo pra fazer isso… a coisa toda ja funciona muito bem com delegacao e visitors hoje em dia :wink:

Não entendi bem como o Visitor entra na história. Mas achei a falha no meu raciocínio. A idéia é representar melhor o acoplamento natural entre View e Model para evitar que o Model precisasse expor tantos detalhes de implementeção. A solução do Allen Holub para esse “problema” é que os objetos do modelo soubessem se exibir sozinhos. Obviamente isso acarreta uma dificuldade muito grande em fazer várias views para um mesmo modelo.

Eu pensei que se usasse herança múltipla (View filha de Model e da Superview) essa dificuldade não apareceria. Mas é óbvio que o problema ainda existe - um programa rodando com duas views diferentes para o mesmo Model seria tão ou mais difícil de fazer do que com a solução do Holub.

Na verdade eu não vejo nenhum grande problema em estruturar as aplicações do jeito tradicional. Só acho legal considerar alternativas às vezes. E essa minha alternativa de agora está claramente falha…