![]() |
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!!! |
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
|
Cita:
|
Cita:
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! |
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: 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. |
Cita:
Supongo que tu código debe ser algo cómo esto: 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:
Espero que esto sea lo que realmente necesitas y que también hallas entendido lo que he querido decir. Saludos, Chris |
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!! |
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, |
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". |
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:
Y para las variables globales, similar, pero en minúsculas:
De esa manera siempre tengo controlado cada cosa. |
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! |
Cita:
Una mala interpretación de las palabras de Charles terminó en lo que se conoció como Notación Húngara que promovió Microsoft. ;) Cita:
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, |
Cita:
Así que yo también usé esa técnica ya por aquella época, por ejemplo: 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:
Es casi imposible equivocarse porque estoy viendo el tipo de dato que espera la variable. Todos los componentes y controles, igual, con 2 caracteres:
Sin embargo para los controles de datos, uso las mayúsculas:
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:
Cita:
Cita:
|
Cita:
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 |
Cita:
|
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 |
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. |
Casi todos tenemos costumbres más o menos parecidas :)
|
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. |
Cita:
|
La franja horaria es GMT +2. Ahora son las 07:22:04. |
Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi