Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 21-07-2011
linuxtin linuxtin is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 30
Poder: 0
linuxtin Va por buen camino
Evitar variables globales....

Holaa!! Como andan!!! La duda que tengo es la siguiente, tengo un form llamado login, en este form lo que hago es identificar y autenticar al usuario, una vez que los datos son correctos guardo por medio de una consulta sql el ID del empleado, la fecha de ingreso, etc.

Hasta ahí todo bien, después lo que hago es guardar en una variable global el ID_Cliente, y hago el form invisible. Esto lo hago porque durante la ejecución del programa uso el ID_Cliente que se logueo para otros usos, como por ejemplo cuando carga algún dato, o modifica guardo el ID_Empleado que lo hizo, ademas de darle los permisos en fin...

No habrá otra manera de hacer esto para evitar la variable global??

Desde ya muchas gracias!!!
Responder Con Cita
  #2  
Antiguo 21-07-2011
Avatar de oscarac
[oscarac] oscarac is offline
Miembro Premium
 
Registrado: sep 2006
Ubicación: Lima - Perú
Posts: 2.010
Poder: 20
oscarac Va por buen camino
yo hago algo similar
pero la variable no la asigno en el form del login sino mas bien en el DataModule

y cuando quiero hacer referencia a la variable hago mas o menos asi

Código Delphi [-]
 
tblloqueseaUsuario.asstring := dmGlobal.g_Usuario;
__________________
Dulce Regalo que Satanas manda para mi.....
Responder Con Cita
  #3  
Antiguo 21-07-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por linuxtin Ver Mensaje
No habrá otra manera de hacer esto para evitar la variable global??
Puedes guardarlo en alguna tabla, por ejemplo.
Responder Con Cita
  #4  
Antiguo 21-07-2011
linuxtin linuxtin is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 30
Poder: 0
linuxtin Va por buen camino
Cita:
Empezado por linuxtin Ver Mensaje
Holaa!! Como andan!!! La duda que tengo es la siguiente, tengo un form llamado login, en este form lo que hago es identificar y autenticar al usuario, una vez que los datos son correctos guardo por medio de una consulta sql el ID del empleado, la fecha de ingreso, etc.

Hasta ahí todo bien, después lo que hago es guardar en una variable global el ID_Cliente, y hago el form invisible. Esto lo hago porque durante la ejecución del programa uso el ID_Cliente que se logueo para otros usos, como por ejemplo cuando carga algún dato, o modifica guardo el ID_Empleado que lo hizo, ademas de darle los permisos en fin...

No habrá otra manera de hacer esto para evitar la variable global??

Desde ya muchas gracias!!!
Muchachos me equivoque donde dice ID_Cliente es ID_Empleado.

Gracias a los dos por responder, oscarac porque un datamodule y no una unidad?

Casimiro el ID_Empleado lo guardo en la tabla del login, pero de todas formas me tengo que quedar con la variable del ID_Empleado hasta que este cierra sesión. Se entiende??

Desde ya muchas gracias!
Responder Con Cita
  #5  
Antiguo 21-07-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Si te hace falta en todo momento y en cualquier sitio del programa entonces lo mejor es esa variable global

Me refería a guardarlo en una tabla para cuando te hiciera falta, para hacer algo así como:
Código SQL [-]
select id_empleado from tbConectado
Así, sin más, una tabla con un sólo registro, el empleado conectado.
Aunque así estás limitando tu programa a monousuario.
Lo dicho, sigue con la variable global, a veces hay que usarlas.
Responder Con Cita
  #6  
Antiguo 21-07-2011
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 19
Chris Va por buen camino
Cita:
Empezado por linuxtin Ver Mensaje
... después lo que hago es guardar en una variable global el ID_Cliente, y hago el form invisible. Esto lo hago porque durante la ejecución del programa uso el ID_Cliente que se logueo para otros usos, como por ejemplo cuando carga algún dato, o modifica guardo el ID_Empleado que lo hizo, ademas de darle los permisos en fin...

No habrá otra manera de hacer esto para evitar la variable global??

Desde ya muchas gracias!!!
De hecho estás mal implementando la idea de variables globales. En tu caso es lo que necesitarías. Supongo que lo que tú realmente quieres evitar es utilizar la variable del formulario. De hecho es lo mejor, porque así podrías liberar la memoria utilizada por el formulario de inicio una vez que el usuario ha iniciado sesión.

Supongo que tu código debe ser algo cómo esto:
Código Delphi [-]
type
    TFormularioInicio = class(TForm)
    public
        id_empleado: Integer;
    ....
Esto hace que la variable id_empleado dependa de una instancia de TFormularioInicio. Lo que debes hacer para evitar esta dependencia es sacar la mencionada variable de la declaración de TFormularioInicio. Mueve la variable id_empleado a la sección de variables globales mantenidas por la unidad. Por ejemplo:

Código Delphi [-]
unit inicio_sesion

interface
    uses ...
    
type
    TFormularioInicio = class(TForm)
    ....
    end;
    
var
    FormularioInicio: TFormularioInicio
    id_empleado: Integer; // <= nuevo lugar de la variable
                          // (será global y no dependerá de una
                          //  instancia de TFormularioInicio).
                          
implementation
    ....

Espero que esto sea lo que realmente necesitas y que también hallas entendido lo que he querido decir.

Saludos,
Chris
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
  #7  
Antiguo 21-07-2011
linuxtin linuxtin is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 30
Poder: 0
linuxtin Va por buen camino
Gracias Chris! Se entendió lo que explicaste, por lo que veo no queda otra que usar variable global. Es que siempre leí que hay que tener cuidado con estas variables, que no es una buena técnica usar estas variables pero en algunos casos veo que no queda otra opción!!

Saludos y gracias a todos!!
Responder Con Cita
  #8  
Antiguo 22-07-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Hola,
linuxtin no es que hay que evitar usarlas. Habrá momentos en que se requiere de un contexto global y en otras ocasiones que es viable el local.

Todo tiene sus pros y contras, y su campo de uso.

Esto del no usar variables globales se ha convertido en un mito... tan arraigado que uno se cree que es peligrosísimo, un terrible pecado. Y luego van los profes promoviendo eso, y luego estos estudiantes al ocupar el lugar de profes, vuelven a vender el mismo pensamiento.

¡Las variables globales no son malas! Lo que es malo es el mal uso (y/o abuso) de ellas... en todo caso la culpa es de quien programa que no lleva los controles adecuados, porque si lo hiciera y fuera ordenado no hay problema alguno de usarlas. Pero claro es más fácil decir ¡no las uses!

Es justo el mismo problema y estigma que carga el concepto del Acoplamiento. Muchos lo han victimado y culpado de todos los mil y un males... El acoplamiento es inevitable, siempre habrá algo (como siempre habrá alguna variable global, sino me crees busca por Application ). Lo que hay que hacer, en todo caso, es controlarlo y equilibrarlo junto al concepto de Cohesión... en las variables globales es lo mismo: controlar y equilibrar su uso.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #9  
Antiguo 22-07-2011
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is online now
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.268
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Pues como ya te han comentado NO SIEMPRE HAY QUE EVITAR LAS VARIABLES GLOBALES. Cuando son necesarias hay que usarlas (como en este caso). Con la puntualización que ha hecho Chris, de que realmene sea global y no ligada al formulario

En mi caso, para esto (y algunas cosas similares) me creo una clase de configuración que almacena todos esos datos genéricos (que deben ser accesibles por toda la aplicación en cualquier momento). Pero sigue siendo lo mismo.

Tengo una instancia de la clase TGConfig que es global y dentro de esa clase TGConfig una serie de datos "globales".
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #10  
Antiguo 22-07-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Yo uso una nomenclatura "propia" derivada de la notación húngara de Charles Simonyi, por ejemplo, para las constantes uso este tipo de nomenclatura:

Código Delphi [-]
const
  _CONFIGINI_  : string = 'config.ini';
  _RUTA_BD_    : string = '\BasesDatos\';
Y para las variables globales, similar, pero en minúsculas:

Código Delphi [-]
public
  _iCodEmpresa_   : integer;
  _dFechaTrabajo_ : TDateTime;


De esa manera siempre tengo controlado cada cosa.
Responder Con Cita
  #11  
Antiguo 22-07-2011
linuxtin linuxtin is offline
Miembro
NULL
 
Registrado: jun 2011
Posts: 30
Poder: 0
linuxtin Va por buen camino
Gracias a todos por sus opiniones!!

Delphius toco el tema de acoplamiento y cohesión,como hacen ustedes para lograr una alta cohesión y un bajo acoplamiento en delphi? Como puedo guiarme para saber cuando tengo que descomponer una unidad en varias?

Saludos!
Responder Con Cita
  #12  
Antiguo 22-07-2011
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Cita:
Empezado por Casimiro Notevi Ver Mensaje
Yo uso una nomenclatura "propia" derivada de la notación húngara de Charles Simonyi, por ejemplo, para las constantes uso este tipo de nomenclatura:

Código Delphi [-]const _CONFIGINI_ : string = 'config.ini'; _RUTA_BD_ : string = '\BasesDatos\';

Y para las variables globales, similar, pero en minúsculas:

Código Delphi [-]public _iCodEmpresa_ : integer; _dFechaTrabajo_ : TDateTime;



De esa manera siempre tengo controlado cada cosa.
¿A cuál publicación de Simonyi te refieres amigo? ¿A la original, o la que terminó publicando Microsoft? Esto te lo pregunto justamente por lo que he leído en este artículo.
Una mala interpretación de las palabras de Charles terminó en lo que se conoció como Notación Húngara que promovió Microsoft.

Cita:
Empezado por linuxtin Ver Mensaje
Gracias a todos por sus opiniones!!

Delphius toco el tema de acoplamiento y cohesión,como hacen ustedes para lograr una alta cohesión y un bajo acoplamiento en delphi? Como puedo guiarme para saber cuando tengo que descomponer una unidad en varias?

Saludos!
No hay una receta mágica para eso. Es cosa de análisis, y hay tantas maneras de evaluarlo como personas. Cada quien tendrá su forma de verlo, y sabes ¡puede que todos tengan razón!

Mientras te sientas cómodo con tu diseño, no deberías preocuparte. Es en cuanto dudas en donde debes preocuparte.
Si tu estás siguiendo un proceso basado o apoyado en métricas quizá podrías proponer alguna que represente cualitivamente un aproximado de cuanto acomplamiento y cohesión tienes... si logras tener por decirlo de algún modo 0,5 y 0,5 ¡estás hecho!

Dale una revisada al libro Ingeniería de Software: un enfoque práctico de Robert Pressman. De allí te puedes hacer una idea.

También hay que considerar el hecho de al considerar el paradigma OO ya tenemos dos tipos de Acoplamiento: el acoplamiento entre los módulos o unidades, ¡y el acomplamiento mismo entre las clases!

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #13  
Antiguo 22-07-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por Delphius Ver Mensaje
¿A cuál publicación de Simonyi te refieres amigo? ¿A la original, o la que terminó publicando Microsoft? Esto te lo pregunto justamente por lo que he leído en este artículo.
Una mala interpretación de las palabras de Charles terminó en lo que se conoció como Notación Húngara que promovió Microsoft.
A la original, ten en cuenta que yo empecé con estas cosas en 1985 , no existía windows y casi, casi... ni microsoft , y básicamente Simonyi lo usaba para el lenguaje C, que al contrario que "nuestro" Delphi, podías (y puedes) asignar valores de un tipo a variables de cualquier otro tipo y, como es natural, te saltaban unos errores tremendos.
Así que yo también usé esa técnica ya por aquella época, por ejemplo:
Código Delphi [-]
var
  iCodInforme,
  iIndice     : integer;
  fPorcentaje : float;
  aiParametros: array of integer;
  dFecha      : TDateTime;
  cCuenta,
  cPrefijo    : string; 
  bAceptado   : boolean;
Como ves, todavía usa el prefijo 'c' para string porque en lenguaje C los strings no existen, son cadenas de 'c'aracteres, y sigo nombrándolos así.
Uso los prefijos para todo, así es muy difícil equivocarse, por ejemplo:

Código Delphi [-]
iDato := 1;
cDato := 'Hola';
fCantidad := 2.36;
aiValor[iX] := 3;      // array de integer

Es casi imposible equivocarse porque estoy viendo el tipo de dato que espera la variable.

Todos los componentes y controles, igual, con 2 caracteres:

Código Delphi [-]
lbAviso : TLabel;
edCliente : TEdit;
cbOpciones : TComboBox;
dtFecha : TDateTimePicker;

Sin embargo para los controles de datos, uso las mayúsculas:

Código Delphi [-]
DScuentas : TDataSource;
TRprincipal : TTransaction;
DBprincipal : TDataBase;

Por eso digo que uso una versión "propia", porque con los años he ido amoldándolo a mis necesidades.

Además de evitar errores también facilita la lectura de código fuente, lo hace más intuitivo a la hora de depurar, por ejemplo.

Hay varias cosas que dice el texto que has enlazado y que estoy de acuerdo:

Cita:
El Húngaro para Aplicaciones fue algo extremadamente valioso, especialmente en los días de programación C donde el compilador no te daba una muy útil verificación de tipos.
Como he dicho antes, en aquella época era esencial.

Cita:
Pero hay aun un tremendo valor en el Húngaro para Aplicaciones, en que incrementa el factor de colocación del código, hace que sea fácil de leer, escribir, depurar, y mantener, y, más importante aún, hace que el código defectuoso se vea defectuoso.
Pues eso, lo que he dicho antes, totalmente de acuerdo.

Cita:
Antes de continuar, hay una cosa más que prometí hacer, la cual es meterme con las excepciones una vez más. La última vez que lo hice me metí en un montón de problemas. En una frase algo fuera de tono en la pagina de “Joel on Software”, escribí que no me gustan las excepciones porque ellas son, verdaderamente, un goto invisible, lo cual, razoné, es aun peor que un goto que puedes ver. Claro está decir que millones de personas se abalanzaron por mi garganta. La única persona en el mundo que salto en mi defensa fue, claro está, Raymond Chen, quien es, de paso, el mejor programador del mundo, así que tiene algo que decir, no?
Tiene toda la razón, muchas veces las excepciones son 'gotos' a no se sabe dónde
Responder Con Cita
  #14  
Antiguo 25-07-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por Neftali Ver Mensaje
Pues como ya te han comentado NO SIEMPRE HAY QUE EVITAR LAS VARIABLES GLOBALES. Cuando son necesarias hay que usarlas (como en este caso). Con la puntualización que ha hecho Chris, de que realmene sea global y no ligada al formulario

En mi caso, para esto (y algunas cosas similares) me creo una clase de configuración que almacena todos esos datos genéricos (que deben ser accesibles por toda la aplicación en cualquier momento). Pero sigue siendo lo mismo.

Tengo una instancia de la clase TGConfig que es global y dentro de esa clase TGConfig una serie de datos "globales".
No he leido a detalle todo el hilo pero me quedo con este mensaje.

De entrada no creo que sea "flojera" de los profesores el recomendar no usar variables globales, ni tampoco creo que sea un mito. Las variables globales conviene evitarlas porque hay poco control sobre ellas. Claro que si somos muy ordenados, no debería preocuparnos tanto, pero si todo fuera cuestión de orden para programar, ni siquiera necesitaríamos OOP.

¿Por qué escojo el mensaje de Neftalí para contestar en este hilo? Porque si bien parece estar de acuerdo en el uso de variables globales según qué circunstancias; en la parte subsecuente de su mensaje contradice esto indicando que reune estas variables globales en una clase TGConfig, cosa muy, pero muy distinta a tener una variable global suelta por ahí.

Yo hago algo como lo que menciona oscarac, y que todos parecen haber omitido, y que al, final es similar a lo que hace Neftali. Tengo un datamodule donde abro conexiones, leo valores de incio de algún archivo de configuración e incializo variables "globales", que, en realidad, son propiedades de ese datamodule.

// Saludos
Responder Con Cita
  #15  
Antiguo 25-07-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
Yo hago algo como lo que menciona oscarac, y que todos parecen haber omitido, y que al, final es similar a lo que hace Neftali. Tengo un datamodule donde abro conexiones, leo valores de incio de algún archivo de configuración e incializo variables "globales", que, en realidad, son propiedades de ese datamodule.
// Saludos
Normalmente lo pongo en una unit "normal" habilitada para estas cosas, ¿hay algún motivo especial para usar un datamodule?
Responder Con Cita
  #16  
Antiguo 25-07-2011
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No, ninguno, salvo el hecho de tenerla en una clase y no como variable global suelta. Lo del datamodule es sólo para aprovechar que ya tengo uno para menesteres de tipo inicialización, de hecho es donde pongo el componente de conexión. Aunque si son valores cuya naturaleza no tenga nada que ver con la base de datos, tal datamodule no sería la mejor opción y mejor lo del TGConfif de Germán.

// Saludos
Responder Con Cita
  #17  
Antiguo 25-07-2011
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Yo uso las dos cosas, una Unidad que llamo Global y allí coloco todas las variables que voy a utilizar en toda la aplicación "por encima de las unidades" y el resto procuro crearlas para que solamente vivan durante el ámbito de su aplicación y van en DataModulos...

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #18  
Antiguo 25-07-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Casi todos tenemos costumbres más o menos parecidas
Responder Con Cita
  #19  
Antiguo 25-07-2011
Avatar de marcoszorrilla
marcoszorrilla marcoszorrilla is offline
Capo
 
Registrado: may 2003
Ubicación: Cantabria - España
Posts: 11.221
Poder: 10
marcoszorrilla Va por buen camino
Sin embargo creo que es bueno intercambiar ideas, porque yo reconozco que antes colocaba todo en la Unidad "Menu", basándome en que esa unidad siempre estaba cargada en memoria, sin embargo JMR me hizo caer en la cuenta que eso era una aberración y un insulto a la inteligencia del compilador y desde entonces quité variables del menú y las lleve a Global que por cierto no tiene porque llamarse global.

Un Saludo.
__________________
Guía de Estilo de los Foros
Cita:
- Ça c'est la caisse. Le mouton que tu veux est dedans.
Responder Con Cita
  #20  
Antiguo 25-07-2011
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.038
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Cita:
Empezado por marcoszorrilla Ver Mensaje
Sin embargo creo que es bueno intercambiar ideas
Por supuesto que sí.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
variables globales pulpin C++ Builder 2 03-04-2008 04:09:28
Uff. variables globales en php.ini Nati PHP 1 26-06-2007 09:02:49
variables globales henrygale Varios 9 06-04-2007 00:47:05
Variables Globales Abel Garcia Firebird e Interbase 8 26-09-2005 15:20:59
Variables globales en PHP JulioGO PHP 3 08-04-2005 14:36:57


La franja horaria es GMT +2. Ahora son las 09:12:34.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi