Una variable global es, en informática, una variable accesible en todos los ámbitos de un programa informático. Los mecanismos de interacción con variables globales se denominan mecanismos de entorno global. El concepto de entorno global contrasta con el de entorno local donde todas las variables son locales sin memoria compartida (y por ello todas las iteraciones pueden restringirse al intercambio de mensajes).

El uso de este tipo de variables suele considerarse como una mala práctica, por el riesgo que conlleva esa deslocalización: una variable global puede ser modificada en cualquier parte del programa (a menos que resida en una sección de memoria protegida) y cualquier parte del programa depende de ella. Es por ello que una variable global tiene un potencial ilimitado para crear dependencias, factor este que aumenta la complejidad. Sin embargo, en algunas ocasiones, las variables globales resultan muy útiles. Por ejemplo, se pueden usar para evitar tener que pasar variables usadas muy frecuentemente de forma continua entre diferentes subrutinas.

El uso de variables globales se desaconseja especialmente para lenguajes de programación funcionales (como puede ser Scheme). Viola la transparencia referencial y dificulta la legibilidad del código fuente.

Las variables globales se usan de forma frecuente para pasar información entre diferentes secciones del código que no comparten una relación de "función llamadora" - "función llamada", como ocurre con hilos concurrentes y módulos para el manejo de señales. Los lenguajes de programación donde cada archivo define un espacio de nombres implícito elminan la mayor parte de los problemas de los lenguajes con nombres de espacios globales, aunque pueda haber algunos problemas si no se tiene cuidado a la hora de encapsular el código. Sin las restricciones adecuadas (como por ejemplo con un mutex), el código que usa variables globales no será a prueba de hilos excepto para los valores de solo lectura en la memoria protegida.

Ejemplo de una variable global en C++:

#include <iostream>

int global = 3; // Esta es la variable global.

void ChangeGlobal()
{
   global = 5; // Se referencia la variable global en una función.
}

int main()
{
   std::cout << global << '\n'; // Se referencia la variable global en una segunda función.
   ChangeGlobal();
   std::cout << global << '\n';
   return 0;
}

Dado que la variable es de ámbito global, no hay necesidad de pasarla como parámetro a otras funciones. La variable global pertenece a todas las funciones del programa.

El resultado será:

3
5

El uso de variables globales dificulta la legibilidad del código fuente. Dado que en cualquier parte del programa y en todo momento se puede cambiar el valor de la variable, para entender el uso de la variable suele ser necesario tener que comprender el funcionamiento de una parte amplia del programa. También dificultan la separación del código en bibliotecas, ya que muchos sistemas (como por ejemplo DLL) no soportan la visualización directa de variables globales en otros módulos. La denominación de las variables también puede desembocar en problemas con la denominación ya que una variable global corre el riesgo de ser usada, por ejemplo, en lugar de una variable local. Una variable local con el mismo nombre puede ocultar el acceso de la variable global, dificultando aún más la legibilidad del código. Por todo ello, el uso de variables globales puede provocar efectos secundarios difíciles de entender, predecir, y hacen la búsqueda de errores más compleja. Las variables globales también dificultan someter las diferentes unidades de software a tests de forma aislada, repercutiendo así en una posible reducción de la calidad del código.

Si no se define una variable en una función, entonces se considera global, de forma automática. El valor actual de la variable es el que se usa en la función. Las funciones pueden invocarse con menos parámetros entrantes y salientes cuando se usan variables locales.

Algunos lenguajes de programación, como por ejemplo Java, no tienen variables globales. En Java, todas las variables que no son locales son campos de una clase. Así, todas las variables están en el ámbito de una clase o de un método. En Java, los campos estáticos (conocidos también como variables de clase) existen, independientemente de cualquier instancia de la clase y se comparte una copia entre todas las instancias; de esta forma los campos estáticos se usan para muchas de las tareas de las variables globales, gracias a su similar concepto de "compartir".

Véase también

editar

Referencias

editar

Enlaces externos

editar