# Visibilità (programmazione)

Nella programmazione, la visibilità o ambito (in inglese scope) è l'esistenza e la possibilità di richiamare un identificatore, in particolar modo una variabile, in un determinato punto del programma.
Si parla di identificatori e non solo di variabili, perché lo scope è una caratteristica anche di classi, metodi, blocchi e altri concetti che fanno parte dei linguaggi di programmazione; l'identificatore, in questo caso, è un nome generico (una sequenza di caratteri) che rappresenta quella classe, quel metodo, quel blocco o quella variabile.

## Concetto di visibilità

Nei linguaggi dotati del concetto di blocco (come C, C++, Pascal, Java e molti altri) una variabile visibile all'interno di un blocco è in generale visibile anche all'interno di eventuali blocchi annidati.
Le regole fondamentali di visibilità sono in genere modificate dalla regola speciale dello shadowing, secondo cui una variabile locale "nasconde" una eventuale variabile omonima definita nello scope superiore. In altre parole, se in un programma è definita una variabile globale var e in un determinato sottoprogramma viene definita una variabile locale omonima, il sottoprogramma in questione perde la visibilità della variabile globale, nascosta da quella locale.

### Ambiti di visibilità

Esistono due ambiti di visibilità (scope) di un identificatore comuni a tutti i linguaggi di programmazione object-oriented:
* A livello di blocco. Caratterizza le variabili locali; sono gli identificatori dichiarati in un blocco. Lo scope inizia dalla dichiarazione dell'identificatore e termina con la fine del blocco stesso. Le variabili locali dichiarate all'interno di una funzione, così come i parametri di una funzione, hanno visibilità a livello di blocco. Nel caso di blocchi nidificati, se un identificatore del blocco esterno ha lo stesso nome di quello del blocco interno, l'identificatore del blocco esterno viene occultato fino alla fine del blocco più interno secondo la regola dello shadowing. Il blocco interno vede solamente il proprio identificatore locale.
* A livello di file. Caratterizza le variabili globali; un identificatore dichiarato all'esterno di una qualsiasi funzione ha visibilità a livello di file. È noto a tutte le funzioni che si trovano dopo la sua dichiarazione.

### Esempio
## Tipologia di scope

Nei linguaggi di programmazione che hanno un concetto di variabile, come quelli basati sul paradigma procedurale o object-oriented possiamo distinguere due categorie di variabili:
* Variabili globali: sono quelle visibili (ovvero referenziabili) da qualunque punto di un programma. L'uso eccessivo di variabili globali è in genere sconsigliato nella pratica dello sviluppo del software, poiché la loro presenza facilita l'occorrere di effetti collaterali che possono portare a errori di programmazione molto difficili da individuare e correggere.
* Variabili locali: sono quelle visibili solo all'interno di un determinato sottoprogramma, o, nella maggior parte dei linguaggi strutturati, solo all'interno di un determinato blocco.
Nei linguaggi orientati agli oggetti, le variabili di classe o attributi sono visibili solo all'interno della istanze della classe in cui sono state dichiarate. In particolare, una variabile dichiarata come statica è unica per la classe, e condivisa da ogni sua istanza. In altre parole, in ogni istanza della classe tale attributo punta alla medesima area di memoria, pertanto una sua modifica effettuata in una istanza si riflette in tutte le altre istanze della medesima classe.
Nei linguaggi orientati agli oggetti, gli attributi (non statici) di una classe sono elementi individuali di ogni distinta istanza. In tal caso, in ogni istanza tale attributo è presente localmente all'oggetto stesso, e distinto da quelli presenti in altre istanze della medesima classe.
In molti linguaggi, è possibile dichiarare una variabile all'interno di un blocco di una struttura di controllo, o usare un costrutto di blocco solo per delimitare lo scope di una variabile locale, o ancora dichiarare una variabile all'interno di un'espressione. Queste variabili sono visibili solo all'interno del blocco o dell'espressione in cui sono dichiarate, come mostrato nell'esempio. Tali pratiche facilitano il mantenimento in vita di una variabile solo per il tempo strettamente necessario, in modo da consentire economia di memoria e pulizia nel testo del programma.

## I conflitti e i namespace

Spesso durante la programmazione di grandi progetti vengono a crearsi conflitti tra diversi file dei nomi delle variabili. Questo problema è stato in parte risolto dall'introduzione dei namespace.