Открыть сервис

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

Венгерская нотация — это соглашение об именовании идентификаторов (переменных, констант, функций, типов данных) в программировании, которое предписывает добавлять к имени идентификатора префикс, кодирующий его тип данных или семантическое назначение. Название получила в честь венгерского программиста Чарльза Симони, который работал в компании 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 — координата по оси X
  • y — координата по оси Y
  • h — высота (height)
  • w — ширина (width)
  • id — идентификатор
  • p — позиция (position)

Пример: переменная xPos — координата по оси X; hWndдескриптор окна (handle to window).

Прикладная нотация считается более полезной, так как она помогает избежать семантических ошибок, например, смешивания координат по разным осям.

Примеры использования

Венгерская нотация широко применялась в коде Windows API. Например, в функциях и структурах Windows часто встречаются имена с префиксами:

  • HWND hWnd — дескриптор окна (handle to window)
  • LPCTSTR lpszString — длинный указатель на константную строку, завершающуюся нулём
  • UINT uMsg — беззнаковое целое, представляющее сообщение Windows
  • WPARAM wParam — параметр сообщения (word parameter)
  • LPARAM lParam — длинный параметр сообщения (long parameter)

В современных проектах на C# или Java венгерская нотация практически не используется, так как эти языки имеют строгую типизацию и поддерживают вывод типов. Однако в некоторых устаревших кодовых базах (например, в коде Microsoft Office или старых драйверах) она всё ещё встречается.

Критика и недостатки

Венгерская нотация подвергалась критике по нескольким причинам:

  1. Избыточность: Добавление префиксов увеличивает длину имён и делает код менее читаемым, особенно при использовании длинных префиксов (например, lpsz).
  2. Несоответствие современным языкам: В языках со строгой статической типизацией (C#, Java, TypeScript) тип переменной известен компилятору и среде разработки, поэтому префиксы дублируют информацию.
  3. Ошибки при изменении типа: Если тип переменной меняется, необходимо переименовывать все её вхождения, что может привести к путанице.
  4. Сложность обучения: Для новичков венгерская нотация может быть неочевидной и требовать запоминания множества префиксов.
  5. Семантическая неоднозначность: Прикладная нотация может быть неоднозначной, если один и тот же префикс используется для разных семантических категорий.

Известный программист и автор книг по разработке Стив Макконнелл в своей книге «Совершенный код» (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 →