Введение
Идентификаторная нотация (информатика)
Венгерская нотация — это соглашение об именовании идентификаторов в программировании, при котором имя переменной или функции указывает на её назначение или категорию, а в некоторых вариантах — на её тип. Изначальная венгерская нотация использует только назначение или категорию в соглашении об именовании и иногда называется Apps Hungarian, так как она стала популярной в подразделении Microsoft Apps при разработке приложений Microsoft Office. Когда подразделение Microsoft Windows приняло это соглашение, оно основывалось на фактическом типе данных, и эта конвенция широко распространилась через Windows API; её иногда называют системной венгерской нотацией. Венгерская нотация была разработана как независимая от языка и впервые получила широкое распространение в языке программирования BCPL. Поскольку BCPL не имеет типов данных, кроме машинного слова, сам язык не помогает программисту запоминать типы переменных. Венгерская нотация призвана решить эту проблему, предоставляя программисту явную информацию о типе данных каждой переменной. В венгерской нотации имя переменной начинается с группы строчных букв, являющихся мнемоническими обозначениями типа или назначения переменной, за которыми следует любое имя, выбранное программистом; эта последняя часть иногда выделяется как собственно имя. Первая буква собственно имени может быть написана с заглавной буквы, чтобы отделить её от индикаторов типа (см. также CamelCase). В противном случае регистр этой буквы указывает область видимости.
Hungarian notation is an identifier naming convention in computer programming in which the name of a variable or function indicates its intention or kind, or in some dialects, its type. The original Hungarian notation uses only intention or kind in its naming convention and is sometimes called Apps Hungarian as it became popular in the Microsoft Apps division in the development of Microsoft Office applications. When the Microsoft Windows division adopted the naming convention, they based it on the actual data type, and this convention became widely spread through the Windows API; this is sometimes called Systems Hungarian notation. Hungarian notation was designed to be language independent, and found its first major use with the BCPL programming language. Because BCPL has no data types other than the machine word, nothing in the language itself helps a programmer remember variables' types. Hungarian notation aims to remedy this by providing the programmer with explicit knowledge of each variable's data type. In Hungarian notation, a variable name starts with a group of lower case letters which are mnemonics for the type or purpose of that variable, followed by whatever name the programmer has chosen; this last part is sometimes distinguished as the given name. The first character of the given name can be capitalized to separate it from the type indicators (see also CamelCase). Otherwise the case of this character denotes scope.
История
Оригинальная венгерская нотация была изобретена Чарльзом Симони, программистом, работавшим в 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 и более ранние версии. Эти руководства по проектированию не регулируют конвенции именования локальных переменных внутри функций.