Общие принципы выбора имен переменных
Имя переменной нельзя выбирать, как кличку собаке: опираясь на его вычурность или звучание. В отличие от собаки и ее клички, которые являются разными сущностями, переменная и ее имя формируют по идее одну сущность. Поэтому и адекватность переменной во многом определяется ее именем. Выбирайте имена переменных со всей тщательностью.
В следующем примере переменные названы плохо:
Пример неудачного именования переменных (из реальных бюджетных конфигураций за которое государство отвалило не мало денег):
_с=0;ин=1;
Для ин=1 По цк Цикл
Если _пр[ин]=_б.Субконто(3) Тогда
_с=1;Прервать;
КонецЕсли;
КонецЦикла;
Если _с=0 Тогда
_пр[цк]=_б.Субконто(3);
цк=цк+1;
_сс=1;
КонецЕсли;
Это часть цикла из процедуры "Заполнить()", документа по начислению налогов. Что происходит в этом фрагменте кода? Что означают все эти имена? Я десятки раз мотал наверх листинг, чтобы подсмотреть и запомнить обозначения этих таинственных переменных, но прочитав десять строчек кода и все время наталкиваясь на объявления все нового и нового изврата доводит до закипания мозка. Не уж-то человек написавший все это "гений"!? Вот, что по такому поводу говорит книга С.Макконнелла "Совершенный код".
Самый важный принцип именования переменных
Важнейший принцип именования переменных состоит в том, что имя должно полно и точно описывать сущность, представляемую переменной. Один эффективный способ выбора хорошего имени предполагает формулирование сути переменной в словах. Оптимальным именем переменной часто оказывается само это высказывание. Благодаря отсутствию загадочных сокращений оно удобочитаемо; к тому же оно однозначно. Так как оно является полным описанием сущности, его нельзя спутать с чем-либо другим. Наконец, такое имя легко запомнить, потому что оно похоже на исходную концепцию. Переменную, представляющую число членов олимпийской команды России, можно было бы назвать "КоличествоИгроковОлимпийскойКомандыРосии". Переменную, представляющую число мест на стадионе, — "КоличествоМестНаСтадионе". Переменную, определяющую текущую процентную ставку, лучше было бы назвать "Ставка" или "ТекущаяСтавка", а не "_с" или "х". Думаю, идея понятна. Стоить обратить внимание на две характеристики этих имен. Во-первых, их легко расшифровать. Фактически их не нужно расшифровывать вообще: их можно просто прочитать. Ну, а во-вторых, некоторые имена велики — слишком велики, чтобы быть практичными. Длину имен переменных я рассмотрю ниже. Несколько примеров удачных и неудачных имен переменных я привел в табл. 1.1
Суть переменной | Удачные имена, адекватное описание | Неудачные имена, неадекватное описание |
Сумма, на которую на данный момент выписаны чеки | ТекущаяСуммаЧека, АктуальнаяСуммаЧека | ТСумма, тСумм, АктСумма |
Текущая дата | ТекущаяДата, СегоднешняяДата | ТД, Текущая, x, x1, x2, Дата |
Имена ТекущаяДата и СегоднешняяДата — хорошие имена, потому что полно и точно описывают идею «текущей даты». Фактически они составлены из слов с очевидным значением. Программисты иногда упускают из виду обычные слова, которые порой приводят к самому простому решению. Имена ТД - неудачны потому, что
слишком коротки и «неописательны». Имя Текущая тоже неудачно: оно не говорит, что именно является «текущим». Имя Дата кажется хорошим, но в итоге оно оказывается плохим, потому что мы имеем в виду не любую дату, а текущую; само по себе имя Дата об этом не говорит. Имена х, x1 и х2 заведомо неудачны: х традиционно представляет неизвестное количество чего-либо, и, если вы не хотите, чтобы ваши переменные были неизвестными величинами, подумайте о выборе других имен.
Имена должны быть максимально конкретны. Имена х, temp, г и другие, достаточно общие для того, чтобы их можно было использовать более чем с одной целью, не так информативны, как могли бы быть, и обычно являются плохими.
Ориентация на проблему
Хорошее мнемоническое имя чаще всего описывает проблему, а не ее решение. Хорошее имя в большей степени выражает что, а не как. Если же имя описывает некоторый аспект вычислений, а не проблемы, имеет место обратное. Предпочитайте таким именам переменных имена, характеризующие саму проблему.
Запись данных о сотруднике можно было бы назвать inputRec или employeeData. Имя inputRec — компьютерный термин, выражающий идеи ввода данных и записи. Имя employeeData относится к проблемной области, а не к миру компьютеров. В случае битового поля, определяющего статус принтера, имя bitFlag более компьютеризировано, чем printerReady, а в случае приложения бухгалтерского учета calcVal более компьютеризировано, чем sum.
Оптимальная длина имени переменной
Оптимальная длина имени, наверное, лежит где-то между длинами имен х и maximumNumbeOfPointsInModernOlympics. Слишком короткие страдают от недостатка смысла. Проблема с именами вроде x1 и х2 в том, что, даже узнав, что такое х,
вы ничего не сможете сказать об отношении между x1 и х2. Слишком длинные
имена надоедает печатать, к тому же они могут сделать неясной визуальную струк-
туру программы.
Горла, Бенандер и Бенандер обнаружили, что отладка программы требовала меньше всего усилий, если имена переменных состояли в среднем
из 10-16 символов (Gorla, Benander, and Benander, 1990). Отладка программ с именами, состоящими в среднем из 8-20 символов, была почти столь же
легкой. Это не значит, что следует присваивать всем переменным имена из 9-15
или 10-16 символов, — это значит, что, увидев в своем коде много более корот-
ких имен, вы должны проверить их ясность.
Вопрос адекватности длины имен переменных поясняет табл. 1.2.
Табл. 1.2. Слишком длинные, слишком короткие и оптимальные имена переменных
Слишком длинные имена: | количествоЛюдейВОлимпийскойКоманде количествоСидячихМестНаСтадионе |
Слишком короткие имена: | к, кол, клок, кво с, кс, ксмс |
То, что надо: | колЧленовКоманды, всегоЧленовКоманды колСиденийСтадиона, - всегоСидений |
Имена переменных и область видимости
Всегда ли короткие имена переменных неудачны? Нет, не всегда. Если вы присваиваете переменной короткое имя, сама длина имени говорит о том, что переменная является второстепенной и имеет ограниченную область действия.
Программист, читающий код, сможет догадаться, что использование такой переменной ограничивается несколькими строками кода. Присваивая переменной имя вы говорите: «Эта переменная — самый обычный счетчик цикла/индекс массива, не играющий никакой роли вне этих нескольких строк». У. Дж. Хансен (W. J. Hansen) обнаружил, что более длинные имена лучше присваивать редко используемым или глобальным переменным, а более короткие —
локальным переменным или переменным, вызываемым в циклах (Shneiderman,
1980). Однако с короткими именами связано много проблем, и некоторые осмотрительные программисты, придерживающиеся политики защитного программирования, вообще избегают их.
Именование индексов циклов
Принципы именования индексов циклов возникли потому, что циклы относятся к самым популярным конструкциям. Как правило, в качестве индексов циклов используют переменные i, j и k
Пример простого имени индекса цикла (1С)
Для i = 0 По КоличествоСтрокМассива Цикл
СтрокаДанных = ДанныеМассива[ i ];
Если же переменную предполагается использовать вне цикла, ей следует присвоить более выразительное имя. Например, переменную, хранящую число записей,
прочитанных из файла, можно было бы назвать КоличествоЗаписей:
Пример удачного описательного имени индекса цикла (1С)
КоличествоЗаписей = 0;
Пока ЧтениеФайла.Следующий() Цикл
ТекущаяЗапись = ЧтениеФайла[ КоличествоЗаписей ];
КоличествоЗаписей = КоличествоЗаписей + 1;
// строки, в которых используется переменная КоличествоЗаписей
Если цикл длиннее нескольких строк, смысл переменной i легко забыть, поэтому
в подобной ситуации лучше присвоить индексу цикла более выразительное имя.
Так как код очень часто приходится изменять, модернизировать и копировать в
другие программы, многие опытные программисты вообще не используют имена вроде i.
Одна из частых причин увеличения циклов — их вложение в другие циклы. Если
у вас есть несколько вложенных циклов, присвойте индексам более длинные имена,
чтобы сделать код более понятным. Тщательный выбор имен индексов циклов позволяет избежать путаницы индексов — использования i вместо j и наоборот. Кроме того, это облегчает понимание операций над массивами.
Не присваивайте имена i, j и k ничему, кроме индексов простых циклов: наруше-
ние этой традиции только запутает других программистов. Чтобы избежать по-
добных проблем, просто подумайте о более описательных именах, чем i, j и k.
Общие советы по сокращению имен
Ниже приведено несколько рекомендаций по сокращению имен. Некоторые из них
противоречат другим, так что не пытайтесь использовать все советы сразу. Итак:
- используйте стандартные аббревиатуры (общепринятые, которые можно найти
в словаре);
- удаляйте все гласные, не являющиеся первыми буквами имен (computer — cmptr, screen — scrn, integer — intgr);
- удаляйте артикли и союзы, такие как and, or, the и т. д.;
- сохраняйте одну или несколько первых букв каждого слова;
- «обрезайте» слова согласованно: после первой, второй или третьей буквы (выбирайте вариант, уместный в конкретном случае);
- сохраняйте первую и последнюю буквы каждого слова;
- сохраняйте до трех выразительных слов;
- сохраняйте наиболее выразительный звук каждого слога;
- проверяйте, чтобы смысл имени переменной в ходе сокращения не искажался;
- используйте эти способы, пока не сократите имя каждой переменной до 8-20 символов или до верхнего предела, ограничивающего длину имен в конкретном языке.