Венге́рская нота́ция (в программировании) — соглашение об именовании переменных, констант и прочих идентификаторов в коде программ. Своё название венгерская нотация получила благодаря программисту компании Майкрософт венгерского происхождения Чарльзу Симони (венг. 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]. Это может пригодиться:
btnOk
.txtSearch
и btnSearch
. Такая практика позволяет делать названия переменных короткими и в то же время осмысленными.Этот стиль выбора имён называется «венгерской» записью по названию родины руководителя отдела программирования Microsoft Чарльза Симони, который его изобрёл. (А не потому, что его использование придаёт программам такой вид, будто они написаны на венгерском языке[3])
IsLoggedIn
), count для счётчика (RefCount
), множественное число для массива (UserIds
)… В языках, в которых заглавные буквы не эквивалентны строчным, регистр букв также может кодировать что-либо.Известный противник венгерской нотации — Линус Торвальдс: «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста»[5].
Венгерская нотация.