Detached locals y clases dinamicas
Posted: Tue Jan 21, 2020 3:15 pm
andresreyes_mzt wrote:Difiero un poco de esta optimizacion ...FiveWiDi wrote: //----------------------------------------------------------------------------//
// Se define el MESSAGE de una columna para tomar y dar valores.
static function GenDataField( oADODb, nPos )
Local cNameMethod := oADODb:aFldNames[ nPos ]
//#ifdef __HARBOUR__
local nClassH := oADODb:ClassH
__clsAddMsg( nClassH, cNameMethod, ;
{ | oADODb | oADODb:_FieldGet( nPos ) }, HB_OO_MSG_INLINE )
__clsAddMsg( nClassH, "_" + cNameMethod, ;
{ | oADODb, Val | oADODb:_FieldPut( nPos, Val ) }, HB_OO_MSG_INLINE )
//#else
/* Aquí de momento nada de nada. */
//#endif
return( cNameMethod )
//----------------------------------------------------------------------------//
//----------------------------------------------------------------------------//
/* ******************************* */
Estas funciones lo que hacen es crear un MESSAGE para cada columna con el nombre de ésta.
Esto permite que cuando se realiza:
cDomiciliocliente := oADODb:domicilio (por ejemplo)
se esté invocando al MESSAGE DOMICILIO que ahora existirá realmente, y por tanto la gestión de errores no se utilizará.
En consecuencia se optimiza la ejecución del código.
Espero que funcione, yo no lo he probado.
Si es así podrás eliminar "ERROR HANDLER OnError( )" y el METHOD OnError().
Efectivamente si debe de ser mas rapida ...
Pero Solo sirve si vas a utilizar un solo Objeto de esa clase ya que si lo que deseas, es usar diversos objetos al mismo tiempo, _ no deberian ser iguales a los de otro objeto, ya que el acceso seria al campo del ultimo objeto creado y no al que probablemente quieras tener acceso (ya sea cualquier objeto creado anteriormente)...
Esta es una mala practica de la Utilizacion de Clases ...
Saludos,
Andres Reyes
A propósito de un error que tengo en una dynamic class y a propósito de ese mensaje de Andrés Reyes, con el cual no coincido porque existe el concepto detached local.
Ejemplo de detached local funcionando es:
Code: Select all
a:= {}
for i:= 1 to 10
Aadd(a, Block(i))
next
for i:= 1 to 10
? Eval(a[I]) // muestra 1..10
next
function Block(i)
return {|| Str(i) }
Concretamente, mi dynamic class falla en lo que comenta Andres Reyes, pero no creo que sea por lo que él dice.
¿ Qué opinais vosotros sobre esto ?