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

Венгерская нотация является соглашение об именах идентификаторов в компьютерное программирование, в котором имя Переменная или же функция указывает на его намерение или вид, а в некоторых диалектах тип. Оригинальная венгерская нотация использует намерение или вид в соглашении об именах и иногда называется венгерскими приложениями, поскольку она стала популярной в подразделении Microsoft Apps при разработке Word, Excel и других приложений. Поскольку подразделение Microsoft Windows приняло соглашение об именах, они использовали для именования фактический тип данных, и это соглашение стало широко распространяться через Windows API; это иногда называют Системной венгерской нотацией.

Симони: ... BCPL [имел] единственный тип, который был 16-битным словом ... не то чтобы это важно.

Буч: Если вы не продолжите венгерскую нотацию.

Симони: Абсолютно ... мы тоже перешли к типизированным языкам позже ... Но ... мы бы посмотрели на одно имя, и я бы вам много о нем рассказал ...[1]

Венгерская нотация была разработана так, чтобы быть независимой от языка, и впервые широко использовалась с BCPL язык программирования. Поскольку BCPL не имеет типов данных, кроме машины слово, в самом языке ничего не помогает программисту запоминать типы переменных. Венгерская нотация призвана исправить это, предоставляя программисту явное знание типа данных каждой переменной.

В венгерской системе обозначений имя переменной начинается с группы строчных букв, которые мнемоника для типа или назначения этой переменной, за которым следует любое имя, выбранное программистом; эту последнюю часть иногда называют собственное имя. Первый символ имени можно использовать с заглавной буквы, чтобы отделить его от индикаторов типа (см. Также CamelCase ). В противном случае регистр этого символа обозначает область действия.

История

Первоначальная венгерская нотация, которая теперь будет называться Apps Hungarian, была изобретена Чарльз Симони, программист, работавший в Xerox PARC около 1972–1981 гг., позже он стал главным архитектором Microsoft.

Название обозначения является ссылкой на страну происхождения Симони; Имена венгерских людей «перевернуты» по сравнению с большинством других европейских имен; фамилия предшествует имени. Например, англизированное имя Чарльз Симони в Венгерский изначально был "Simonyi Károly". Таким же образом имя типа предшествует «данному имени» в венгерской нотации, а не Болтовня стиль именования "тип последний" (например, aPoint и lastPoint). Этот последний стиль именования был наиболее распространен в Xerox PARC во время пребывания там Симони.

Название Apps Hungarian было изобретено с тех пор, как это соглашение использовалось в Приложения подразделение Microsoft. Венгерские системы, разработанные позже в Майкрософт Виндоус Команда разработчиков. В статье Симони упоминаются префиксы, используемые для обозначения «типа» хранимой информации. Его предложение было в значительной степени связано с украшением имен идентификаторов на основе семантической информации о том, что они хранят (другими словами, переменные цель), что соответствует Apps Hungarian. Однако его предложения не были полностью отличны от того, что стало известно как Системный Венгерский, поскольку некоторые из предложенных им префиксов содержат мало или совсем не содержат семантической информации (см. Примеры ниже).

Венгерские системы против Венгерских приложений

Обозначения систем и приложений различаются по назначению префиксов.

В системной венгерской нотации префикс кодирует фактический тип данных переменной. Например:

  • lAccountNum : переменная - это длинное целое ("л");
  • arru8NumberList : переменная есть ан обрэй из тыnsigned 8-битовые целые числа ("arru8");
  • bReadLine (bPort, & arru8NumberList) : функция с байтовым кодом возврата.
  • strName : Переменная представляет собой строку ("ул"), содержащий имя, но не указывает, как эта строка реализована.

Приложения Венгерская нотация стремится кодировать логический тип данных, а не физический тип данных; таким образом, он дает намек на то, какова цель переменной или что она представляет.

  • rwPosition : переменная представляет собой ряд ("rw");
  • usName : переменная представляет собой небезопасная строка ("нас"), который необходимо "продезинфицировать" перед использованием (например, см. внедрение кода и межсайтовый скриптинг для примеров атак, которые могут быть вызваны использованием необработанного пользовательского ввода)
  • szName : переменная - это zэро-прекращенный sтрогать ("sz"); это была одна из оригинальных приставок, предложенных Симони.

Большинство, но не все, из предложенных Simonyi префиксов имеют семантическую природу. Современному человеку кажется, что некоторые префиксы представляют физические типы данных, например sz для струнных. Однако такие префиксы все еще были семантическими, поскольку Симони предназначал венгерскую нотацию для языков, системы типов которых не могли различать некоторые типы данных, которые современные языки принимают как должное.

Ниже приведены примеры из оригинальной статьи:[2]

  • пИкс указатель на другой тип Икс; это содержит очень мало семантической информации.
  • d это префикс, означающий разницу между двумя значениями; например, dY может представлять расстояние по оси Y графика, в то время как переменная, только что вызванная у может быть абсолютной позицией. Это полностью семантический характер.
  • sz представляет собой строку с завершающим нулем или нулем. В C это содержит некоторую семантическую информацию, поскольку неясно, является ли переменная типа символ * указатель на одиночный символ, массив символов или строку с нулевым символом в конце.
  • ш отмечает переменную, которая является словом. Он практически не содержит семантической информации и, вероятно, будет считаться системным венгерским.
  • б отмечает байт, который, в отличие от w, может иметь семантическую информацию, потому что в C единственным байтовым типом данных является char, поэтому они иногда используются для хранения числовых значений. Этот префикс может устранить двусмысленность между тем, содержит ли переменная значение, которое следует рассматривать как символ или число.

Хотя в обозначении всегда используются начальные строчные буквы в качестве мнемоники, они не предписывают сами мнемонические символы. Существует несколько широко используемых соглашений (см. Примеры ниже), но можно использовать любой набор букв при условии, что они согласованы в рамках заданного кода.

Код, использующий венгерскую нотацию приложений, может иногда содержать венгерские системы при описании переменных, которые определяются исключительно в терминах их типа.

Отношение к сигилам

В некоторых языках программирования похожая нотация теперь называется сигилы встроен в язык и поддерживается компилятором. Например, в некоторых формах БАЗОВЫЙ, имя $ называет нить и считать% называет целое число. Основное различие между венгерской нотацией и сигилами состоит в том, что сигилы объявляют тип переменной на языке, тогда как венгерская нотация представляет собой чисто схему именования, не влияющую на машинную интерпретацию текста программы.

Примеры

Мнемоника указателей и массивы, которые не являются фактическими типами данных, обычно сопровождаются типом самого элемента данных:

  • pszOwner : указатель на строку с нулевым символом в конце
  • rgfpBalances : массив плавающая точка значения
  • aulColors : массив беззнаковых длинных (Системы)

Хотя венгерская нотация может быть применена к любому языку программирования и среде, она была широко принята Microsoft для использования с языком C, в частности для Майкрософт Виндоус, и его использование по-прежнему ограничено этой областью. В частности, широко использовалась венгерская нотация. евангелизированный к Чарльз Петцольд с «Программирование Windows», оригинальная (и для многих читателей окончательная) книга по Windows API программирование. Таким образом, многие часто встречающиеся конструкции венгерской нотации специфичны для Windows:

  • Для программистов, изучавших программирование Windows на C, вероятно, наиболее запоминающимися примерами являются: wParam (параметр размера слова) и lParam (параметр длинного целого числа) для WindowProc () функция.
  • hwndFoo : дескриптор окна
  • lpszBar : длинный указатель на строку с нулевым символом в конце

Обозначения иногда расширяются в C ++ включить объем переменной, опционально разделенные знаком подчеркивания.[3][4] Это расширение также часто используется без венгерской спецификации типа:

  • g_nWheels : член глобального пространства имен, целое число
  • m_nWheels : член структуры / класса, целое число
  • m_wheels, _wheels : член структуры / класса
  • s_wheels : статический член класса
  • c_wheels : статический член функции

В JavaScript код с использованием jQuery, а $ префикс часто используется, чтобы указать, что переменная содержит объект jQuery (в отличие от простого объекта DOM или какого-либо другого значения).[5]

Преимущества

(Некоторые из них применимы только к Systems Hungarian.)

Сторонники утверждают, что преимущества венгерской нотации включают:[2]

  • Тип символа можно увидеть по его названию. Это полезно при просмотре кода вне интегрированной среды разработки - например, при обзоре кода или распечатке - или когда объявление символа находится в другом файле с точки использования, например функции.
  • На языке, который использует динамическая типизация или нетипизированный, украшения, относящиеся к типам, перестают быть избыточными. В таких языках переменные обычно не объявляются как содержащие определенный тип данных, поэтому единственным ключом к пониманию того, какие операции с ними можно выполнять, являются подсказки, данные программистом, такие как схема именования переменных, документация и комментарии. Как упоминалось выше, венгерская нотация расширилась на таком языке (BCPL ).
  • Форматирование имен переменных может упростить некоторые аспекты рефакторинг кода (делая другие аспекты более подверженными ошибкам).
  • В блоке кода можно использовать несколько переменных с одинаковой семантикой: dwWidth, iWidth, fWidth, dWidth.
  • Имена переменных можно легко запомнить, зная только их типы.
  • Это приводит к более согласованным именам переменных.
  • Несоответствующее приведение типов и операции с несовместимыми типами можно легко обнаружить при чтении кода.
  • В сложных программах со многими глобальными объектами (VB / Delphi Forms) наличие базовой префиксной записи может облегчить работу по поиску компонента внутри редактора. Например, поиск строки кстати может найти все объекты Button.
  • Применение венгерской нотации более узким способом, например применение только для переменных-членов, помогает избежать конфликта имен.
  • Печатный код более понятен читателю в случае типов данных, преобразований типов, назначений, усечений и т. Д.

Недостатки

Большинство аргументов против венгерской системы обозначений - против Системы Венгерская нотация, а не Программы Венгерская нотация. Некоторые потенциальные проблемы:

  • Венгерская нотация является избыточной, когда проверка типов выполняется компилятором. Компиляторы для языков, обеспечивающие строгую проверку типов, например Паскаль убедитесь, что использование переменной автоматически соответствует ее типу; проверка на глаз является избыточной и возможна человеческая ошибка.
  • Самый современный интегрированные среды разработки отображать типы переменных по запросу и автоматически отмечать операции, использующие несовместимые типы, что делает эту нотацию в значительной степени устаревшей.
  • Венгерская нотация сбивает с толку, когда она используется для представления нескольких свойств, как в a_crszkvc30LastNameCol: а постоянный ссылка аргумент, содержащий содержимое база данных столбец Фамилия типа варчар (30) который является частью таблицы первичный ключ.
  • Это может привести к несогласованности при изменении или переносе кода. Если тип переменной изменяется, либо оформление имени переменной будет несовместимо с новым типом, либо имя переменной должно быть изменено. Особенно хорошо известен пример стандартного типа WPARAM и сопровождающего его wParam формальный параметр во многих объявлениях системных функций Windows. «W» означает «слово», где «слово» - это собственный размер слова аппаратной архитектуры платформы. Первоначально это был 16-разрядный тип для архитектур с 16-разрядным словом, но был изменен на 32-разрядный тип для архитектур с 32-разрядным словом или 64-разрядный тип для архитектур с 64-разрядным словом в более поздних версиях операционной системы, сохранив при этом исходное имя (его истинный базовый тип - UINT_PTR, то есть целое число без знака, достаточно большое, чтобы содержать указатель). Семантический импеданс и, следовательно, путаница и непоследовательность программистов от платформы к платформе, основаны на предположении, что «w» обозначает двухбайтовое 16-битное слово в этих различных средах.
  • В большинстве случаев знание использования переменной подразумевает знание ее типа. Более того, если использование переменной неизвестно, ее нельзя определить по ее типу.
  • Венгерская нотация уменьшает преимущества использования редакторов кода, поддерживающих завершение имен переменных, поскольку программист должен сначала ввести спецификатор типа, который с большей вероятностью будет конфликтовать с другими переменными, чем при использовании других схем именования.
  • Это делает код менее читаемым, скрывая назначение переменной с помощью префиксов типа и области видимости.[6]
  • Дополнительная информация о типе может недостаточно заменить более описательные имена. Например. sDatabase не сообщает читателю, что это такое. databaseName могло бы быть более описательным именем.
  • Когда имена достаточно информативны, дополнительная информация о типе может быть избыточной. Например. firstName, скорее всего, является строкой. Поэтому присвоение ему имени sFirstName только добавляет беспорядка в код.
  • Имена запомнить сложнее.
  • Несколько переменных с разные семантика может использоваться в блоке кода с похожими именами: dwTmp, iTmp, fTmp, dTmp.
  • Размещение идентификаторов типа данных или символа намерения в качестве префикса к имени поля или переменной подрывает возможность в некоторых средах программирования переходить к имени поля или переменной по алфавиту, когда пользователь начинает вводить имя. FileMaker, [7] например, одна из таких программных сред. При использовании одной из этих программных сред может быть предпочтительнее вместо этого суффиксировать имя с такими идентифицирующими символами.

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

  • Роберт Сесил Мартин (против венгерской нотации и всех других форм кодирования):

    ... в настоящее время HN и другие формы кодирования типов просто препятствия. Они затрудняют изменение имени или типа переменной, функции, члена или класса. Они затрудняют чтение кода. И они создают возможность того, что система кодирования введет читателя в заблуждение.[8]

  • Линус Торвальдс (против Систем Венгерский):

    Кодирование типа функции в имени (так называемая венгерская нотация) наносит ущерб мозгу - компилятор все равно знает типы и может их проверить, и это только сбивает программиста с толку.[9]

  • Стив МакКоннелл (для приложений на венгерском языке):

    Хотя венгерское соглашение об именах больше не имеет широкого распространения, основная идея стандартизации кратких и точных сокращений продолжает иметь значение. Стандартизированные префиксы позволяют точно проверять типы, когда вы используете абстрактные типы данных, которые ваш компилятор не может обязательно проверить.[10]

  • Бьярне Страуструп (против Систем Венгерский для C ++):

    Нет, я не рекомендую «венгерский». Я рассматриваю венгерский (встраивание сокращенной версии типа в имя переменной) как метод, который может быть полезен в нетипизированных языках, но совершенно не подходит для языка, поддерживающего универсальное программирование и объектно-ориентированное программирование - оба из которых подчеркивают выбор операций на основе типа и аргументов (известных языку или поддержке времени выполнения). В этом случае «построение типа объекта на именах» просто усложняет и минимизирует абстракцию.[11]

  • Джоэл Спольски (для приложений на венгерском языке):

    Если вы внимательно читаете статью Симони, то он имел в виду то же соглашение об именах, которое я использовал в моем примере выше, где мы решили, что нас означало небезопасную строку и s означало безопасную строку. Они оба типа нить. Компилятор вам не поможет, если вы назначите одно другому, а Intellisense [an Интеллектуальное завершение кода система] не скажет вам бупкис. Но они семантически разные. Они должны интерпретироваться по-разному и обрабатываться по-разному, и необходимо будет вызвать какую-то функцию преобразования, если вы назначите одну другому, или у вас будет ошибка во время выполнения. Если повезет. У Apps Hungarian по-прежнему огромная ценность, поскольку они увеличивают коллокацию в коде, что упрощает чтение, запись, отладку и поддержку кода, и, что наиболее важно, неправильный код выглядит неправильно .... (Системы Hungarian) было тонким, но полным непониманием намерений и практики Симони.[12]

  • Microsoft Рекомендации по дизайну[13] отговаривают разработчиков от использования системной венгерской нотации при выборе имен для элементов в библиотеках классов .NET, хотя это было обычным явлением на предыдущих платформах разработки Microsoft, таких как Visual Basic 6 и ранее. В этих Рекомендациях по проектированию ничего не говорится об именах для локальных переменных внутри функций.

Смотрите также

Рекомендации

  1. ^ "Устная история Чарльза Симони" (PDF). Archive.computerhistory.org accessdate = 5 августа 2018 г..
  2. ^ а б Чарльз Симони (Ноябрь 1999 г.). «Венгерская нотация». Библиотека MSDN. Microsoft Corp.
  3. ^ «Стиль программирования Mozilla». Developer.mozilla.org. Получено 17 марта 2015.
  4. ^ «Рекомендации по стилю кодирования Webkit». Webkit.org. Получено 17 марта 2015.
  5. ^ «Почему переменная JavaScript должна начинаться со знака доллара?». Переполнение стека. Получено 12 февраля 2016.
  6. ^ Джонс, Дерек М. (2009). Новый стандарт C: культурный и экономический комментарий (PDF). Эддисон-Уэсли. п. 727. ISBN  0-201-70917-1.
  7. ^ «Создайте приложение для любой задачи - FileMaker - дочерняя компания Apple». Filemaker.com. Получено 5 августа 2018.
  8. ^ Мартин, Роберт Сесил (2008). Чистый код: руководство по созданию гибкого программного обеспечения. Редмонд, Вашингтон: Prentice Hall, PTR. ISBN  0-13-235088-2.
  9. ^ "Стиль кодирования ядра Linux". Ядро Linux документация. Получено 9 марта 2018.
  10. ^ МакКоннелл, Стив (2004). Код завершен (2-е изд.). Редмонд, Вашингтон: Microsoft Press. ISBN  0-7356-1967-0.
  11. ^ Страуструп, Бьярне (2007). "Часто задаваемые вопросы о стилях и методах C ++ Бьярна Страуструпа". Получено 15 февраля 2015.
  12. ^ Спольски, Джоэл (2005-05-11). "Сделать неправильный код неправильным". Джоэл о программном обеспечении. Получено 2005-12-13.
  13. ^ «Рекомендации по проектированию для разработки библиотек классов: общие правила именования». Получено 2008-01-03.

внешняя ссылка