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

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

Венге́рская нота́ция в программировании — соглашение об именовании переменных, констант и прочих идентификаторов в коде программ. Своё название венгерская нотация получила благодаря программисту компании Microsoft венгерского происхождения Чарльзу Симони (венг. Simonyi Károly), предложившему её ещё во времена разработки первых версий MS-DOS. Эта система стала внутренним стандартом Майкрософт[1].

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

Применяемая система префиксов зависит от многих факторов:

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

Содержание

Примеры

Префиксы, задающие тип

Префикс Сокращение от Смысл Пример
s string строка sClientName
sz zero-terminated string строка, ограниченная нулевым символом szClientName
n, i int целочисленная переменная nSize, iSize
l long длинное целое lAmount
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
v void отсутствие типа vReserved

Как видно в приведённом примере, префикс может быть и составным. Например, для именования строковой переменной-члена класса использована комбинация префиксов «m_» и «s» (m_sAddress).

Префиксы, задающие смысл

Венгерская нотация для приложений:

Префикс Сокращение от Смысл Пример
i index Индекс int ix; Array[ix] = 10;
d delta Разница между значениями int a, b; ... dc = b - a;
n number Количество size_t nFound = 0;

За и против

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

Преимущества

  • Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать подтип переменной — например, int cPrice может означать, что переменная имеет не просто целый тип, а валютный (currency). Именно такое применение префиксов было предложено Симони[2]. Это может пригодиться:
    • В низкоуровневом программировании (когда набор доступных типов настолько узок, что, например, целый тип не отличается от булевого).
    • В языках с динамической типизацией, например PHP, где одна и та же переменная может хранить значения любого типа.
    • В инженерных расчётах (для записи единиц измерения). Это позволяет избавиться от немалого количества ошибок простым подсчётом размерностей.
    • В других местах, где переменные одного и того же типа предназначены для хранения разнородных данных — например, в коде защиты от компьютерных взломщиков префикс может указывать на «безопасные» и «небезопасные» данные (SQL-инъекция, XSS).
  • Венгерская нотация удобна для написания больших программ в неполнофункциональных (по современным меркам) редакторах без автоматизированной навигации по тексту. Скорее всего, именно поэтому она стала стандартным стилем кода в WinAPI.
  • Удобно при именовании объектов, для которых тип очевиден — например, кнопку «OK» можно назвать btnOk.
  • Две переменные разного типа, но объединённые логически, могут иметь имена, отличающиеся лишь префиксом. Например, поле ввода для поиска и кнопка «Поиск» могут именоваться как txtSearch и btnSearch. Такая практика позволяет делать названия переменных короткими и в то же время осмысленными.
Шутка

Этот стиль выбора имён называется «венгерской» записью по названию родины руководителя отдела программирования Microsoft Чарльза Симони, который его изобрёл. (А не потому, что его использование придаёт программам такой вид, будто они написаны на венгерском языке[3])

А. Голуб. Верёвка достаточной длины.

Недостатки

  • Некоторые программисты считают, что использование префиксов делает имена переменных менее понятными и, таким образом, ухудшает читаемость кода.[4]
  • Если известно имя переменной без префиксов, подчас трудно восстановить её префиксы.
  • Система автодокументации, если она не понимает системы префиксов, отсортирует алфавитный список по префиксу, что может отрицательно сказаться на качестве документации. Впрочем, имена функций обычно префиксами не снабжают.
  • Запись нескольких префиксов из-за частого использования заглавных букв и знаков подчёркивания может стать «пляской на кнопке  ⇧ Shift ».
  • Средства навигации, которые включены в современные редакторы кода, и так позволяют видеть тип любой переменной и быстро переходить к точке, где она определена — то есть, использование префиксов может быть избыточным.
  • При изменении типа потребуется изменять имя переменной (большинство программистских редакторов не могут делать это автоматически).[4]
  • Существуют и другие средства задания типа переменной в её имени: например, слова is, has и т. д. для булевского типа (IsLoggedIn), count для счётчика (RefCount), множественное число для массива (UserIds). В языках, в которых заглавные буквы не эквивалентны строчным, регистр букв также может кодировать что-либо.

Известный противник венгерской нотации — Линус Торвальдс: «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста»[5].

См. также

Примечания

  1. Hungarian Notation
  2. Джоэл Спольски. Как заставить неправильный код выглядеть неправильно
  3. Венгерский язык, хоть и имеет латинский алфавит, считается крайне неудобочитаемым для неосведомлённых.
  4. 1 2 Inside C++ — Венгерская нотация
  5. «Linux kernel coding style». Документация по ядру Linux (на английском).

Wikimedia Foundation. 2010.

Игры ⚽ Нужно решить контрольную?

Полезное


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

  • Венгерская нотация — — соглашение программистов об именовании переменных, констант и прочих идентификаторов в коде программы. Свое название венгерская нотация получила благодаря программисту компании Майкрософт венгерского происхождения Чарльзу Шимоньи(венг.… …   Справочник технического переводчика

  • Динамическая типизация — Типизация данных Типобезопасность Вывод типов Динамическая типизация Статическая типизация Строгая типизация Мягкая типизация Зависимые типы Утиная типизация Основная статья: Строгая типизация Динамическая типизация  приём, широко… …   Википедия

  • Переменная (программирование) — У этого термина существуют и другие значения, см. Переменная. Переменная в императивном программировании  поименованная, либо адресуемая иным способом область памяти, адрес которой можно использовать для осуществления доступа к данным.… …   Википедия

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

  • Стандарт оформления кода — (стандарт кодирования, стиль программирования) (англ. coding standards, coding convention или programming style)  набор правил и соглашений, используемых при написании исходного кода на некотором языке программирования. Наличие общего… …   Википедия

  • Шимоньи, Чарлз — Чарльз Симони Космонавт Страна: США Специальность: Программный архитектор Миссии: Союз ТМА 10 Союз ТМА 9 …   Википедия

  • Зарезервированное слово — (или ключевое слово)  в языках программирования слово, имеющее специальное значение. Идентификаторы с такими именами запрещены. В лексическом анализе зарезервированное слово фигурирует как одна лексема особого типа. Содержание 1 Примеры 2… …   Википедия

  • Валютный тип — Тип данных Содержание 1 История 2 Определение 3 Необходимость использования типов данных …   Википедия

  • Симони, Чарльз — Чарльз Симони Космонавт Страна …   Википедия

  • Список изобретателей — Здесь представлен список изобретателей, которые обогатили мир, сделали изобретения, которыми пользуется всё человечество. Помимо имени изобретателя даются годы его жизни и страна (или страны), в которой он жил и работал, а также наиболее значимые …   Википедия


Поделиться ссылкой на выделенное

Прямая ссылка:
Нажмите правой клавишей мыши и выберите «Копировать ссылку»