Венгерская нотация

Венгерская нотация — соглашение об именовании переменных, констант а так же идентификаторов в коде программ.

Свое название венгерская нотация получила благодаря программисту компании Майкрософт венгерского происхождения Чарльзу Шимоньи (Karoly Simonyi), предложившего её ещё во времена разработки первых версий MS-DOS. Позже, оригинальная концепция Венгерской Нотации Шимоньи была названа в Microsoft Венгерской для Приложений (Apps Hungarian), т.к. использовалась в Подразделении Приложений (Applications Division), которое, в частности, разрабатывало Word и Excel. Существует теория что именно авторы документации из команды Windows неосторожно изобрели то, что стало известным как Системная Венгерская, эта система стала внутренним стандартом Microsoft (есть мнение что в Microsoft совершенно исказили идею Шимоньи).

Различия Системной Венгерской и Венгерской для Приложений 

В Венгерской для Приложений были определены конкретные приставки, такие как "ix" для обозначения индекса в массиве, "c" для счетчиков, "d" для разницы между двумя числами (например, "dx" означал "ширину"), и т.д. Системная Венгерская имела намного менее полезные приставки, такие как "l" для длинного целого (long), "ul" для беззнакового длинного целого (unsigned long), и "dw" для двойного слова (double word) , которое, фактически, является беззнаковым длинным целым и т.д.. В Системной Венгерской единственной вещью, о которой говорил вам префикс, фактически был только тип переменной. Т.е. мы видим что различие принципиальное хотя идея добавления дополнительной информации о переменной с помощью системы префиксов одна и та же.

Системную Венгерскую широко распространили; она стала повсеместным стандартом для документации Windows для программистов. Префиксы к именам делают просмотр и понимание исходного кода и спецификаций более простыми. Венгерская нотация является одной из методик, позволяющих программистам создавать более читаемый код в короткие сроки. В большей части документации и файлов заголовков, изданных Microsoft за последние 15 лет используется Венгерская нотация.

Многие программисты вне Microsoft приняли данное соглашения или другую сходную схему формирования имен идентификаторов. Возможно, одним из решающих факторов пропагандирующего Венгерскую нотацию была книга, которую читал почти каждый интересующийся программист Windows: "Windows programmin" Чарльза Петцольда. В книге данное соглашение использовалось для примеров и примечаний и было кратко описано в первой главе. Суть Венгерской нотации сводится к тому, что имена идентификаторов предваряются заранее оговоренными префиксами, состоящими из одного или нескольких символов. При этом, как правило, ни само наличие префиксов, ни их написание не являются требованием языков программирования.

Приведу краткую таблицу префиксов Венгерской нотации (Системной).

префикс значение описание пример
s string строка sClientName
c, ch character символ, обычно в тексте ASCII cFirstSymbol,chFirstSimbol
w 16-bit unsigned integer целочисленная переменная типа WORD wPos
dw 32-bit unsigned integer целочисленная переменная типа DWORD dwRange
n integer целочислинная переменная типа int nCount
l 32-bit signed integer целочислинная переменная типа long lWidth
d double переменная с плавающей запятой dSum
sz zero-terminated string строка, ограниченная нулевым символом szClientName
b boolean булева переменная bIsEmpty
a array массив aDimensions
t, dt time, datetime время, дата и время tDelivery, dtDelivery
p pointer указатель pBox
lp long pointer двойной (дальний) указатель lpBox
r reference ссылка rBoxes
h handle дескриптор hWindow
m_ member переменная-член m_sAddress
g_ global глобальная переменная g_nSpeed
C class класс CString
T type тип TObject
I interface интерфейс IDispatch
 таблица для идентификаторов ресурсов в MFC

префикс описание пример диапозон
IDR_ Идентификатор ресурса нескольких типов IDR_MAINFRAME 1 to 0x6FFF
IDD_ Диалоговый ресурс IDD_ABOUT 1 to 0x6FFF
HIDD_ Диалоговый ресурс для помощи HIDD_COPY 0x20001 to 0x26FF
IDB_ Изображение IDB_MY_LOGO 1 to 0x6FFF
IDC_ Курсор IDC_WAIT_CONNECT 1 to 0x6FFF
IDI_ Икона IDI_TOOLS 1 to 0x6FFF
ID_ _ Команда меню или панели инструментов ID_TOOLS_CHECK 0x8000 to 0xDFFF
HID_ Команда вызова помощи HID_TOOLS 0x18000 to 0x1DFFF
IDP_ Окно сообщения строка IDP_INVALID_PARAM 8 to 0xDFFF
HIDP_ Окно сообщения помошь HIDP_INVALID_PARAM 0x30008 to 0x3DFFF
IDS_ Строка IDS_ABOUTBOX 1 to 0x7FFF
IDC_ Элемент управления исключая ресурс диалога IDC_BUTTON_FIND 8 to 0xDFFF

Конечно у каждого программиста (или коллектива программистов) могут быть своими, но смысл придумывать велосипед нет, разумнее конечно просто частично модифицировать набор правил под свои нужды и задачи оставив основную массу не измнными.

В более широком понимании, Венгерскую нотацию можно применять даже в языках в которых нет типов переменных, например при работе с данными с помощю префиксов можно различать, скажем переменные содержащие внутренние, проверенные данные и данные введенные пользователем или из других внешних, относительно вашей системы (программы), что позволит избежать критических ощибок и сделать программу менее уязвимой в смысле безопасности.

Пример.
Переменные являющиеся внешними будут иметь префикс us (UnSafe не безопасные) тогда скажем будем иметь названия пременных:
UserName - имя пользователя(данные нашей системы);
UserInfo - информация о пользователе(данные нашей системы);
usUserName - имя пользователя(полученные данные);
usUserInfo - информация о пользователе(полученные данные);

Против

Несмотря на широкую распространенность Венгерской нотации,  есть  программисты которые ее считают не только бесполезной но и вредной, мешающей и запутывающей. В потверждение своего мнения приводят следующие доводы:
1) Любая лишняя информация сбивает пользователя с толку;
2) Проблемы изменеия названий переменных при смене их типа;
3) Отсутствие контроля;
4) Трата времени т.к. есть подсветка синтаксиса;
5) Заявление Microsoft о том что «Венгерская Нотация не рекомендуется;
6) «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их...»(по некоторым данным слова Линус Торвальдса, противника Венгерской нотации );

Использованные материалы:
статья из Википедия Венгерская нотация
статья Венгерская нотация (Hungarian Notation) от www.codenet.ru
статья "Как заставить неправильный код выглядеть неправильно"

От Автора:
Мое мнение об Венгерской нотации можно выразить тремя словами "я ее использую!!!" :) причем как Системную так и для Приложений. Нельзя сказать что я впервые прочитав о Венгерской нотации пришел в полный восторг, но если сказано что это правильно, кем то более компитентным значит это не с проста. Только не подумайте что я полный параноик и придерживаюсь полностью какой либо конкретной версии описания Венгерской нотации, боясь сделать шаг влево или вправо. Позже с годами написания, и уж конечно чтения, исходного кода пришло и понимание зачем, и для чего, а что и не очень принципиально.

Противникам Венгерской нотации (по списку Против):

1) дело привычки, если я читаю "смысл" программы я просто не смотрю на префиксы, если мне необходимо знать тип или проверить корректность типов я смотрю префикс;
2) если необходимо изменить тип переменной, то это явно ошибка допущенная при проэтировании и в таких случаях код переписывается, во вторых я скажу что это притянутый единичный случай (ребята имеют ввиду изменение типа int на long или другой целочисленный тип и тогда нужно будет изменить название переменной скажем с iSize на lSize) а что вы будете делать если тип переменной с long изменится на double? Вам очень поможет то что переменная называлась Size а не lSize? а что вы не будете исправлять все сравнения переменной? арифметические операции? изменять типы переменных используемых для хранения результатов вычислений с использованием этой переменной?

например в коде есть такой кусок
long lRes;
lRes = lSize -1;
if( lRes > 0 )
{
 
}
простое изменение long на double приведет к ошибке в логике в зависимости от настроек компилятора (я имею ввиду что 1 для переменной с плавающей запятой это не всегда 1.00000 а может и 0.999999999 а как вы понимаете 0.0000001 таки больше 0 :) ) и программа превратится в чудо ящик живущий по свои правилам в зависимости от настроения и ой как вы долго можете искать подобные ошибки.
Тут же скажу что в этом случае Венгерская нотация лично мне дает следующий плюс, исправив название переменной с lSize на dSize программа не будет собрана до тех пор пока я не просмотрю и исправлю весь код где используется переменная lSize.

3) Венгерская нотация если и предназначена для контроля то только со стороны программиста;
рассмотрим пример с записью без использования нотации


int Res;

Res = (int)Param1;

вроде все ОК, компилятор не ругается и только писавший когда то знал что переменная Param1 типа DWORD
совсем другая реакция будет если вы пользуетесь нотацией и увидите код
int iRes;

iRes = (int)dwParam1;
вы скажете как же так переменной типа int присваивается значение типа DWORD могут потерятся данные? и уже уделите внимание коду и возможно исправите не тривиальную ошибку, которая может возникать довольно редко и из-за этого ее найти и обнаружить в сложной системе довольно проблематично.

4) подсветка синтаксиса это просто замечательно, но есть несколько НО и кучка ЕСЛИ;
сам очень люблю такие вещи, но простите и раскажите где скажем в Microsoft Visual Studio настроить подсветку для bool, int, long и т.д. цвета подсветки? а где это настроить в стандартном "блокноте" т.к. скажем у меня нет студии и я использую "блокнот" и командную строку для компиляции? А если я сажусь за чужой компьютер с совершенно по другому настроенной подсветкой синтаксиса?  А если я дальтоник и для меня 30% цветов (оттенков) выглядят совершенно одинаковыми? А если я разбираю код скажем в книжке или на странице сайта где нет средств для подсветки? и т.д. и т.д.
5) у Microsoft на то появились веские причины после введения новых технологий в программирование в частности "управляемого кода" при использовании которых, если придерживатся нотации действительно можно путатся и запутать других если использовать нотацию везде;
6) отношу скорее к выражению вырваному из контекста (хотя все может быть...);

И так... для себя я вижу одни плюсы и маленький минус в том что все таки эти 1-5 символов префикса надо набирать. Людей которые не используют (умышленно, не являясь противниками) Венгерскую нотацию  жестоко упрекать тоже не стал хотя мысль о том что они относятся к эгоистам меня не покидает :) Каждому самому решать что использовать а что нет, но не забывайте что в последнее время написать что то стоящее самому очень трудно и долго, и вам рано или поздно придется работать в коллективе у которого есть свои договоренности и их придется соблюдать, конечно если вы занимаетесь программированием профессионально, а не ради времяпровождения.

Hosted by uCoz