Венгерская нотация
Венге́рская нота́ция — соглашение программистов об именовании переменных, констант и прочих идентификаторов в коде программ. Свое название венгерская нотация получила благодаря программисту компании Майкрософт венгерского происхождения Чарльзу Шимоньи (венг. Károly Simonyi), предложившего её ещё во времена разработки первых версий MS-DOS. Эта система стала внутренним стандартом Майкрософт[1].
Суть венгерской нотации сводится к тому, что имена идентификаторов предваряются заранее оговоренными префиксами, состоящими из одного или нескольких символов. При этом, как правило, ни само наличие префиксов, ни их написание не являются требованием языков программирования, и у каждого программиста (или коллектива программистов) могут быть своими.
Применяемая система префиксов зависит от многих факторов:
- языка программирования (чем более «либеральный» синтаксис, тем больше контроля требуется со стороны программиста — а значит, тем более развита система префиксов. К тому же, использование в каждом из языков программирования своей терминологии также вносит особенности в выбор префиксов);
- стиля программирования (объектно-ориентированный код может вообще не требовать префиксов, в то время как в «монолитном» для разборчивости они зачастую нужны);
- предметной области (например, префиксы могут применяться для записи единиц измерения);
- доступных средств автоматизации (генератор документации, навигация по коду, предиктивный ввод текста, автоматизированный рефакторинг и т. д.).
Примеры
Префикс | Сокращение от | Смысл | Пример |
---|---|---|---|
s | string | строка | sClientName
|
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
|
Как видно в приведенном примере, префикс может быть и составным. Например, для именования строковой переменной-члена класса использована комбинация префиксов «m_» и «s» (m_sAddress
).
За и против
Среди программистов есть как сторонники, так и противники использования венгерской нотации. Противники утверждают, что она громоздка и лишь ухудшает понимание кода. Сторонники утверждают, что слишком многие неверно понимают основную идею и неправильно пользуются нотацией. Далее приводятся основные доводы сторон.
Преимущества
- Если встроенного механизма типизации не хватает, венгерская нотация позволяет записывать подтип переменной — например,
int cPrice
может означать, что переменная имеет не просто целый тип, а валютный (currency). Именно такое применение префиксов было предложено Шимоньи[2]. Это может пригодиться:- В низкоуровневом программировании (когда набор доступных типов настолько узок, что, например, целый тип не отличается от булевого).
- В языках с динамической типизацией, например PHP, где одна и та же переменная может хранить значения любого типа.
- В инженерных расчётах (для записи единиц измерения).
- В других местах, где переменные одного и того же типа предназначены для хранения разнородных данных — например, в коде защиты от хакеров префикс может указывать на «безопасные» и «небезопасные» данные (см. SQL-инъекция, XSS).
- Удобно при именовании объектов, для которых тип очевиден — например, кнопку «OK» можно назвать
btnOk
. - Две переменные разного типа, но объединённые логически, могут иметь имена, отличающиеся лишь префиксом. Например, поле ввода для поиска и кнопка «Поиск» могут именоваться как
txtSearch
иbtnSearch
.
Недостатки
- Некоторые программисты считают, что использование префиксов делает имена переменных менее понятными и, таким образом, ухудшает читаемость кода.
- Если известно имя переменной без префиксов, подчас трудно восстановить её префиксы.
- Система автодокументации, если она не понимает системы префиксов, отсортирует алфавитный список по префиксу, что может отрицательно сказаться на качестве документации. Впрочем, имена функций обычно префиксами не снабжают.
- Запись нескольких префиксов из-за частого использования заглавных букв и знаков подчёркивания может стать «пляской на кнопке Shift».
- Средства навигации, которые включены в современные редакторы кода, и так позволяют видеть тип любой переменной и быстро переходить к точке, где она определена — то есть, использование префиксов может быть избыточным.
- При изменении типа потребуется изменять имя переменной (большинство программистских редакторов не могут делать это автоматически).
Известный противник венгерской нотации — Линус Торвальдс: «Вписывание типа переменной в её имя (так называемая венгерская нотация) ущербно — компилятор и так знает типы и может проверить их, и это запутывает программиста».
Сноски
См. также
Это заготовка статьи об информационных технологиях и вычислительной технике. Помогите Википедии, дополнив её. |