[Cascavel-pm] O código mais bizonho q ue eu já fiz na minha vida (v. 2 .0)

Luis Campos de Carvalho lechamps em terra.com.br
Quinta Junho 17 12:30:07 CDT 2004


Flavio S. Glock wrote:
> Luis, você tem razão sobre isso. 
> 
> O que eu queria saber é o que você acharia de ter um módulo 
> Classe::B::Plugin que altera o funcionamento da Classe::B -
> Esta não é uma solução meio "suja" do ponto de vista de OO ?

   Bom, para os que não sabem, eu me considero radical xiita no tangente 
à filosofia OO.

   Não considero "suja" a solução de ter plugins. Ela não altera o 
funcionamento da Classe::B. A Classe::B continua obedencendo exatamente 
ao mesmo padrão de projeto estabelecido inicialmente. Ela é um 
"Dispatcher" (alguém bom de padrões me corrija o nome desta coisa, por 
favor), que simplesmente delega o comportamento a uma implementação 
específica. No exemplo, para Classe::B::Plugin.

   Vejamos: Classe::B não precisa saber o que Classe::B::Plugin faz, ou 
como responde às mensagens passadas -- Encapsulamento: OK; Classe::B não 
se incomoda com a troca de Classe::B::Plugin para Classe::C::Plugin, ou 
qualquer outro objeto que respeite a interface estabelecida -- 
Polimorfismo: OK; Classe::B não se importa em falar com um descendente 
de Classe::B::Plugin: Herança OK.

   Me parece uma solução filosoficamente muito mais interessante do que 
permitir a um objeto (ou classe) alterar dinamicamente um outro objeto.

> Por exemplo, como você faria para acrescentar código a 
> um método já existente na Classe::B ? Quando você 
> redefine um método, a versão anterior é perdida (você tem
> que reescrever tudo de novo), e ainda por cima você ganha uns warnings.

   Claro, isso depende muito do que o método original faz. Vamos usar 
seu exemplo de hierarquia anterior, e vamos tentar fazer de acordo com a 
filosofia OO:
   Para reescrever um método, você pode acrescentar uma chamada para 
__SUPER__->method(), e ter certeza de que o método original é chamado 
(antes ou depois de você realizar seu procedimento extra).

   Caso você precise alterar o comportamento, eu tenho certeza de que o 
correto é __mesmo__ reescrever o método. Isso quer dizer que o problema 
é com a concepção filosófica do OO ser incompatível com a concepção 
filosófica do Perl (lazyness, rubishness, impatience)

> Me parece que tanto o programa do Daniel Ruoso, como o
> Class::ClassDecorator
> tentam resolver este problema de como modificar uma herança que já 
> foi estabelecida.
> 

   E eu não disse que não são boas tentativas. Eu disse que eu as 
considero tentativas perigosas, por violarem o encapsulamento (quem 
garante que o método que você deseja alterar está mesmo lá?).

   Estou achando isso interessante...
   Putamplexos!
-- 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
   Luis Campos de Carvalho is BSc in Comp Science,
   PerlMonk [SiteDocClan], Cascavel-pm Moderator,
   Unix Sys Admin && Certified Oracle DBA
   http://br.geocities.com/monsieur_champs/
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=




Mais detalhes sobre a lista de discussão Cascavel-pm