gifts2017

Сила имен переменных

Опубликовал Александр Хомяк (logarifm) в раздел Программирование - Теория программирования

Как же правильно использовать ?

Общие принципы выбора имен переменных


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

_с=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 символов или до верхнего предела, ограничивающего длину имен в конкретном языке.

 

 

 

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Владислав Томашевич (tomvlad) 13.11.09 07:21
Может уже хватит изобретать велосипеды?

Смотрим на ИТС:

Система стандартов и методик разработки конфигураций на платформе 1С:Предприятие 8

Правила образования имен переменных

Имена переменных следует образовывать от терминов предметной области таким образом, чтобы из имени переменной было понятно ее назначение.

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

Перем ДиалогРаботыСКаталогом; // Диалог работы с каталогом
Перем КоличествоПачекВКоробке; // Количество пачек в коробке


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

Переменные, отражающие состояние некоторого флага, следует называть так, как пишется истинное значение этого флага.
Например:

Перем ЕстьОшибки; // Признак наличия ошибок в процедуре.
Перем ЭтоТоварТара; // Признак, что товар относится к возвратной таре.
2. Александр Рытов (Арчибальд) 13.11.09 07:32
Слишком длинные имена: numberOfSeatslnTheStadium
То, что надо: numSeatsInStadiumrseatCount
Даа... УЖ.
3. Антон Степанов (Stepa86) 13.11.09 08:30
(1) не все читают стандарты почему то
4. Владислав Томашевич (tomvlad) 13.11.09 08:33
(3) Все правильно. Из-за таких и имеем криво переписанные конфигурации, в которых ни черта не понятно и со сменой сопровожденца либо умирающие, либо безжалостно переписываемые.
5. Jers (Jers) 13.11.09 09:02
СегодняшняяДата ;)
apolon; marsohod; +2 Ответить 1
6. Антон Степанов (Stepa86) 13.11.09 10:51
(4) вот поэтому и считаю, что любая инфа, подталкивающая программиста писать более качественный код является весьма полезной

(0) откуда основа статьи? уж не из "Совершенного кода" ли? =) я вот тоже баловался http://infostart.ru/public/20992/
7. Вячеслав Кадацкий (marsohod) 13.11.09 11:29
(5) Хе-хе, Вы тоже заметили...
Следует добавить еще одно правило:
"Имена переменных не должны содержать орфографических ошибок" :|
8. Александр Хомяк (logarifm) 13.11.09 12:26
Я привел реальный пример кода из конфигурации реальной за которую денег заплатили.

(6) Да именно из нее только сжато и отобрано более главные аспекты. Я же там написал, что не полеглотсвую чужих рукописей:

Не уж-то человек написавший все это "гений"!? Вот, что по такому поводу говорит книга С.Макконнелла "Совершенный код".
9. Александр Хомяк (logarifm) 13.11.09 12:32
(0) во-первых не у всех есть доступ к ИТС, во-вторых не все ее и читают, банально все думают какой я крут что я не знаю как переменную назвать... К сожалению это реалии, на предыдущей работе был человек, который как попало называл переменные и сколько я не делал акцент на то как правильно называть, но как подчиненный может учить начальника - хех теперь я сокращен с этой работы... Я думал статья должна заинтересовать по крайней мере новичков да и старых "волков" тоже...
10. Александр Хомяк (logarifm) 13.11.09 12:34
(2) Ты не мне сделал минус, а самому Стивену Макконнеллу, а это очень значимое лицо в ИТ. Советую все-же почитать его книгу "Совершенный код" и аргументировать свой минус.
11. Александр Рытов (Арчибальд) 13.11.09 12:49
(10) Еще раз: у тебя
numberOfSeatslnTheStadium - слишком длинное имя, а
numSeatsInStadiumrseatCount - то, что надо, хотя на два символа длиннее.
А Стивен Макконнел здесь ни при чем. Это твой личный минус.
12. Александр Хомяк (logarifm) 13.11.09 12:51
как это не причем - это взято из его книги :) Получается, что как бы так такой человек, которого книга на таком уровне продажи вот так "лохонулся", кто же умней? Вы или Макконнелл?
13. Александр Рытов (Арчибальд) 13.11.09 13:45
(12) У Макконнела во втором случае
numSeatsInStadium
(стр 255)
14. Ulcer (KapasMordorov) 13.11.09 14:13
"2) Ты не мне сделал минус, а самому Стивену Макконнеллу, а это очень значимое лицо в ИТ. Советую все-же почитать его книгу "Совершенный код" и аргументировать свой минус."

Мне вот интересно, по какой причине такому участинку ИС плюсы ставят за обыкновенный плагиат?
Если я "Капитал" Маркса ежедневно зацитирую, мне тоже за силу мысли и духа плюсы положены?
15. Александр Хомяк (logarifm) 13.11.09 14:35
(14) а здесь не причем плагиат, вот что заставило написать меня такую статью, разбор конфигурации с таким вот кодом:

зн=б.СКК();
__зн=зн;
Если зн>0 Тогда
Если (ПустоеЗначение(Сотрудник.ДатаУвол)=0)И
(Сотрудник.ДатаУвол < НачМесяца(ДатаПериода)) Тогда
Иначе
зн=Цел(зн);
КонецЕсли;
Если (ЗаполнитьВсех=0) Тогда
Если ((б.Субконто(1).ЧерезКассу=1)И(Сред(Строка(Счет),1,2)="30")) Тогда
НоваяСтрока();
Сотрудник = б.Субконто(1);
СуммаВыдачи = __зн;
Сумма = зн;
ИначеЕсли ((б.Субконто(1).ЧерезКассу=0)И(Сред(Строка(Счет),1,2)="31")) Тогда
Если б.Субконто(1).выбран()=1 Тогда
б_с.ИспользоватьВладельца(б.Субконто(1));
Если б_с.НайтиПоРеквизиту("Банк",Субконто1.Банк,0)=1 Тогда
НоваяСтрока();
Сотрудник = б.Субконто(1);
СуммаВыдачи = __зн;
Сумма = зн;
ИначеЕсли пр_реп=0 Тогда
НоваяСтрока();
Сотрудник = б.Субконто(1);
СуммаВыдачи = __зн;
Сумма = зн;
КонецЕсли;
Иначе
Сообщить("Не вказано з\п рахунок банку");
Возврат;
КонецЕсли;
КонецЕсли;
Иначе
НоваяСтрока();
Сотрудник = б.Субконто(1);
СуммаВыдачи = __зн;
Сумма = зн;
КонецЕсли;
16. Андрейка Полонянкин (apolon) 13.11.09 14:39
Мешают резкие переходы на 1С и с 1С. Не выделены цитаты.
Красивее было бы взять идею из книги и ПОЛНОСТЬЮ транслировать её на 1С (особенно русский язык).
Если мне не изменяет память, то в том же ИТС дана рекомендация писать на русском.
Другими словами, например, участок:

Слишком длинные имена: numberOfPeopleOnThelJsOlympicTeam
numberOfSeatslnTheStadium
Слишком короткие имена: п, пр, ntm
п, ns, nsisd
т, тр, max, points
То, что надо: numTeamMembers, teamMemberCount
numSeatsInStadiumrseatCount
teamPointsMaxrpointsRecord

мог бы выглядеть так:

Слишком длинные имена: количествоЛюдейВОлимпийскойКоманде,
количествоСидячихМестНаСтадионе
Слишком короткие имена: к, кол, клок, сид, кс, ксмс,
То, что надо: колЧленовКоманды, счётчикЧленовКоманды
колСиденийСтадиона

Опять же в контексте 1С имя переменной ТекущаяДата совсем уж неудачное.

В целом при прочтении статьи возникло ощущение, как при разборе кода:

_с=0;ин=1;
Для ин=1 По цк Цикл
Если _пр[ин]=_б.Субконто(3) Тогда
_с=1;Прервать;
КонецЕсли;
КонецЦикла;
Если _с=0 Тогда
_пр[цк]=_б.Субконто(3);
цк=цк+1;
_сс=1;
КонецЕсли;
17. Ulcer (KapasMordorov) 13.11.09 14:45
(15)
Продублируем.
"Ты не мне сделал минус, а самому Стивену Макконнеллу".

И что? Стивен воплощение бога на земле? Вы ему ссылку на форум отошлете, где ему минус поставили?
Или минус Вам поставили? За необтесанный плагиат вполне заслуженно.
Какое основание возмущаться?
P.S.
А код такой многие пишут, особенно программисты, не знакомые с предметной областью - им без разницы, поймет кто или нет. Круто же и быстро.
18. Александр Хомяк (logarifm) 13.11.09 15:05
(17) А в чем крутость то такого кода, я бы наоборот сказал - "тупость его".
19. Александр Хомяк (logarifm) 13.11.09 15:11
(16) Ну переменные не стоит привязывать к конкретному уклонению языка программирования, кто-то кодит на Java, C, C#, C++, а кто-то на 1С. Собственно англоязычные переменные можно использовать в 1С лишь были бы они удобочитаемы. А насчет "ТекущаяДата" - здесь не идет пример того, что у 1С есть такая функция, здесь показано, что переменные надо называть так, который смысл они несут содержя в себе какое-то значение!
20. Ulcer (KapasMordorov) 13.11.09 15:16
(18)
Он работает. Быстро пишется.
Долго модифицируется потом, но это уже другая проблема.
21. Александр Хомяк (logarifm) 13.11.09 15:16
Ну в общих чертах статья вызвала у людей внимание, а это уже хорошо... Дело не в плюсах и не в минусах, просто мне кажется это важный аспект информации на который нам программистам все же стоит сделать акцент... :)
22. Александр Хомяк (logarifm) 13.11.09 15:18
(20) Я бы не сказал, что такой код быстро пишется... И работоспособность такого кода вообще равна провалу!
23. Артур Аюханов (artbear) 15.11.09 16:48
(0) Где брал книгу МакКоннела?
Дай, плиз, линк на электронный вариант.
У меня есть книжный вариант, но его постоянно с собой не потаскаешь :)
24. Александр Хомяк (logarifm) 15.11.09 22:01
25. WellMaster (WellMaster) 18.11.09 09:59
Плюс за идею. Поддерживаю идею написания красивого кода. В свое время каминовские конфы поморочили мне мозг.
26. Александр Рытов (Арчибальд) 18.11.09 11:20
В связи с внесением автором исправлений отменяю свой минус 8-)
27. Андрей Куканов (KukA.5) 21.11.09 18:06
(20) такой код пишется не быстро, а криво... Проблемы разработки (в данном случае написания кода), отладки функционала и дальнейшей модификации (развития функционала или его изменения) тесно связаны между собой. Человек, который это не понимает, и, возможно, поэтому пишет такой код, делает свою работу плохо (возможно это амбициозный и очень крутой, но ...новичок).
28. Ulcer (KapasMordorov) 21.11.09 23:14
(27)
Раньше в машинных кодах программировали (даже не на ассемблере).
И работало.
В жизни всякое бывает.
Это не значит, что я сторонник так кодировать на 1С.
29. Андрей Куканов (KukA.5) 21.11.09 23:58
(28) я программировал на первом курсе ВолГУ на ассемблере... и кроме меня (и то с картой и описанием подпрограмм) никто не знал, что там написано :)

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

Кстати, мне было полезно прочитать статью ... я увлекаюсь иногда :) и делаю иногда слишком длинные (но понятные) имена:
ТаблицаПроводокИзРегистраНекорректныхПроводок
ОтобранныеУзлыДляОбмена_Полный
НовыйСтатусПослеЗаписиДокумента
30. Игорь Колодин (KilloN) 30.09.16 14:43
А что автор думает по поводу префиксов типов у переменных: Например переменная СтруктураКонтрагентов. Каждый раз писать слово Структура утомляет.
На ИТС не нашел такой инфы, хотя может плохо искал.
Помню когда писал на С++ хорошим тоном было делать префиксы типов данных
unsigned short usLongestWord; - us - префикс типа
31. Сан Саныч (herfis) 30.09.16 15:11
(30) KilloN, Набери в вики "венгерская нотация". В 1С в ней тоже нет необходимости.
Я не испытываю, во всяком случае. А глаз режет, если встречаешь таких отщепенцев. Если у переменной грамотное название, то и так понятно из контекста, какой у нее может быть тип. А где возникают вопросы - жмешь F12.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа