Венгерская нотация¶
Венгерская нотация — это соглашение об именовании идентификаторов (переменных, констант, функций, типов данных) в программировании, которое предписывает добавлять к имени идентификатора префикс, кодирующий его тип данных или семантическое назначение. Название получила в честь венгерского программиста Чарльза Симони, который работал в компании Microsoft и впервые предложил эту систему в 1980-х годах. Венгерская нотация была широко распространена в ранних версиях Windows и в языках, не имеющих строгой статической типизации (например, в C и C++), однако со временем её популярность снизилась из-за критики за избыточность и усложнение кода.
¶История возникновения
Венгерская нотация была разработана Чарльзом Симони (Charles Simonyi) в начале 1980-х годов, когда он работал в корпорации Xerox PARC, а затем в Microsoft. Симони, имевший венгерское происхождение, заимствовал идею из практики венгерских лингвистов, которые использовали префиксы для обозначения грамматических категорий. В контексте программирования он предложил добавлять к именам переменных префиксы, указывающие на их тип данных. Это должно было помочь программистам быстрее понимать, какие операции допустимы с данной переменной, и избегать ошибок, связанных с несоответствием типов.
Первоначально нотация применялась в проектах Microsoft, в частности при разработке операционной системы Windows и приложений для неё. В 1990-х годах она стала стандартом де-факто для многих коммерческих проектов на C и C++, особенно в среде Windows API. Однако с развитием языков со строгой статической типизацией (например, Java, C#) и появлением более мощных сред разработки, которые автоматически отображают типы, необходимость в такой нотации снизилась.
¶Основные принципы
Венгерская нотация основана на добавлении к имени идентификатора одного или нескольких префиксов, которые кодируют информацию о типе данных. Существует две основные разновидности: системная венгерская нотация (Systems Hungarian) и прикладная венгерская нотация (Apps Hungarian).
¶Системная венгерская нотация
В этой версии префиксы указывают на конкретный тип данных языка программирования. Например, для C и C++ использовались следующие префиксы:
i— целое число (int)f— число с плавающей точкой (float)d— число двойной точности (double)c— символ (char)s— строка (string)b— логическое значение (bool)p— указатель (pointer)lp— длинный указатель (long pointer)h— дескриптор (handle)sz— строка, завершающаяся нулём (zero-terminated string)
Пример: переменная iCount означает целое число, хранящее количество; szName — строку, завершающуюся нулём, содержащую имя.
¶Прикладная венгерская нотация
В этой версии префиксы кодируют не тип данных, а семантическое значение или назначение переменной. Например:
rw— количество строк (row)col— количество столбцов (column)x— координата по оси Xy— координата по оси Yh— высота (height)w— ширина (width)id— идентификаторp— позиция (position)
Пример: переменная xPos — координата по оси X; hWnd — дескриптор окна (handle to window).
Прикладная нотация считается более полезной, так как она помогает избежать семантических ошибок, например, смешивания координат по разным осям.
¶Примеры использования
Венгерская нотация широко применялась в коде Windows API. Например, в функциях и структурах Windows часто встречаются имена с префиксами:
HWND hWnd— дескриптор окна (handle to window)LPCTSTR lpszString— длинный указатель на константную строку, завершающуюся нулёмUINT uMsg— беззнаковое целое, представляющее сообщение WindowsWPARAM wParam— параметр сообщения (word parameter)LPARAM lParam— длинный параметр сообщения (long parameter)
В современных проектах на C# или Java венгерская нотация практически не используется, так как эти языки имеют строгую типизацию и поддерживают вывод типов. Однако в некоторых устаревших кодовых базах (например, в коде Microsoft Office или старых драйверах) она всё ещё встречается.
¶Критика и недостатки
Венгерская нотация подвергалась критике по нескольким причинам:
- Избыточность: Добавление префиксов увеличивает длину имён и делает код менее читаемым, особенно при использовании длинных префиксов (например,
lpsz). - Несоответствие современным языкам: В языках со строгой статической типизацией (C#, Java, TypeScript) тип переменной известен компилятору и среде разработки, поэтому префиксы дублируют информацию.
- Ошибки при изменении типа: Если тип переменной меняется, необходимо переименовывать все её вхождения, что может привести к путанице.
- Сложность обучения: Для новичков венгерская нотация может быть неочевидной и требовать запоминания множества префиксов.
- Семантическая неоднозначность: Прикладная нотация может быть неоднозначной, если один и тот же префикс используется для разных семантических категорий.
Известный программист и автор книг по разработке Стив Макконнелл в своей книге «Совершенный код» (1993) рекомендовал использовать венгерскую нотацию только в ограниченных случаях, например, для различения переменных с одинаковым типом, но разным семантическим значением.
¶Современное состояние
В современной разработке программного обеспечения венгерская нотация считается устаревшей практикой. Большинство современных руководств по стилю кода (например, для C#, Java, Python, JavaScript) рекомендуют использовать понятные имена без префиксов, полагаясь на типизацию языка и средства IDE. Однако в некоторых нишах, таких как разработка драйверов или встраиваемых систем, где используется C, она всё ещё может применяться.
В Microsoft официальные рекомендации по стилю кода для .NET (C#) и современных проектов на C++ (например, в стандарте C++ Core Guidelines) не рекомендуют использовать венгерскую нотацию. Исключение составляют только случаи, когда префиксы кодируют семантическое значение, а не тип данных (прикладная нотация).
¶Источники
- Чарльз Симони, «The Hungarian Notation» (статья в Microsoft Systems Journal, 1989)
- Стив Макконнелл, «Совершенный код» (1993)
- Microsoft Docs, «Hungarian Notation» (архивная документация Windows)
- C++ Core Guidelines, «NL.5: Avoid Hungarian notation» (2015)
- Книга «Code Complete» (1993, 2004) — критика и рекомендации по именованию
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


