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

Активно используем уже несколько месяцев венгерскую нотацию. Лично я доволен, наконец-то я понял смысл нотации, увидел ее в деле и применил в своем проекте, оставшись при этом полностью удовлетворенным.

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

Статья про стандарт оформления кода.

Так и оказалось, это было первое (лично у меня) самое успешное, эффективное и быстро показавшее себя решение.

Определение и история

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

Префикс — в простом понимании это приставка к слову.

Рассматривая в контексте программирования, в случае:

int g_iNumber = 1;

int isEnable = true;

префиксами имен являются:

  • g_i для g_iNumber
  • is для isEnable

Свое название данная нотация получила благодаря программисту из Microsoft Чарльзу Симони, который предложил ее еще во времена первых версий MS-DOS.

Позже венгерская нотация стала внутренним стандартом Microsoft.

Пруфлинки здесь.

Описание

Таблица с описанием префиксов  можно глянуть в стандарте оформления кода который мы приняли.

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

int iData = (int)dwData;

В данном случае каждая переменная в качестве префикса имеет указание типа.

Другой более насущный пример:

class CData
{
	CData(int iData)
	{
		m_iData = iData;
	}

protected:

	int m_iData;

};

В данном примере имя класса CObject имеет префикс «C» означающее «class» (класс), все члены класса имею префикс «m_» означающий «member» (член), то есть спутать их с локальными переменными уже нельзя. Таким образом, можно писать подобным образом:

CData oData = CData(1);

либо:

CData g_oData = CData(1);

В первом случае oData имеет префикс «o» означающий «object» (объект), и характеризует локальную переменную, во тором случае переменная имеет префикс «g_» характеризующий ее как глобальную переменную («global»).

То есть, при использовании венгерской нотации можно оперировать один словом, к примеру «Data», но меняя префиксы, это слово будет по разному характеризовать именуемый объект:

  • iData — локальная переменная integer типа
  • CData — класс
  • oData — локальная переменная объект класса
  • g_oData — глобальная переменная объект класса

Как видно из примера, префиксы хранят в себе смысл имени.

Система префиксов зависит от многих факторов:

  • язык программирования, так как чем больше свободы для программиста предоставляется тем больше контроля он должен сам себе создавать
  • стиль программирования, так как существуют сторонники использовать только смысловые нагрузка без типов (типа m_, g_ и прочее), а есть те кто придерживает полного использования префиксов
  • личные предпочтения

Плюсы и минусы

У венгерской нотации есть последователи и противники.

Венгерская нотация полезна:

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

С помощью венгерской нотации можно:

  • четко задать область видимости в имени переменной
  • использовать одно и тоже основное смысловое имя для разных данных (класс CData, объект oData,  переменная iData)
  • читать код без каких либо специальных дополнительных средств IDE, не надо наводить курсор мыши на имя переменной чтобы узнать какого она типа, тип ясен из имени
  • wikipedia говорит что венгерскую нотацию можно считать стандартом сокращений
  • предположительно, чтение кода удобно для дальтоников
  • удобно разбирать код написанный в книгах либо в тех местах где нет подсветки синтаксиса
  • читать чужой код и заботиться об удобочитаемости другими программистами

Минусы венгерской нотации:

  • бытует мнение что префиксы усложняют восприятие кода, по мнению Линуса Торвальдса (wiki, web archive) «компилятор и так знает типы», однако при чем здесь компилятор когда речь идет об удобочитаемости программистом?
  • при изменении типа переменной потребуется менять имя переменной (но быть может это ошибки проектирования?)
  • возможны проблемы с системой автодокументации, если она не распознает префиксы то сортировка по алфавиту такого кода будет неожиданной.

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

Поделиться:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*