**Unkarilainen notaatio** on ohjelmoinnissa käytetty nimeämiskäytäntö, jossa muuttujan nimi ilmaisee sen tyypin tai käyttötarkoituksen. Unkarilaisessa notaatiossa muuttujan varsinaisen nimen eteen sijoitetaan pieniä kirjaimia, joiden tarkoitus on muistuttaa ohjelmoijaa muuttujan tyypistä tai käyttötavasta. 

Unkarilaista notaatiota on kahta eri tyyppiä: *Systems Hungarian* ja *Apps Hungarian*. Näistä ensimmäisessä muuttujan nimen eteen sijoitetaan merkintä muuttujan tietotyypistä ja jälkimmäisessä muuttujan käyttötarkoituksesta.

Historia
--------

Alkuperäisen unkarilaisen notaation – jota nykyisin kutsutaan *Apps Hungarianiksi* – keksi unkarilaissyntyinen Charles Simonyi. Unkarilainen notaatio on saanut nimensä unkarilaisesta tavasta kirjoittaa henkilön sukunimi ennen etunimeä. Simonyista tuli myöhemmin Microsoftin pääarkkitehti, ja merkintätapaa on käytetty Microsoftin Windows-tuotteissa.

Termi *Apps Hungarian* sai nimensä siitä, että sentyyppistä nimeämiskäytäntöä käytettiin Microsoftin sovellusohjelmia (engl. *application*) kehittävällä osastolla. *Systems Hungariania* käytettiin myöhemmin Windows-kehitysryhmässä. Simonyin unkarilaisen notaation määrittelevä artikkeli puhuu muuttujien etuliitteistä, jotka ilmaisevat muuttujien "tyypin". Simonyi tarkoitti tällä lähinnä muuttujan semantiikka, mitä tapaa Apps Hungarian noudattaa. Jotkin Simonyin esimerkeistä ovat kuitenkin melko epäsemanttisia, joten Systems Hungarianiakaan ei voi pitää "vääränä" merkintätapana.

Apps Hungarian ja Systems Hungarian
-----------------------------------

Systems Hungarianin ja Apps Hungarianin ero on etuliitteen käyttötavassa. Systems Hungarianissa etuliite ilmoittaa muuttujan tietotyypin tai toteutustavan:

* `ulTime`: etumerkitön pitkä kokonaisluku (engl. *unsigned long*), johon on tallennettu aika
* `szFilename`: `NUL`-merkkiin päättyvä merkkijono, johon on tallennettu tiedostonnimi

Apps Hungarianissa etuliite taas muistuttaa muuttujan käyttötarkoituksesta:

* `rwPosition`: paikkatieto, joka tarkoittaa riviä (engl. *row*)
* `usName`: muuttujassa on "vaarallinen" merkkijono (engl. *unsafe string*), joka täytyy muuttaa vaarattomaksi ennen kuin sitä voi käyttää

Kritiikkiä
----------

Unkarilainen notaatio saattaa johtaa lukemiskelvottomiin muuttujien ja funktioiden nimiin, kuten `lpcstrFilename` ("32-bittinen osoitin (engl. *long pointer*) vakiomerkkijonoon jossa on tiedostonnimi"). 

Unkarilaista notaatiota vastaan on puhunut mm. Linus Torvaldsin ja Linux-ytimen tyylioppaan mukaan "se on aivovaurioitunutta ja vain hämmentää ohjelmoijaa" perusteena että ohjelmointikielen kääntäjä tunnistaa ja pystyy tarkistamaan tietotyypin.

Bjarne Stroustrup on myös kritisoinut notaation käyttöä geneeriseen ohjelmointiin kykenevissä kielissä sanoen, että se ".. yksinkertaisesti monimutkaistaa ja vähentää abstraktiota".

.NETissä myös Microsoft on luopunut käytännöstä ja .NET Framework Guidelines suosittelee olemaan käyttämättä sitä.

Lähteet
-------

1. ↑  Linux kernel coding style *kernel.org*.  "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" Viitattu 4.11.2017. (englanniksi)
2. ↑  Stroustrup, Bjarne: Bjarne Stroustrup's C++ Style and Technique FAQ *stroustrup.com*. Viitattu 4.11.2017.

Aiheesta muualla
----------------

* Charles Simonyi: Program Identifier Naming Conventions (Arkistoitu – Internet Archive) (PDF) (englanniksi)