Вугорская натацыя

**Вуго́рская ната́цыя** — у праграмаваньні пагадненьне пра найменьне зьменных, калі зьменная або функцыя характарызуе сваё прызначэньне ці від, а ў некаторых мовах і тып. Аўтэнтычная вугорская натацыя ў пагадненьні пра найменьні выкарыстоўвае прызначэньне ці від.

Распрацоўвалася вугорская натацыя мованезалежнай і ўпершыню шырока была выкарыстаная ў мове праграмаваньня BCPL. Паколькі BCPL ня мае ніякіх тыпаў зьвестак, акрамя машынных словаў, праграмоўца ня мае ніякіх іншых сродкаў да запамінаньня тыпу зьменных. Вугорская натацыя прапануе праграмоўцу яўнае апісаньне тыпу кожнай зьменнай.

У вугорскай натацыі назва зьменнай пачынаецца зь некалькіх літараў у ніжнім рэгістры, якія зьяўляюцца пазначэньнем тыпу ці прызначэньня гэтай зьменнай, пасьля якіх ідзе ўласна прыдуманая праграмоўцам назва зьменнай; гэтая апошняя частка часам называецца *імя*. Першы сымбаль імені можа пачынацца зь вялікай літары, каб адрозьніваць яго ад паказьніка тыпу (глядзіце таксама вярблюджы рэгістар).

## Мінуўшчына
Арыгінальную вугорскую натацыю прыдумаў Чарльз Сымоні, які ў 1972—1981 працаваў у Xerox PARC, а пазьней стаў галоўным архітэктарам у Microsoft.

Назва натацыі паходзіць ад роднай краіны Чарльза; вугорскія імёны «перакуленыя» ў параўнаньні з большасьцю іншых эўрапейскіх імёнаў: прозьвішча ідзе перад уласным імем. Напрыклад, імя «Чарльз Сымоні» па-вугорску гучыць як «Шымані Карай». Такім сама чынам і назва тыпу зьменнай папярэднічае ейнаму «імені» ў вугорскай натацыі, у адрозьненьне ад больш звыклага для эўрапейцаў парадку «тып апошнім», прынятаму ў мове Smalltalk. Падчас працы Сымоні Xerox PARC кампанія шырока карысталася менавіта апошнім тыпам найменьняў.

Пазьней натацыю Чарльза Сымоні ўзяў на ўзбраеньне дастасоўны аддзел Microsoft, адсюль прынцып стаў таксама называцца «Дастасоўная вугорская натацыя». Пазьней каманда распрацоўнікаў апэрацыйнай сыстэмы Microsoft Windows удасканаліла натацыю, якая атрымала назву «Сыстэмнай вугорскай». У адрозьненьне ад правілаў Сымоні, які прапанаваў у прэфіксе шыфраваць назву тыпу зьменнай, у сыстэмнай вугорскай натацыі распрацоўнікі Microsoft ужылі больш зразумелыя прэфіксы, якая і цяпер выкарыстоўваецца ў дастасоўным праграмным інтэрфэйсе Windows.

## Параўнаньне дастасоўнай і сыстэмнай натацыяў
Прывядзем адрозьненьні дастасоўнай і сыстэмнай натацыяў у прэфіксах зьменных.

У сыстэмнай вугорскай натацыі ў прэфіксе зашыфраваны фактычны тып зьвестак зьменнай. Напрыклад:

* `lAccountNum` : зьменная тыпу *long integer* (`«l»`);
* `arru8NumberList` : зьменная тыпу **''arr**ay of **u**nsigned **8**-bit integers* (<code>«arru8»</code>);
* <code>bReadLine(bPort,&arru8NumberList)</code> : функцыя, што вяртае значэньне байтавага тыпу.
* <code>strName</code> : зьменная ўяўляе зь сябе радок (<code>«str»</code>) зь іменем, але не ўдакладняе, як уводзіцца гэты радок.

Дастасоўная вугорская натацыя імкнецца зашыфраваць лягічны тып зьвестак, чымся фізычны; такім парадкам, яна дае падказку, якое прызначэньне мае зьменная ці што яна захоўвае.
* <code>rwPosition</code> : зьменная ўяўляе зь сябе *рад* (; <code>«rw»</code>);
* <code>usName</code> : зьменная ўяўляе зь сябе *небясьпечны радок* (; <code>«us»</code>), які патрабуе «падчысткі» перад выкарыстаньнем
* <code>szName</code> : зьменная ўяўляе зь сябе *радок з нулявым байтам у канцы* (; <code>"sz"</code>); адзін зь першых прапанаваных Сымоні прэфіксаў.

Большасьць, хоць ня ўсе, прапанаваных Сымоні прэфіксаў — сэмантычныя ў натуры. На цяперашні погляд некаторыя прэфіксы выглядаюць як фактычныя назвы тыпаў зьвестак (напрыклад, <code>sz</code>); аднак тады гэтыя прэфіксы ўсё яшчэ былі сэмантычнымі, бо Сымоні прапаноўваў вугорскую натацыю для моваў, дзе немагчыма было адрозьніць некаторыя тыпы зьвестак. Цяперашнія мовы праграмаваньня ўжо немагчыма ўявіць бяз гэтых тыпаў зьвестак.

Яшчэ прыклады з арыгінальных правілаў:
* <code>p*X*</code> — [[паказальнік (кампутарнае праграмаваньне)|паказальнік]] на іншы тып *X*; вельмі малая сэмантычная інфармацыя.
* <code>*d*</code> — азначае адрозьненьне між двума значэньнямі; напрыклад, *dY* магло азначаць адлегласьць уздоўж восі Y графу, а зьменная *y* магла зьяўляцца абсалютнай каардынатай. Гэта цалкам сэмантычнае значэньне.
* <code>*sz*</code> — радок з нулявым байтам у канцы. Для [[C (мова праграмаваньня)|C]] гэта нясе пэўную сэмантычную інфармацыю, бо незразумела, ці зьменная тыпу *char** ёсьць паказальнікам на адзін сымбаль, масіў сымбаляў ці на радок з канцавым нулявым байтам.
* <code>*w*</code> — зьменная-слова. Тут цалкам адсутнічае сэмантычная інфармацыя, таму можна аднесьці гэты запіс да сыстэмнай вугорскай натацыі.
* <code>*b*</code> — байт; у адрозьненьне ад w, сэмантычная інфармацыя прысутная, бо ў C адзіным тыпам зьвестак аднабайтавага памеру ёсьць *char*, і часам у іх могуць захоўвацца лічбавыя значэньні. Гэты прэфікс адназначна характарызуе, ці можна лічыць значэньне зьменнай сымбалем, ці байтам.

== Прыклады ==
* <code>bBusy</code> : [[Лягічны тып зьвестак|boolean]]
* <code>chInitial</code> : [[Сымбальны тып зьвестак|char]]
* <code>cApples</code> : падлік элемэнтаў
* <code>dwLightYears</code> : double [[Слова (кампутарная архітэктура)|word]] (сыстэмная)
* <code>fBusy</code> : [[Лягічны тып зьвестак|flag]] (або [[Лік з рухомай коскай|float]])
* <code>nSize</code> : [[Цэлалікавы тып зьвестак|integer]] (сыстэмная) ці падлік (дастасоўная)
* <code>iSize</code> : integer (сыстэмная) ці індэкс (дастасоўная)
* <code>fpPrice</code>: [[Лік з рухомай коскай|floating-point]]
* <code>db[[Пі|Pi]]</code> : [[Лічба двайной дакладнасьці|double]] (сыстэмная)
* <code>p[[Foobar|Foo]]</code> : [[Паказальнік (кампутарнае праграмаваньне)|pointer]]
* <code>rgStudents</code> : array або range
* <code>szLastName</code> : zero-terminated string
* <code>u16Identifier</code> : unsigned 16-bit integer (сыстэмная)
* <code>u32Identifier</code> : unsigned 32-bit integer (сыстэмная)
* <code>stTime</code> : структура з часаў
* <code>fnFunction</code> : назва функцыі

Мнэмонікі для паказальнікаў і [[Масіў (тып зьвестак)|масіваў]], якія не зьяўляюцца сапраўднымі тыпамі зьвестак, звычайна бяруцца паводле тыпу зьвестак элемэнтаў:

* <code>pszOwner</code> : паказальнік на радок з нулявым байтам у канцы
* <code>rgfpBalances</code> : масіў зь лікаў float
* <code>aulColors</code> : масіў з unsigned long (сыстэмная)

Хоць вугорская натацыя можа пасаваць для любой мовы ці асяродзьдзя праграмаваньня, пераважна выкарыстоўваецца кампаніяй [[Microsoft]] у праграмаваньні на C, у прыватнасьці для [[Microsoft Windows]]. Для праграмоўцаў, якія вывучалі праграмаваньне Windows на C, пэўна, найбольш запамінальнымі прыкладамі ёсьць <code>wParam</code> (парамэтар тыпу word) і <code>lParam</code> (парамэтар long-integer) для функцыі WindowProc().
* <code>hwndFoo</code> : [[дэскрыптар]] вакна
* <code>lpszBar</code> : паказальнік тыпу long на радок з нулявым байтам у канцы

== Перавагі ==
Прыхільнікі вугорскай натацыі зазначаюць такія перавагі:
* Сымбальны тып можна ўбачыць па ягонай назьве. Гэта зручна пры праглядзе крынічнага коду без [[Інтэграванае асяродзьдзе распрацоўкі|інтэграванага асяродзьдзя распрацоўкі]] — прыкладам, пры [[Інспэкцыя коду|інспэкцыі коду]] ці на раздрукоўцы — ці калі апісаньне зьменнай знаходзіцца ня ў тым файле, дзе выкарыстоўваецца.
* У мовах, якія выкарыстоўваюць [[Сыстэма тыпаў|дынамічную тыпізацыю]] ці без тыпізацыі, пазначэньні тыпаў зьменных могуць быць неадпаведнымі. У такіх мовах зьменныя звычайна не апісваюцца для захоўваньня вызначанага тыпу зьвестак, таму адзінай падказкай, для чаго патрэбная зьменная, стануць даступныя праграмоўцам сродкі (найменьне зьменнай, дакумэнтацыя, камэнтары). Як згадвалася вышэй, вугорская натацыя пашыраная ў такой мове ([[BCPL]]).
* Фарматаваньне назваў зьменных можа спрасьціць пэўныя аспэкты [[рэфактарынг]]у (аднак зробіць іншыя аспэкты больш схільнымі да памылак).
* У адным кавалку коду могуць ужывацца некалькі зьменных з падобнай сэмантыкай: dwWidth, iWidth, fWidth, dWidth.
* Назвы зьменных лёгка запомніць, ведаючы проста іхнія тыпы.
* Назвы зьменных становяцца больш прадказальнымі.
* Пры чытаньні коду можна лёгка заўважыць хібныя прывядзеньні тыпаў зь несумяшчальнымі тыпамі зьвестак.
* У складаных праграмах зь вялікай колькасьцю глябальных аб’ектаў (формы VB/Delphi) выкарыстаньне натацыі з прэфіксамі можа спрасьціць пошук кампанэнту ўнутры рэдактара. Напрыклад, шукаючы падрадок <code>btn</code>, можна знайсьці ўсе аб’екты Button.
* Друкаваны крынічны код больш зразумелы чытачу пры ўмове выкарыстаньня тыпаў зьвестак, пагадненьнях па назвах тыпаў, прысвойваньняў, абразаньняў ды інш.

== Нязручнасьці ==
Большасьць аргумэнтаў супраць вугорскай натацыі тычацца *сыстэмнай* галіны, а не *дастасоўнай*:
* Вугорская натацыя састарэлая пры праверцы тыпу зьвестак [[кампілятар]]ам. Кампілятары моваў праграмаваньня выконваюць строгую праверку тыпаў, безь якой праграма не выканаецца.
* Найсучасьнейшыя [[Інтэграванае асяродзьдзе распрацоўкі|інтэграваныя асяродзьдзі распрацоўкі]] паказваюць тыпы зьменных пры патрэбе і аўтаматычна пазначаюць апэрацыю зь несумяшчальнымі тыпамі.
* Вугорская натацыя можа зьбіць з панталыку, калі паспрабаваць апісаць ёй некалькі характарыстык зьменных, напрыклад <tt>a_crszkvc30LastNameCol</tt>: [[Парамэтар (праграмаваньне)|аргумэнт]] [[Канстанта (праграмаваньне)|канстанты]]-[[Спасылка (праграмаваньне)|спасылкі]], які зьмяшчае слупок [[База зьвестак|базы зьвестак]] <tt>LastName</tt> тыпу [[varchar]](30), які ўваходзіць у [[першасны ключ]] табліцы.
* Пры зьмяненьні ці пераносе коду натацыя можа выклікаць неадпаведнасьць. Пры зьмяненьні тыпу зьменнай трэба зьмяняць і назву зьменнай, інакш ейная назва будзе неадпаведнай новаму тыпу. Даволі вядомым прыкладам ёсьць стандартны тып WPARAM і спадарожны [[фармальны парамэтар]] wParam у апісаньні мноства сыстэмных функцыяў Windows. Тут «w» азначае «word» — пачаткова 16-бітны тып зьвестак, але зь пераходам ад 16-бітнай архітэктуры словаў да 32-бітнай стаў адпаведнай 32-бітным тыпам, а на 64-бітнай архітэктуры — 64-бітным (фактычная назва гэтага тыпу — UINT_PTR, што азначае «бяззнакавы цэлы, дастаткова вялікі, каб зьмясьціць паказальнік»).
* Часьцей за ўсё веданьне прымяненьня зьменнай дазваляе зразумець ейны тып. Больш за тое, нават веданьне тыпу зьменнай не дапаможа зразумець ейнага прымяненьня.
* Вугорская натацыя зьмяншае перавагі выкарыстаньня рэдактараў коду, якія маюць аўтападстаноўку назваў зьменных, бо праграмоўца вымушаны абавязкова ўводзіць прэфікс тыпу, які можа супадаць зь іншымі назвамі зьменных таго ж тыпу.
* Крынічнік становіцца горш чытэльным праз запаланеньне зьменнымі зь непатрэбнымі пазначэньнямі тыпаў і прызначэньняў зьменных.
* Дадатковая інфармацыя пра тып зьменнай ня можа замяніць ейную больш апісальную назву. Напрыклад, sDatabase ня так патлумачыць чытачу прызначэньне зьменнай, як больш апісальная назва databaseName.
* Калі назвы зьменных дастаткова апісальныя, дадатковая інфармацыя пра тып можа быць залішняй. Напрыклад, хутчэй за ўсё зьменная firstName будзе радковага тыпу, таму выкарыстаньне яе з прэфіксам sFirstName уводзіць непатрэбшчыну.
* Назвы зьменных цяжэй запамінальныя.
* У адным блёку коду могуць трапіцца розныя зьменныя з *'рознай*' сэмантыкай ды падобнымі назвамі: *dwTmp, iTmp, fTmp, dTmp''.

## Глядзіце таксама
* Польская натацыя
* Вярблюджы рэгістар

## Крыніцы

## Вонкавыя спасылкі
* Чарльз Сымоні. [Meta-Programming: A Software Production Method Мэтапраграмаваньне: мэтад вытворчасьці праграмаў], 1976 
* Вугорская натацыя  ў MSDN
* Дуг Кландэр. Пагадненьні па вугорскай натацыі 
* Пагадненьні па стылі кадаваньня  Цэнтру распрацоўнікаў Windows

Катэгорыя:Крынічны код
Катэгорыя:Пагадненьні па найменьні