Usuari:Mcapdevila/Variable global

De la Viquipèdia, l'enciclopèdia lliure

Una variable global és, en informàtica, una variable accessible en tots els àmbits d'un programa informàtic. Els mecanismes d'interacció amb variables globals es denominen mecanismes d'entorn global . El concepte d'entorn global contrasta amb el d'entorn local on totes les variables són locals sense memòria compartida (i per això totes les iteracions poden restringir-se a l'intercanvi de missatges ).

L'ús d'aquest tipus de variables sol considerar com una mala pràctica, pel risc que comporta aquesta deslocalització: una variable global pot ser modificada en qualsevol part del programa (a menys que resideixi en una secció de memòria protegida) i qualsevol part del programa depèn d'ella. És per això que una variable global té un potencial il·limitat per a crear dependències, factor que augmenta la complexitat. No obstant això, en algunes ocasions, les variables globals resulten molt útils. Per exemple, es poden usar per evitar haver de passar variables utilitzades molt sovint de forma contínua entre diferents subrutines.

L'ús de variables globals es desaconsella especialment per llenguatges de programació funcionals (com ara Scheme). Viola la transparència referencial i dificulta la llegibilitat del codi font.

Les variables globals s'usen de forma freqüent per passar informació entre diferents seccions del codi que no comparteixen una relació de "funció que fa la crida" - "funció cridada", com passa amb fils concurrents i mòduls per al maneig de senyals. Els llenguatges de programació on cada fitxer defineix un espai de noms implícit elminan la major part dels problemes dels llenguatges amb noms d'espais gloabals, encara que pugui haver alguns problemes si no es va amb compte a l'hora d'encapsular el codi. Sense les restriccions adequades (com per exemple amb un mutex), el codi que utilitza variables globals no serà a prova de fils excepte per als valors de només lectura a la memòria protegida.

Exemple d'una variable global en C++:

#Include <iostream>

int global = 3;//Aquesta és la variable global.

void ChangeGlobal ()
{
   global = 5;//Es referència la variable global en una funció.
}

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

Atès que la variable és d'àmbit global, no hi ha necessitat de passar com a paràmetre a altres funcions. La variable global pertany a totes les funcions del programa.

El resultat serà:

3
5

L'ús de variables globals dificulta la llegibilitat del codi font. Atès que en qualsevol part del programa i en tot moment es pot canviar el valor de la variable, per entendre l'ús de la variable sol ser necessari haver de comprendre el funcionament d'una part àmplia del programa. També dificulten la separació del codi en biblioteques, ja que molts sistemes (com ara DLL) no suporten la visualització directa de variables globals en altres mòduls. La denominació de les variables també pot desembocar en problemes amb la denominació, ja que una variable global corre el risc de ser usada, per exemple, en lloc d'una variable local. Una variable local amb el mateix nom pot ocultar l'accés de la variable global, dificultant encara més la llegibilitat del codi. Per tot això, l'ús de variables globals pot provocar efectes secundaris difícils d'entendre, predir, i fan la recerca d'errors més complexa. Les variables globals també dificulten sotmetre les diferents unitats de programari a tests de forma aïllada, repercutint així en una possible reducció de la qualitat del codi.

Si no es defineix una variable en una funció, llavors es considera global, de forma automàtica. El valor actual de la variable és el que es fa servir en la funció. Les funcions poden invocar amb menys paràmetres entrants i sortints quan s'usen variables locals.

Alguns llenguatges de programació, com ara Java, no tenen variables globals. En Java, totes les variables que no són locals són camps d'una classe. Així, totes les variables estan en l'àmbit d'una classe o d'un mètode. En Java, els camps estàtics (coneguts també com a variables de classe) existeixen, independentment de qualsevol instància de la classe i es comparteix una còpia entre totes les instàncies, d'aquesta forma els camps estàtics s'usen per a moltes de les tasques de les variables globals, gràcies al seu semblant concepte de "compartir".

Vegeu també[modifica]

Referències[modifica]