Hola,
Aunque esto no es cosa de Xailer, me he encontrado con un problema
particular que no se si es el comportamiento correcto cuando se clonan
objetos.
El caso es que cuando hacemos clon := __objClone( objeto ) se clona el
objeto completo, pero si hay un objeto dentro del objeto clonado, no se
clona y al hacer cambios en las datas las modifica también en el objeto
original. ¿Esto es correcto?
Dejo un ejemplo en Xailer 2.0.18.
Saludos
Alf+.
--
In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.
Clonar objetos. ¿Es el comportamiento correcto?
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Clonar objetos. ¿Es el comportamiento correcto?
No se si lo que hace __objClone() es el comportamiento correcto, pero he
dado con la solución implementando un método clone() en las clases.
La solución quedaría así:
CLASS Objeto1
DATA dato1
DATA dato2
DATA objeto
METHOD new() CONSTRUCTOR
METHOD clone()
ENDCLASS
METHOD new() CLASS Objeto1
::dato1 := "Dato 1 del Objeto 1"
::dato2 := "Dato 2 del Objeto 1"
::objeto := objeto2():new()
RETURN self
METHOD clone() CLASS Objeto1
local o
o := __objClone( self )
o:objeto := ::objeto:clone()
RETURN o
//-----------------------------------------------------
CLASS Objeto2
DATA dato1
DATA dato2
METHOD new() CONSTRUCTOR
METHOD clone()
ENDCLASS
METHOD new() CLASS Objeto2
::dato1 := "Dato 1 objeto 2"
::dato2 := "Dato 2 objeto 2"
RETURN self
METHOD clone() CLASS Objeto2
local o
o := __objClone( self )
RETURN o
Saludos,
Alf+.
El 21/07/2012 21:50, José Alfonso Suárez Moreno escribió:
> Hola,
>
> Aunque esto no es cosa de Xailer, me he encontrado con un problema
> particular que no se si es el comportamiento correcto cuando se clonan
> objetos.
>
> El caso es que cuando hacemos clon := __objClone( objeto ) se clona el
> objeto completo, pero si hay un objeto dentro del objeto clonado, no se
> clona y al hacer cambios en las datas las modifica también en el objeto
> original. ¿Esto es correcto?
>
> Dejo un ejemplo en Xailer 2.0.18.
>
> Saludos
>
> Alf+.
dado con la solución implementando un método clone() en las clases.
La solución quedaría así:
CLASS Objeto1
DATA dato1
DATA dato2
DATA objeto
METHOD new() CONSTRUCTOR
METHOD clone()
ENDCLASS
METHOD new() CLASS Objeto1
::dato1 := "Dato 1 del Objeto 1"
::dato2 := "Dato 2 del Objeto 1"
::objeto := objeto2():new()
RETURN self
METHOD clone() CLASS Objeto1
local o
o := __objClone( self )
o:objeto := ::objeto:clone()
RETURN o
//-----------------------------------------------------
CLASS Objeto2
DATA dato1
DATA dato2
METHOD new() CONSTRUCTOR
METHOD clone()
ENDCLASS
METHOD new() CLASS Objeto2
::dato1 := "Dato 1 objeto 2"
::dato2 := "Dato 2 objeto 2"
RETURN self
METHOD clone() CLASS Objeto2
local o
o := __objClone( self )
RETURN o
Saludos,
Alf+.
El 21/07/2012 21:50, José Alfonso Suárez Moreno escribió:
> Hola,
>
> Aunque esto no es cosa de Xailer, me he encontrado con un problema
> particular que no se si es el comportamiento correcto cuando se clonan
> objetos.
>
> El caso es que cuando hacemos clon := __objClone( objeto ) se clona el
> objeto completo, pero si hay un objeto dentro del objeto clonado, no se
> clona y al hacer cambios en las datas las modifica también en el objeto
> original. ¿Esto es correcto?
>
> Dejo un ejemplo en Xailer 2.0.18.
>
> Saludos
>
> Alf+.
- Carlos Ortiz
- Mensajes: 872
- Registrado: Mié Jul 01, 2009 5:44 pm
- Ubicación: Argentina - Córdoba
- Contactar:
Clonar objetos. ¿Es el comportamiento correcto?
Gracias José, viene bién tu aporte.
Saludo.
Saludo.
@dbfarma
www.dbfarma.com.ar
www.dbfarma.com.ar
-
- Mensajes: 88
- Registrado: Vie Jul 28, 2006 9:36 am
Clonar objetos. ¿Es el comportamiento correcto?
> No se si lo que hace __objClone() es el comportamiento correcto, pero he
> dado con la solución implementando un método clone() en las clases.
Me parece que esa es la solución ideal. No hay un 'comportamiento
correcto' de __objClone() porque probablemente lo que dice si es
correcto sería la semántica de la clase, y el contexto.
En el ejemplo que pones hay una data 'dato1'. ¿Que pasaría si dato1
fuese, por ejemplo, un handle de archivo? O más complejo aún, un handle
de windows. ¿Debe la clase clonar tambien esos objetos?
Y si la clase es una factura, con un oCliente, al clonar la factura no
debería clonar el cliente... ¿o sí?
Por eso le veo pinta de que es la propia clase la responsable de
implementar el comportamiento de lo que se considera un clone. Tengo una
clase que me hace de buffer de los registros de una dbf. Tiene un método
read que levanta los valores de los campos y guarda el recno() para
despues poder guardarlos. Y tiene un método clone(), que copia el buffer
interno (un array), poniendo a 0 el recno, ya que es un registro diferente.
Saludos
> dado con la solución implementando un método clone() en las clases.
Me parece que esa es la solución ideal. No hay un 'comportamiento
correcto' de __objClone() porque probablemente lo que dice si es
correcto sería la semántica de la clase, y el contexto.
En el ejemplo que pones hay una data 'dato1'. ¿Que pasaría si dato1
fuese, por ejemplo, un handle de archivo? O más complejo aún, un handle
de windows. ¿Debe la clase clonar tambien esos objetos?
Y si la clase es una factura, con un oCliente, al clonar la factura no
debería clonar el cliente... ¿o sí?
Por eso le veo pinta de que es la propia clase la responsable de
implementar el comportamiento de lo que se considera un clone. Tengo una
clase que me hace de buffer de los registros de una dbf. Tiene un método
read que levanta los valores de los campos y guarda el recno() para
despues poder guardarlos. Y tiene un método clone(), que copia el buffer
interno (un array), poniendo a 0 el recno, ya que es un registro diferente.
Saludos
-
- Mensajes: 420
- Registrado: Sab Ago 16, 2008 9:06 pm
Clonar objetos. ¿Es el comportamiento correcto?
Hola Carlos,
Totalmente de acuerdo contigo en lo que dices. Debe ser responsabilidad
del programador decidir que cosas deben clonarse al clonar un objeto.
Saludos
Alf+.
El 25/07/2012 10:38, Carlos Mora escribió:
>> No se si lo que hace __objClone() es el comportamiento correcto, pero he
>> dado con la solución implementando un método clone() en las clases.
>
> Me parece que esa es la solución ideal. No hay un 'comportamiento
> correcto' de __objClone() porque probablemente lo que dice si es
> correcto sería la semántica de la clase, y el contexto.
> En el ejemplo que pones hay una data 'dato1'. ¿Que pasaría si dato1
> fuese, por ejemplo, un handle de archivo? O más complejo aún, un handle
> de windows. ¿Debe la clase clonar tambien esos objetos?
> Y si la clase es una factura, con un oCliente, al clonar la factura no
> debería clonar el cliente... ¿o sí?
> Por eso le veo pinta de que es la propia clase la responsable de
> implementar el comportamiento de lo que se considera un clone. Tengo una
> clase que me hace de buffer de los registros de una dbf. Tiene un método
> read que levanta los valores de los campos y guarda el recno() para
> despues poder guardarlos. Y tiene un método clone(), que copia el buffer
> interno (un array), poniendo a 0 el recno, ya que es un registro diferente.
>
> Saludos
>
>
Totalmente de acuerdo contigo en lo que dices. Debe ser responsabilidad
del programador decidir que cosas deben clonarse al clonar un objeto.
Saludos
Alf+.
El 25/07/2012 10:38, Carlos Mora escribió:
>> No se si lo que hace __objClone() es el comportamiento correcto, pero he
>> dado con la solución implementando un método clone() en las clases.
>
> Me parece que esa es la solución ideal. No hay un 'comportamiento
> correcto' de __objClone() porque probablemente lo que dice si es
> correcto sería la semántica de la clase, y el contexto.
> En el ejemplo que pones hay una data 'dato1'. ¿Que pasaría si dato1
> fuese, por ejemplo, un handle de archivo? O más complejo aún, un handle
> de windows. ¿Debe la clase clonar tambien esos objetos?
> Y si la clase es una factura, con un oCliente, al clonar la factura no
> debería clonar el cliente... ¿o sí?
> Por eso le veo pinta de que es la propia clase la responsable de
> implementar el comportamiento de lo que se considera un clone. Tengo una
> clase que me hace de buffer de los registros de una dbf. Tiene un método
> read que levanta los valores de los campos y guarda el recno() para
> despues poder guardarlos. Y tiene un método clone(), que copia el buffer
> interno (un array), poniendo a 0 el recno, ya que es un registro diferente.
>
> Saludos
>
>
Clonar objetos. ¿Es el comportamiento correcto?
Bueno lo ideal en POO sería tener una interface TCloneable cuyo método
más importante y de obligada implementación sería ::Clone() para usarlo así:
oObjClon := obj:clone()
Pero si se quiere hacer a nivel de función se podría crear una que fuera
recursiva y además que sepa tratar array y objetos para automatizar el
proceso.
oObjClon := XClone( obj )
El 25/07/2012 11:13, José Alfonso Suárez Moreno escribió:
> Hola Carlos,
>
> Totalmente de acuerdo contigo en lo que dices. Debe ser responsabilidad
> del programador decidir que cosas deben clonarse al clonar un objeto.
>
> Saludos
>
> Alf+.
>
> El 25/07/2012 10:38, Carlos Mora escribió:
>>> No se si lo que hace __objClone() es el comportamiento correcto, pero he
>>> dado con la solución implementando un método clone() en las clases.
>>
>> Me parece que esa es la solución ideal. No hay un 'comportamiento
>> correcto' de __objClone() porque probablemente lo que dice si es
>> correcto sería la semántica de la clase, y el contexto.
>> En el ejemplo que pones hay una data 'dato1'. ¿Que pasaría si dato1
>> fuese, por ejemplo, un handle de archivo? O más complejo aún, un handle
>> de windows. ¿Debe la clase clonar tambien esos objetos?
>> Y si la clase es una factura, con un oCliente, al clonar la factura no
>> debería clonar el cliente... ¿o sí?
>> Por eso le veo pinta de que es la propia clase la responsable de
>> implementar el comportamiento de lo que se considera un clone. Tengo una
>> clase que me hace de buffer de los registros de una dbf. Tiene un método
>> read que levanta los valores de los campos y guarda el recno() para
>> despues poder guardarlos. Y tiene un método clone(), que copia el buffer
>> interno (un array), poniendo a 0 el recno, ya que es un registro
>> diferente.
>>
>> Saludos
>>
>>
>
más importante y de obligada implementación sería ::Clone() para usarlo así:
oObjClon := obj:clone()
Pero si se quiere hacer a nivel de función se podría crear una que fuera
recursiva y además que sepa tratar array y objetos para automatizar el
proceso.
oObjClon := XClone( obj )
El 25/07/2012 11:13, José Alfonso Suárez Moreno escribió:
> Hola Carlos,
>
> Totalmente de acuerdo contigo en lo que dices. Debe ser responsabilidad
> del programador decidir que cosas deben clonarse al clonar un objeto.
>
> Saludos
>
> Alf+.
>
> El 25/07/2012 10:38, Carlos Mora escribió:
>>> No se si lo que hace __objClone() es el comportamiento correcto, pero he
>>> dado con la solución implementando un método clone() en las clases.
>>
>> Me parece que esa es la solución ideal. No hay un 'comportamiento
>> correcto' de __objClone() porque probablemente lo que dice si es
>> correcto sería la semántica de la clase, y el contexto.
>> En el ejemplo que pones hay una data 'dato1'. ¿Que pasaría si dato1
>> fuese, por ejemplo, un handle de archivo? O más complejo aún, un handle
>> de windows. ¿Debe la clase clonar tambien esos objetos?
>> Y si la clase es una factura, con un oCliente, al clonar la factura no
>> debería clonar el cliente... ¿o sí?
>> Por eso le veo pinta de que es la propia clase la responsable de
>> implementar el comportamiento de lo que se considera un clone. Tengo una
>> clase que me hace de buffer de los registros de una dbf. Tiene un método
>> read que levanta los valores de los campos y guarda el recno() para
>> despues poder guardarlos. Y tiene un método clone(), que copia el buffer
>> interno (un array), poniendo a 0 el recno, ya que es un registro
>> diferente.
>>
>> Saludos
>>
>>
>
Clonar objetos. ¿Es el comportamiento correcto?
Buenos quizás sería interesante como hace Python;
o := oBjeto.Clone(), clona los atributos, pero las referencias a los
objetos se comparten, tal y como hace Harbour.
o := oBjeto.DeepClone(), hace una clonacion de todos los objetos.
De esta manera, el programador no tiene que hacer ninguna historia rara
ni implementar nada, usa lo que más le conviene.
Saludos
Rafa Carmona
El 26/07/2012 0:45, Manu escribió:
> Bueno lo ideal en POO sería tener una interface TCloneable cuyo método
> más importante y de obligada implementación sería ::Clone() para usarlo
> así:
> oObjClon := obj:clone()
>
> Pero si se quiere hacer a nivel de función se podría crear una que fuera
> recursiva y además que sepa tratar array y objetos para automatizar el
> proceso.
> oObjClon := XClone( obj )
>
> El 25/07/2012 11:13, José Alfonso Suárez Moreno escribió:
>> Hola Carlos,
>>
>> Totalmente de acuerdo contigo en lo que dices. Debe ser responsabilidad
>> del programador decidir que cosas deben clonarse al clonar un objeto.
>>
>> Saludos
>>
>> Alf+.
>>
>> El 25/07/2012 10:38, Carlos Mora escribió:
>>>> No se si lo que hace __objClone() es el comportamiento correcto,
>>>> pero he
>>>> dado con la solución implementando un método clone() en las clases.
>>>
>>> Me parece que esa es la solución ideal. No hay un 'comportamiento
>>> correcto' de __objClone() porque probablemente lo que dice si es
>>> correcto sería la semántica de la clase, y el contexto.
>>> En el ejemplo que pones hay una data 'dato1'. ¿Que pasaría si dato1
>>> fuese, por ejemplo, un handle de archivo? O más complejo aún, un handle
>>> de windows. ¿Debe la clase clonar tambien esos objetos?
>>> Y si la clase es una factura, con un oCliente, al clonar la factura no
>>> debería clonar el cliente... ¿o sí?
>>> Por eso le veo pinta de que es la propia clase la responsable de
>>> implementar el comportamiento de lo que se considera un clone. Tengo una
>>> clase que me hace de buffer de los registros de una dbf. Tiene un método
>>> read que levanta los valores de los campos y guarda el recno() para
>>> despues poder guardarlos. Y tiene un método clone(), que copia el buffer
>>> interno (un array), poniendo a 0 el recno, ya que es un registro
>>> diferente.
>>>
>>> Saludos
>>>
>>>
>>
>
o := oBjeto.Clone(), clona los atributos, pero las referencias a los
objetos se comparten, tal y como hace Harbour.
o := oBjeto.DeepClone(), hace una clonacion de todos los objetos.
De esta manera, el programador no tiene que hacer ninguna historia rara
ni implementar nada, usa lo que más le conviene.
Saludos
Rafa Carmona
El 26/07/2012 0:45, Manu escribió:
> Bueno lo ideal en POO sería tener una interface TCloneable cuyo método
> más importante y de obligada implementación sería ::Clone() para usarlo
> así:
> oObjClon := obj:clone()
>
> Pero si se quiere hacer a nivel de función se podría crear una que fuera
> recursiva y además que sepa tratar array y objetos para automatizar el
> proceso.
> oObjClon := XClone( obj )
>
> El 25/07/2012 11:13, José Alfonso Suárez Moreno escribió:
>> Hola Carlos,
>>
>> Totalmente de acuerdo contigo en lo que dices. Debe ser responsabilidad
>> del programador decidir que cosas deben clonarse al clonar un objeto.
>>
>> Saludos
>>
>> Alf+.
>>
>> El 25/07/2012 10:38, Carlos Mora escribió:
>>>> No se si lo que hace __objClone() es el comportamiento correcto,
>>>> pero he
>>>> dado con la solución implementando un método clone() en las clases.
>>>
>>> Me parece que esa es la solución ideal. No hay un 'comportamiento
>>> correcto' de __objClone() porque probablemente lo que dice si es
>>> correcto sería la semántica de la clase, y el contexto.
>>> En el ejemplo que pones hay una data 'dato1'. ¿Que pasaría si dato1
>>> fuese, por ejemplo, un handle de archivo? O más complejo aún, un handle
>>> de windows. ¿Debe la clase clonar tambien esos objetos?
>>> Y si la clase es una factura, con un oCliente, al clonar la factura no
>>> debería clonar el cliente... ¿o sí?
>>> Por eso le veo pinta de que es la propia clase la responsable de
>>> implementar el comportamiento de lo que se considera un clone. Tengo una
>>> clase que me hace de buffer de los registros de una dbf. Tiene un método
>>> read que levanta los valores de los campos y guarda el recno() para
>>> despues poder guardarlos. Y tiene un método clone(), que copia el buffer
>>> interno (un array), poniendo a 0 el recno, ya que es un registro
>>> diferente.
>>>
>>> Saludos
>>>
>>>
>>
>