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

Материал из Википедии — свободной энциклопедии
Это старая версия этой страницы, сохранённая 194.6.220.67 (обсуждение) в 10:30, 15 апреля 2008 (Преимущества). Она может серьёзно отличаться от текущей версии.
Перейти к навигации Перейти к поиску

Венге́рская нота́ция — соглашение программистов об именовании переменных, констант и прочих идентификаторов в коде программ. Свое название венгерская нотация получила благодаря программисту компании Майкрософт венгерского происхождения Чарльзу Шимоньи (венг. 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».
  • Средства навигации, которые включены в современные редакторы кода, и так позволяют видеть тип любой переменной и быстро переходить к точке, где она определена — то есть, использование префиксов может быть избыточным.
  • При изменении типа потребуется изменять имя переменной (большинство программистских редакторов не могут делать это автоматически).

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

Сноски

  1. Hungarian Notation
  2. Джоэл Спольски. Как заставить неправильный код выглядеть неправильно

См. также