lunes, 28 de junio de 2010

El problema de las Variables Globales

Reconozco que es una práctica que uso mucho. Uso demasiadas variables globales, cosa que hace que un código quede algo ilegible. Queda extraño leer alguna función en algún programa grande, y ver de repente una variable, la cual no sabes donde usas, qué contiene o para que sirve.

Evidentemente si perseguimos obtener un código limpio y entendible a los ojos de la mayoría de los programadores, debemos evitar esta práctica. Pero se nos plantea un problema. Imaginemos un programa bastante grande, el cual queremos una variable común a todas las funciones y a todos los procedimientos, para llevar un control del estado de las funciones (Imaginemos que las funciones tienen estados, dependiendo de sus resultados)

Esta variable se debe poder modificar en todas las funciones, para que nos sea realmente útil, pero como ya he mencionado, quedaría desorganizado si usáramos una variable global.

Para ello, propongo una solución funcional, bastante limpia y eficaz, usar una estructura y una función para modificar nuestra variable.

Planteo el código en C:

typedef struct Global
{
unsigned int variable;
} Global;

void cambiarGlobal(int num)
{
Global global;
global.variable =num;
}
Ahora, cada vez que llamemos a cambiarGlobal(int) cambiaremos la variable global almacenada dentro de nuestra estructura.

Tenemos varias posibilidades, como crear mas variables dentro de la estructura, o crear plantillas nuevas (P.e. Global plantilla1, plantilla2, plantillaN) para poder acceder así a varios grupos de variables.

Con esto mantenemos el código limpio, a la par de que es mas eficiente que tener las globales descontroladas.


Una manera mas ligera para programas mas reducidos, es ahorrar la Estructura, pues esta puede llegar a ser bastante pesada. Con definir una función que contenga nuestras variables globales, y modificarlas mediante parámetros, obtendremos los mismos resultados.

void miGlobal(int func, int num)
{
int global1, global2;
if (func ==0) global1 =num;
if (func ==1) global2 =num;
}

Y para finalizar, usando toda la potencia del lenguaje C, tenemos los punteros, aunque puede parecer algo complicado para programadores noveles.

Creando una variable en cualquier punto del programa, podemos acceder a su contenido gracias a los punteros. Ejemplo por Nicolás:

void cambiarValorNum( int*, int );

int main( void )
{
int num;
cambiarValorNum( &num, 5 );
return 0;
}

void cambiarValorNum( int *num, int val )
{
*num = val;
}

No hay comentarios:

Publicar un comentario