Введение

Идентификаторная нотация (информатика)
Венгерская нотация — это соглашение об именовании идентификаторов в программировании, при котором имя переменной или функции указывает на её назначение или категорию, а в некоторых вариантах — на её тип. Изначальная венгерская нотация использует только назначение или категорию в соглашении об именовании и иногда называется Apps Hungarian, так как она стала популярной в подразделении Microsoft Apps при разработке приложений Microsoft Office. Когда подразделение Microsoft Windows приняло это соглашение, оно основывалось на фактическом типе данных, и эта конвенция широко распространилась через Windows API; её иногда называют системной венгерской нотацией. Венгерская нотация была разработана как независимая от языка и впервые получила широкое распространение в языке программирования BCPL. Поскольку BCPL не имеет типов данных, кроме машинного слова, сам язык не помогает программисту запоминать типы переменных. Венгерская нотация призвана решить эту проблему, предоставляя программисту явную информацию о типе данных каждой переменной. В венгерской нотации имя переменной начинается с группы строчных букв, являющихся мнемоническими обозначениями типа или назначения переменной, за которыми следует любое имя, выбранное программистом; эта последняя часть иногда выделяется как собственно имя. Первая буква собственно имени может быть написана с заглавной буквы, чтобы отделить её от индикаторов типа (см. также CamelCase). В противном случае регистр этой буквы указывает область видимости.

История

Оригинальная венгерская нотация была изобретена Чарльзом Симони, программистом, работавшим в Xerox PARC примерно в 1972–1981 годах, а затем ставшим главным архитектором в Microsoft. Название нотации отсылает к стране происхождения Симони, а также, по словам Энди Герцфельда, к тому, что программы, написанные с её использованием, "выглядели так, будто на каком-то непонятном иностранном языке". Венгерские имена "обратные" по сравнению с большинством других европейских имен: фамилия стоит перед именем. Например, имя "Чарльз Симони" в венгерском языке изначально записывалось как "Симони Карой". Аналогичным образом, в венгерской нотации имя типа предшествует "имени" переменной. Похожий стиль именования Smalltalk "type last" (например, aPoint и lastPoint) был распространен в Xerox PARC во время работы Симони. В научной работе Симони о нотации упоминаются префиксы, используемые для указания "типа" хранимой информации. pX – это указатель на тип X; он содержит очень мало семантической информации. d – префикс, обозначающий разницу между двумя значениями; например, dY может представлять расстояние вдоль оси Y графика, в то время как переменная с именем y может обозначать абсолютную позицию. Это полностью семантическое назначение. sz – строка, завершаемая нулевым символом. В языке C это имеет некоторую семантическую значимость, поскольку неясно, является ли переменная типа char* указателем на один символ, массивом символов или строкой, завершаемой нулевым символом. w обозначает слово. Это практически не несет семантической информации и, вероятно, будет отнесено к Systems Hungarian. b обозначает байт, который, в отличие от w, может нести семантическую информацию, поскольку в C единственным типом данных размером в байт является char, поэтому они иногда используются для хранения числовых значений. Этот префикс может устранить неоднозначность в отношении того, следует ли рассматривать значение переменной как символ или число. Хотя в нотации всегда используются строчные буквы в качестве мнемонических обозначений, сами мнемоники не определены. Существует несколько широко используемых соглашений (см. примеры ниже), но можно использовать любой набор букв, если он последовательно применяется в пределах одного блока кода. Код, использующий Apps Hungarian, может иногда содержать элементы Systems Hungarian при описании переменных, которые определены исключительно с точки зрения их типа.

Связь с гербами

В некоторых языках программирования аналогичная нотация, теперь называемая сигилами, встроена в язык и обеспечивается компилятором. Например, в некоторых диалектах BASIC переменная с именем name$ обозначает строку, а count% – целое число. Главное отличие между венгерской нотацией и сигилами заключается в том, что сигилы объявляют тип переменной непосредственно в языке, в то время как венгерская нотация – это лишь схема именования, не влияющая на машинную интерпретацию кода программы.

Известные мнения

Роберт Сесил Мартин (против венгерской нотации и всех других форм кодирования): в наши дни HN и другие формы кодирования типов – это просто препятствия. Они усложняют изменение имени или типа переменной, функции, члена или класса. Они затрудняют чтение кода и создают вероятность того, что система кодирования введет читателя в заблуждение. Линус Торвальдс (против Systems Hungarian): Кодирование типа функции в имя (так называемая венгерская нотация) – это глупость. Компилятор и так знает типы и может их проверить, а это только сбивает с толку программиста. Стив Макконнелл (за Apps Hungarian): Хотя венгерская конвенция именования больше не получила широкого распространения, основная идея стандартизации на кратких и точных сокращениях по-прежнему ценна. Стандартизированные префиксы позволяют точно проверять типы при использовании абстрактных типов данных, которые компилятор не всегда может проверить. Бьярн Строструп (против Systems Hungarian для C++): Нет, я не рекомендую «венгерскую» нотацию. Я считаю, что «венгерская» нотация (встраивание сокращенной версии типа в имя переменной) может быть полезна в языках без строгой типизации, но совершенно непригодна для языка, поддерживающего обобщенное и объектно-ориентированное программирование, которые оба делают акцент на выборе операций на основе типа и аргументов (известных языку или среде выполнения). В этом случае «встраивание типа объекта в имя» просто усложняет и уменьшает абстракцию. Джоэл Спольски (за Apps Hungarian): Если внимательно прочитать статью Симони, то станет ясно, что он имел в виду ту же конвенцию именования, что и в моем примере выше, где мы решили, что `us` означает небезопасную строку, а `s` – безопасную строку. Оба они имеют тип `string`. Компилятор не поможет, если присвоить один другому, и Intellisense [интеллектуальная система автозавершения кода] не сообщит вам ничего полезного. Но они семантически различны. Их нужно интерпретировать и обрабатывать по-разному, и потребуется функция преобразования, если вы присвоите один другому, иначе возникнет ошибка во время выполнения. Если повезет. Apps Hungarian по-прежнему имеет большую ценность, поскольку повышает сопряженность в коде, что облегчает чтение, написание, отладку и поддержку кода, и, что самое главное, делает ошибочный код выглядящим ошибочным. (Systems Hungarian) было тонким, но полным непониманием намерений и практики Симони. Руководство по проектированию Microsoft не рекомендует разработчикам использовать системную венгерскую нотацию при выборе имен для элементов в библиотеках классов .NET, хотя она была распространена на предыдущих платформах разработки Microsoft, таких как Visual Basic 6 и более ранние версии. Эти руководства по проектированию не регулируют конвенции именования локальных переменных внутри функций.