FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
TStrings como variable global
Hola a todos,
Resulta que he declarado mi variable TStrings globalmente asi:
Cuando creo el TObject con el que estoy trabajando hago esto:
El cuadro de dialogo me muestra pecfectamente los valores de AlumnoSql, hasta ahi va bien, pero cuando voy a otro procedimiento: La variable AlumnoSql esta vacia. Que estoy haciendo mal? Última edición por Jose Roman fecha: 02-09-2014 a las 23:43:39. |
#2
|
||||
|
||||
En primer lugar, estas usando una variable global. Debes limitar al maximo eso. A duras penas, para objetos tipo "Singleton", y eso que ojala ni eso.
Segundo, estas dependiendo de manejo de estado mutable, osea, AlumnoSql puede cambiar en cualquier momento por medio de quien sabe quien, asi que se requiere disciplina para saber exactamente donde y como y en que orden se opera sobre un tipo mutable en un programa. Asi que lo que te tocaria hacer es buscar en todo el codigo fuente donde y quien esta modificando esos datos, y controlar manualmente el orden de acceso. La forma mas correcta es: - No usar variables globales - Usar funciones "puras", que ante la misma entrada de datos de forma deterministica siempre sale el mismo dato, y no hay forma de interceptar a medio camino y alterar sus datos (que es lo que pasa con AlumnoSql). Ademas, que estas no dependan del estado de otras funciones y/o objetos. - Centralizar todo lo que maneje estado (osea: Acceso a base de datos, archivos, etc). - Si manipulas una estructura mutable (que en Delphi es casi todo ) encapsular en una clase para que sepas exactamente como y quien y cuando se hacen las cosas. O dicho muy sencillo: El manejo de estado debería ser LOCAL a la clase/objeto (no hay como accederlo por fuera, no hay forma de hacer MiObjeto.MiDato ni parecido). Cuando un objeto se comunica con otro, en vez de pasar punteros/referencias/datos mutables se debería pasar una COPIA de los datos. Osea, se debe poder asegurar que si Pepito le pasa a Juanito una billetera con 10000 dólares, Juanito VERDADERAMENTE tiene los 10000 dólares, no que Pepito puede cambiar 10000 por 0 y luego Juanito se pregunte: Porque desapareció mi plata magicamente? Que en tu caso en concreto: AlumnoSql no debe ser ni una propiedad, ni variable ni externa ni interna, siempre que se requiere asignar un sql al dataset una funcion lo regenera siempre:
Y mucho mejor:
Lo que lo convertiria en una funcion testeable.
__________________
El malabarista. |
#3
|
|||
|
|||
Gracias mamcx, a corregir lo que estoy haciendo, de nuevo gracias por mostrarme el camino.
|
#4
|
||||
|
||||
Vamos a examinar paso a paso lo que sucede.
Quizá lo que pensabas era algo más de este estilo:
En este caso, sí tendrías una copia del objeto. De todas formas, como dice mamcx, es mala idea tener una variable global así. Aunque no estoy muy seguro de concordar con él en eso de construir la sentencia SQL cada vez. // Saludos |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Como asignar un valor a una variable global desde un componente | paquechu | Varios | 6 | 15-01-2014 21:10:18 |
variable tStrings | Carliviris | Varios | 4 | 03-01-2007 19:01:05 |
Variable global | jluisx | OOP | 3 | 27-10-2005 22:31:22 |
Variable global (De novatisimo) | RyAr | Varios | 5 | 08-07-2004 15:48:44 |
variable global existe en php ? | sarga | PHP | 1 | 27-06-2004 17:47:07 |
|