Что такое венгерская нотация и следует ли ее использовать?

Известная цитата в кругах программистов звучит так:

В информатике есть только две сложные вещи: инвалидация кеша и именование вещей.

Венгерская нотация – это система, которая пытается немного упростить именование. Вы можете встретить венгерскую нотацию при изучении существующей кодовой базы. Возможно, у вас есть коллега, который особенно любит им пользоваться. Но что это такое и как это выглядит? И действительно ли вы должны его использовать?

Что такое венгерская нотация?

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

В венгерской системе обозначений все имена переменных начинаются с группы букв с согласованным значением. Эти буквы обычно являются сокращением типа переменной. Например, буква l может представлять длинное целое число. Аббревиатура str представляет собой строку.

Это действительно венгерский?

Да, венгерская нотация действительно была изобретена венгром! Чарльз Симони был сотрудником Microsoft, когда изобрел термин. Он был программистом в компании, работал над прикладным программным обеспечением.

В отличие от большинства других западных языков, в венгерских именах сначала идет фамилия, а затем имя. Термин «Венгерская нотация» может отсылать к этому факту, или это может быть просто счастливое совпадение. Это могло быть более естественным для Симони из-за его родного языка.

Как это выглядит?

Вместо того, чтобы называть переменную просто возрастом , в венгерской нотации используется префикс, представляющий тип этой переменной. Например, в C программист может объявить такую ​​переменную следующим образом:

 int iAge;

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

 printf("I am %d years old", iAge);

Префикс помогает напомнить нам, что мы используем правильный тип переменной.

В языке со слабой типизацией, таком как PHP, переменные могут принимать разные типы в зависимости от того, какое значение они имеют. Так что венгерская нотация потенциально более полезна:

 $iAge = 21;

Вот еще несколько примеров общей схемы венгерской нотации:

Префикс Тип Пример
б логический bLightsEnabled
c символ cLetterGrade
ул. нить strCategory
я целое число iWheels
ж плавать fMiles
C класс CPerson
{название класса} объект personLeader

Венгерские системы по сравнению с приложениями на венгерском языке

Венгерская нотация разделена. В одном углу у нас Systems Hungarian, в другом – Apps Hungarian. Разница небольшая, но очень важная.

Системный венгерский – это версия, которую люди часто связывают с венгерской нотацией. Он имеет дело исключительно с типом переменной, как мы показали выше.

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

 // an Unsafe String eg a name the user entered in a web form
$usName
// the Length of the vertical side
$lVertical
// a Count of references to an object
$cRefs

Приложения Hungarian были исходной формой венгерской нотации, и описание цели было намерением Симони. Системный венгерский язык – это своего рода мутация, которая, по мнению многих, к худшему.

Что хорошего в венгерской нотации?

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

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

А что плохого в венгерской нотации?

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

Кажется, что у Apps Notation больше возможностей, но даже у этой версии есть свои недоброжелатели. Есть хороший аргумент в пользу того, что информация о цели все равно должна быть частью типа переменной.

Любой язык, поддерживающий определяемые пользователем типы или классы, обычно может лучше достичь тех же целей. Присвоение имени переменной usName не сделает ее безопаснее. Но создание класса с именем UnsafeString позволяет компилятору проверять тип переменной.

Стоит ли использовать венгерскую нотацию?

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

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

❌ НЕ используйте венгерскую нотацию.