[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