[Madrid-pm] Construcción e inicialización de objetos
Victor Moral
victor en taquiones.net
Lun Abr 2 23:54:54 PDT 2007
El Lunes, 2 de Abril de 2007 16:08, DervishD escribió:
> Quería saber vuestra opinión sobre un asunto de programación
> orientada a objetos en Perl, relativo a la construcción e inicialización
> de objetos.
Un buen tema, a fe mía.
> Pero pensemos en Perl: usando "inside-out objects", que en mi
> opinión son una idea genial, separar la construcción (que sería un
> simple "bless") de la inicialización permite implementar incluso
> herencia múltiple, haciendo que el hijo haga el "bless" y luego llame
> por turnos a todos los "init" de las clases padre.
Hombre, tanto como "por turnos", será cuestión más bien que despacha hacia
arriba la inicialización y luego, con lo que vuelva, añade la suya. Que eso
daría para hablar mucho sobre el mecanismo SUPER, que tiene bastantes
carencias y no nos queda otra que vivir con él.
> Sin embargo, Conway en su libro "Object Oriented Perl" dice que
> separar por completo ambas cosas puede ser contraproducente. No recuerdo
> las frases exactas pero menciona algo de "excesiva paranoia" o algo
> así, refiriéndose a que es poco o nada necesario hacerlo.
Y estoy de acuerdo con eso. Desde el punto de vista del usuario de la clase
es más fácil acostumbrarse a que el constructor retorne el objeto
inicializado, que hacerlo en una llamada posterior e independiente. Eso sí,
creo que se debe dar la posibilidad de tener un método "init" para el caso,
aunque sea el constructor el que lo llame; cuestión de claridez en el código
y posibilidad de sobrecargar dicho método en clases derivadas.
> Yo en general opino que esta separación es útil sólo para
> implementar herencia múltiple (al menos a mí no se me ocurren más
> ventajas) y este tipo de herencia me parece muy mala idea, no da más que
> quebraderos de cabeza y al menos en mi experiencia personal, siempre que
> en un diseño ha salido herencia múltiple se ha podido cambiar por un
> diseño más sencillo y más fácil de manejar usando sólo herencia simple y
> relaciones de uso, no de gen-spec (muchas veces se usa herencia múltiple
> cuando se quiere especializar una clase y usar los servicios de otra, y
> eso yo lo considero un error). De ahí que aunque vea claros beneficios
> en el hecho de separar construcción de inicialización no me parezca una
> buena idea y personalmente no lo haga.
Interesante. ¿ No lo separas ni siquiera en la implementación ? Yo uso algo
como esto:
package MyPackage;
sub new {
my $class = shift;
my $self = {};
bless $self,$class;
return $self->init(@_);
}
sub init {
my $self = shift;
my @params = @_;
# etc.
return $self;
}
Desde el punto de vista del usuario le basta con llamar a new(), pero puede
hacerlo por separado y en cualquier momento, aunque dicho usuario (es decir
yo), no lo haga nunca. :-)
> Por supuesto no quiero empezar una flamewar sobre si la herencia
> múltiple es buena o mala, para gustos los colores, y tampoco digo que en
> el futuro no vaya a usar separación entre construcción e inicialización
El problema de la herencia múltiple es que no siempre tienes opción de
evitarla. Es más muchas veces no sabes que estás usándola a menos que leas el
código que utilizas. Sí, ya se, no usas mucho módulos de CPAN y sueles
construirte los tuyos, pero como yo sí, te digo que a veces es inevitable.
Un ejemplo de ello, y esto es una disgresión, es el módulo DBIx::Class, con
varias mejoras sobre Class::DBI, pero que utiliza Class::C3 para lidiar con
la herencia múltiple que él mismo produce. El resultado es bastante caótico y
muy difícil de utilizar como base de herencia. Acabo de hacer la prueba y he
tenido que dejarlo por imposible; Class::C3 toquetea directamente la tabla de
símbolos y la herencia "normal" de Perl deja de funcionar como esperas.
Resumiendo, creo que se debe separar la inicialización de la construcción en
el lado de implementación, pero no en el lado de uso.
Saludos
--
--------
Víctor Moral <victor en taquiones.net>
http://www.taquiones.net/victor.html
Usuario Linux nº 139246
Clave pública 0x376B5EA7 en pgp.rediris.es
------------ próxima parte ------------
Se ha borrado un mensaje que no está en formato texto plano...
Nombre : no disponible
Tipo : application/pgp-signature
Tamaño : 189 bytes
Descripción: no disponible
Url : http://mail.pm.org/pipermail/madrid-pm/attachments/20070403/ec05a571/attachment.bin
Más información sobre la lista de distribución Madrid-pm