Лекция: Венгерская запись
При наличии строгой типизации данных очень полезной оказывается возможность узнавать тип переменной по ее наименованию непосредственно в тексте программ. В этом случае некорректное применение переменных бросается в глаза и позволяет избежать многих сложно локализуемых ошибок.
Для этого может использоваться специальная запись имен переменных. Впервые такая запись имен была предложена Чарльзом Симони (Charles Simonyi) и обоснована в его докторской диссертации. Возможно, потому что Симони родился в Будапеште и образованные по его системе наименования причудливы (на первый взгляд), как венгерский язык, за его методикой записи закрепилось название «венгерская запись». В настоящее время Симони является ведущим инженером Microsoft, а венгерская запись стала общепризнанной при программировании под Windows.
Идея венгерской записи заключается в прибавлении к идентификаторам коротких префиксов, определяющих тип и некоторые другие важные характеристики переменной. Префиксы принято записывать строчными буквами, а имя переменной с заглавной буквы. Поскольку венгерская запись «работает» для любых типизированных языков, имеет смысл применить ее и при программировании ПЛК.
Для базовых типов МЭК можно предложить следующие префиксы типов.
Префикс | Тип |
b | BOOL |
by | BYTE, USINT |
si | SINT |
w | WORD, UINT |
i | INT |
dw | DWORD, UDINT |
di | DINT |
r | REAL |
Ir | LREAL |
st | STRING |
t | TIME |
td | TIME_OF_DAY |
d | DATE |
dt | DATE_AND_TIME |
Примеры обозначений:
bStop: BOOL;
bySet: BYTE;
wSize UINT;
«Венгерские» имена сами говорят о корректности их применения. Очевидно, следующее выражение является бессмысленным; bStop := wSize * 2; а выражение bStop := wSize > 2; вполне допустимым.
Уточнить назначение переменной можно добавлением еще одного символа перед префиксом типа:
Префикс | Назначение | переменной |
а | Составной тип, | массив |
п | Индекс | |
с | Счетчик |
Для временных переменных можно вообще не утруждать себя придумыванием имен, а использовать только префиксы. Например:
aiSample: ARRAY[1..32] OF INT;
ci: INT;
FOR ci := 1 TO 32 DO
(*без комментариев*) |
siSample[ci] := -1; END_FOR
К сожалению, некоторые из предложенных префиксов совпадают с зарезервированными словами (BY, AT, D, DT, N, ST). При использовании их в качестве временных переменных вы можете добавить порядковый номер или букву алфавита. Например:
ЬуА, ЬуВ, byl, Ьу2: 'BYTE;
Структуры и функциональные блоки образуют имена экземпляров с включением полного или сокращенного наименования типа. Например, tpUpDelay: TP;
Символ подчеркивания удобно использовать для индикаций способа обращения к переменной. Подчеркивание в начале имени указывает — только чтение. Идентификаторы переменных, соответствующих входами ПЛК, начинаются символом подчеркивания. Подчеркивание в конце имени указывает — только запись. Идентификаторы выходов заканчиваются символом подчеркивания. Например, Jylnpl, byOut2_.
Если система обозначений хорошо продумана, то ее применение не вызывает сложности. Единый подход к наименованию очень здорово облегчает чтение программы и позволяет отказаться от излишних комментариев. Уникальные префиксы удобны не только для базовых типов, но и для широко используемых в проекте собственных типов данных и функциональных блоков. Стандарт МЭК не содержит рекомендаций по составлению имен переменных и компонентов программы. Никакого стандартного набора префиксов венгерской записи также нет. Вы можете использовать вышеописанную систему или разработать свою собственную. Главное, чтобы принятая система была понятна всем программистам — участникам проекта.
Описанные правила образования венгерских имен применяются в приведенных ниже примерах. В простых случаях, когда тип переменной не имеет значения или очевиден, венгерская запись не используется.