# Notazione ungara

In informatica la notazione ungara, o notazione ungherese, è una convenzione di denominazione (in inglese naming convention) usata in programmazione, in cui il nome dell'oggetto indica il suo tipo e il suo scopo d'uso.
Questa notazione è detta “ungara” sia per via della nazionalità ungherese del suo inventore Charles Simonyi sia perché i prefissi impronunciabili ricordano l'ortografia ricca di consonanti di alcune lingua dell'Europa orientale (sebbene la lingua ungherese sia in realtà ricca di vocali, vi ricorre frequentemente la coppia di lettere “sz”, che in notazione ungara rappresenta le stringhe terminate con zero).
La notazione ungara è stata progettata in modo da essere indipendente dal linguaggio, e la sua prima applicazione importante è stata con il linguaggio BCPL. A causa del fatto che il BCPL non ha altri tipi di dato oltre alla word della macchina, non c'è nulla nel linguaggio stesso che possa aiutare il programmatore a ricordare il tipo delle variabili. La notazione ungara cerca di risolvere questo problema fornendo al programmatore un'indicazione esplicita del tipo di dato di ogni variabile.

## Convenzione di denominazione

Nella notazione ungara, un nome di variabile inizia con un prefisso costituito da una o più lettere minuscole in modo da formare un codice mnemonico per il tipo o lo scopo di questa variabile. Il prefisso è seguito dal nome scelto dal programmatore; quest'ultima parte è spesso indicata come il “nome assegnato”. Il primo carattere del nome assegnato è in maiuscolo per separarlo visivamente dal prefisso come nella notazione a cammello.
Vi sono due tipi di notazioni ungare: di sistema e di applicazione. La differenza tra i due tipi di notazione ungara è lo scopo del prefisso.

## Origini

Originariamente la notazione inventata da Charles Simonyi, programmatore di Xerox in seguito diventato Chief Architect in Microsoft, si chiamava Apps Hungarian. Tale nome era stato coniato in quanto questa convenzione era usata dalla divisione di Microsoft che produceva i software applicativi, dove la notazione indicava la tipologia dei dati memorizzati nella variabile.
La notazione di sistema fu sviluppata in seguito dal team di sviluppo di Windows basandosi sul documenti di Simonyi. Il documento faceva riferimento al prefisso usato per indicare il “tipo” di informazione memorizzata: la parola “tipo” venne fraintesa come “tipo di dato”, e i prefissi di sistema furono concepiti con questo significato.

## Notazione di sistema e di applicazione

Nella notazione di sistema, la forma attualmente più comune, il prefisso codifica il tipo effettivo della variabile. Per esempio:
* ulAccountNum: la variabile è un unsigned long integer
* szName: la variabile è una zero-terminated string
La notazione di applicazione, forma originale inventata da Simonyi, non codifica il tipo effettivo del tipo, ma fornisce un'indicazione sullo scopo della variabile o dell'oggetto, o ciò che rappresenta. Per esempio:
* rwPosition: variabile che rappresenta una riga (row)
* idName: variabile che rappresenta l'identificativo univoco di un nome
Sebbene la notazione usi codici mnemonici, non vi è alcuna prescrizione su quali codici usare. Vi sono perciò diverse convenzioni, ma può essere utilizzato qualsiasi insieme di lettere. Ciò che è più importante è che l'uso dei codici sia consistente in una data porzione di codice.

### Esempi

* nSize: numero intero
* cApples: conteggio degli elementi
* dwLightYears: double Word
* bBusy: booleano
* fBusy: flag booleano
* pFoo: puntatore
* szLastName: Stringa terminata con zero
* rgStudents: Array o range
Il codice per i puntatori e gli array, che non sono tipi di dati effettivi, è usualmente seguito dal tipo di dato degli elementi:
* rgfBalances: array di valori floating point
* pszOwner: puntatore a una stringa terminata con zero
Sebbene la notazione ungara possa essere applicata a qualsiasi linguaggio e ambiente, è stata ampiamente adottata da Microsoft per il linguaggio C, in particolare per Windows. Perciò sono molto comuni costrutti di notazione ungara specifici di Windows:
* hwndFoo: handle a una finestra
* lpszBar: puntatore lungo a una stringa terminata con zero
La notazione è spesso estesa nel C++ per indicare l'ambito (scope) di una variabile, separato da un underscore:
* m_dwWheels: membro di una classe, double word
La notazione ungara diventa confusa quando è utilizzata per rappresentare diverse proprietà, come in questo esempio:
* a_crszkvc30LastNameCol: riferimento costante a un parametro di funzione contenente una colonna di database di tipo varchar(30) chiamata LastName che era parte della chiave primaria

## Opinioni

Nel mondo informatico ci sono pareri discordanti sull'utilità della notazione ungara. Le critiche più comuni riguardano l'inutilità della notazione di sistema, visto che i compilatori moderni sono in grado di controllare da soli i tipi delle variabili (al contrario del BCPL per il quale la notazione fu inizialmente concepita), la scarsa leggibilità del codice che risulta dal suo uso, e i problemi che derivano a valle nel codice quando si dovesse cambiare il tipo di una variabile (che implicherebbe cambiarne il nome ovunque essa fosse usata).
«Encoding the type of a function into the name (so-called Hungarian notation) is brain damaged - the compiler knows the types anyway and can check those, and it only confuses the programmer. No wonder Microsoft makes buggy programs.»
«Inserire il tipo della funzione nel suo nome (la cosiddetta notazione ungara) è una scemenza: il compilatore conosce comunque il tipo e lo può verificare, e l'unica cosa che fa è confondere il programmatore. Non stupisce che la Microsoft [che usa questa notazione] faccia programmi difettosi.»
(Linus Torvalds nella guida di stile del codice kernel linux)
«In a true and pure OO language (which C++ is not) Hungarian notation would have no purpose. Here, variables are typeless - they contain an object, the type of which depends on the object itself, not the variable. There are no primitive types.»
«In un vero linguaggio orientato agli oggetti puro (cosa che il C++ non è) la notazione ungara non avrebbe alcun senso. Qui le variabili non sono tipizzate; esse contengono un oggetto il cui tipo dipende dall'oggetto stesso, non dalla variabile. Non ci sono tipi primitivi.»
(Roger Onslow)
«[... Hungarian notation will] prevent your code from being ported from 16 bit to 32 bit platforms.»
«[... la notazione ungara] preclude la possibilità di portare il codice da una piattaforma a 16 bit ad una a 32 bit.»
(Bill Davis)
«Hungarian notation encodes type information into variable names. This is very useful in languages that don't keep track of types information for you. But in C++ or Eiffel it is completely redundant. Thus, the notation simply adds to obscurity. Hungarian notation is, when all is said and done, a commenting technique. And the one great law of comments is that they lie. Comments are not syntax checked, there is nothing forcing them to be accurate.»
«La notazione ungara codifica il tipo nel nome della variabile. Ciò è molto utile nei linguaggi che non tengono traccia delle informazioni sui tipi. Ma in C++ o in Eiffel è completamente ridondante. Inoltre la notazione aumenta semplicemente la complessità [della lettura del codice]. La notazione ungherese è, in fin dei conti, una tecnica per commentare il codice. E una delle principali regole dei commenti è che essi mentono. La sintassi dei commenti non è controllata dal compilatore, niente li obbliga ad essere accurati.»
(Robert C. Martin)