Короткие идентификаторы плохие? [закрыто]


26

Короткие идентификаторы плохие? Как длина идентификатора соотносится с пониманием кода? Какие другие факторы (помимо понимания кода) могут иметь значение при именовании идентификаторов?

Просто чтобы сохранить качество ответов, обратите внимание, что уже есть некоторые исследования по этому вопросу!

редактировать

Любопытно, что все или не считают длину релевантной, или предпочитают большие идентификаторы, когда обе ссылки, которые я указал, указывают на большие идентификаторы, которые вредны

Неработающей ссылке

Ссылка ниже указала на исследование по этому вопросу, но сейчас оно не работает, у меня, кажется, нет копии документа, и я не помню, что это было. Я оставляю это здесь на случай, если кто-то еще поймет это.


5
Точка данных. Мой любимый короткий идентификатор :, как в :(){ :;:& };:- я бы сказал, что большинство людей думают, что это довольно плохо. ;)

@fennec: Вилочные бомбы имеют тенденцию быть.
Джош К

Посмотрите на этот вопрос о стековом потоке, есть комментарий о практике программирования книги, которую должен прочитать каждый программист.
Слу,

1
Тот факт, что следует избегать более длинных имен, не означает, что вы должны приложить дополнительные усилия, чтобы сократить их ради краткости.
JeffO

1
@cessor Забавно, что то, что было предназначено для исследований, было закрыто как основанное на мнении. К сожалению, я согласен, учитывая полученные ответы.
Даниэль С. Собрал

Ответы:


67

Лучшее «правило», которое я слышал, это то, что длина имени должна быть пропорциональна длине области видимости переменной. Так что с индексом iвсе в порядке, если тело цикла состоит из нескольких строк, но мне нравится использовать что-то более описательное, если оно длиннее 15-ти строк.


6
Я никогда не слышал о таких вещах, и я не думаю, что этот принцип улучшит читабельность кода.
НимЧимпски

8
@Nim: я согласен. Даже в коротком forцикле я бы назвал индекс customerCounterили что-то в этом роде. Это требует минимальных дополнительных усилий и делает ваш код намного лучше. Использование коротких переменных для короткой области звучит как оправдание ленивости.
Никто

2
Хм, это не правило или руководство для меня, а способ заставить вас думать о длине, и в этом контексте это имеет некоторый смысл. Я, конечно, не думаю, что это оправдание лени (хотя я согласен, что некоторые могут принять это как таковое). Мои идентификаторы часто встречаются чаще (признаки того, что их обучают на паскале на ранних этапах), за исключением тех случаев, когда я перехожу к таким вещам, как запросы linq и лямбда-выражения, где 1, 2 или 3 символьных идентификатора (обычно инициалы типа) кажутся мне понятными ,
Мерф

33
+1 Честно говоря, «описательное» имя - это просто шум из пяти строк для цикла; Я думаю, что большинство людей довольно хорошо понимают, что вы делаете с «я». Я использовал описательные имена во вложенных циклах, но они имеют более длинную область действия.
Джереми

18
+1 - Используются iи jявляются общими именами, которые каждый разработчик должен уметь понимать IMO.
TheCloudlessSky

48

Каждая переменная должна иметь значение, и ее имя является частью этого значения. И очень важная часть, поскольку она помогает читателю понять, для чего он нужен, не углубляясь в алгоритм. i, jочевидно, будут использоваться в качестве индексов, они короткие, но очень информативные. bntнекрасиво closeили closeButtonимеет смысл. Поэтому короткое или длинное не является самым важным критерием для имени переменной, оно должно быть осмысленным. Значимость сильно зависит от контекста. Например, вы можете дать очень короткое имя, подобное nлокальной строковой переменной, которая используется в небольшом блоке кода, скажем, 10 строк, и ссылается на имя свойства ( vдля значения это еще один пример).

Поэтому имена переменных должны быть информативными, и не важно, короткие они или длинные .


2
+1, и просто заметить, что close и closeButton также не являются синонимами. Закрыть - это глагол, и, следовательно, должно быть именем функции или метода. В то время как closeButton является существительным, и, очевидно, должно быть именем кнопки, которая запускает функцию закрытия.
CaffGeek

close - это прилагательное, например close = true;)
Armand

13

Я буду использовать идентификатор, который описывает переменную, независимо от длины.

Случаи i, j и k сами по себе настолько повсеместны, что самоописываются, вы автоматически знаете, что они являются индексами цикла. Вы также можете сказать то же самое для:

foreach loop (Strings s : myString)

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

Я с радостью добавлю и дополнительное слово к идентификатору, если это потребуется для объяснения назначения переменной.


3
Кстати, использование i, j и k для циклических индикаторов восходит на 50+ лет к Фортрану. Переменные, которые начинаются с букв от I до N, по умолчанию имеют тип INTEGER. Переменные, начинающиеся с любой другой буквы, по умолчанию являются REAL. Это, естественно, привело к использованию I, J и K для индексов цикла for. (Соглашение FORTRAN, вероятно, произошло из-за использования этих переменных, использованных в математических уравнениях до этого.)
tcrosley

2
Вторая статья, на которую я ссылаюсь, показала, что очень длинные описательные идентификаторы снижают способность понимать код, что противоречит замечанию «только отрицательный побочный эффект».
Даниэль С. Собрал

3
Реальный негативный побочный эффект очень длинных идентификаторов заключается в удобочитаемости. Трудно сразу определить, являются ли два очень длинных идентификатора одинаковыми или разными, и может быть трудно выделить все элементы выражения с очень длинными идентификаторами.
Дэвид Торнли

tcrosley - Я бы добавил, что только потому, что он исходит от Фортрана, нет причин продолжать такую ​​практику. Я настоятельно не рекомендую использовать счетчики итераторов / циклов, называемые «i», «j», «k» и т. Д. Это просто интеллектуальная лень. Вездесущий <> хорошо.
quick_now

9

Они не так плохи, как вводящие в заблуждение идентификаторы. Я не возражаю против отладки кода, в котором идентификаторы представляют собой только одну букву, но в тот момент, когда на картинке появляются разные соглашения об именах, это становится раздражающим. Например, если где-то вы видите strPersonID, а затем где-то еще видите s_EmployeeID, тогда сложно понять, являются ли эти две строки и есть ли какая-либо разница. Также, если переменные будут скопированы ( pmapIntString = new std::map<int,int>) и будут абсолютно неверными, я буду беспокоиться.

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


5

Я борюсь ...

Я использую, чтобы всегда использовать описательные имена в качестве идентификаторов, но в последнее время я использовал очень короткие идентификаторы.

Я думаю, это зависит от контекста кода:

  • Если вы пишете сложные функции (алгоритмы), то ВСЕГДА используйте короткие идентификаторы (лучше всего использовать одиночные символы)
  • При записи значений параметров для функций используйте описательные имена.

Я думаю, это зависит также от того, насколько плотный код. Иногда наличие имен на самом деле затрудняет чтение.

Иногда без имен это совершенно загадочно!


1
Если вы пишете сложные алгоритмы, не хотите ли вы, чтобы идентификаторы были более наглядными для людей, которые смотрят ваш код впервые?
Maxpm

Когда можно использовать односимвольный идентификатор?
Амир Афганистан

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

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

1
Если это так сложно и имеет шаблоны, эти шаблоны должны быть разбиты на функции
CaffGeek

3

Я думаю, что они не плохие сами по себе, но они неинформативны, если они не очень стандартны.

Таким образом, переменные цикла, являющиеся i, j и k , настолько стандартны, что нет причин не использовать их, если вы создаете индексированный цикл.

Другое место, где я буду использовать очень короткий идентификатор, - это когда я объявляю временную переменную, которая выйдет из области действия через несколько строк - например, временная переменная из цикла foreach. Если на него не будут ссылаться где-либо еще, то любому, кто читает код, легко увидеть объявление и следовать тому, для чего оно используется. Если он будет использоваться для более чем пяти или шести строк, я постараюсь дать ему более ясное имя.

Кроме того, я пытаюсь использовать информативные идентификаторы длины, особенно на уровне класса. Мне нужен идентификатор, который вы можете прочитать и получить представление о том, для чего нужна переменная. Если они становятся слишком длинными (и я иногда вижу код с четырьмя или пятью словами, соединенными вместе для идентификатора), я склонен расценивать это как запах кода - если мне нужно так много текста, чтобы различать мои переменные, они на самом деле группа, которая может быть лучше хранить в хэш-карте или списке? Могу ли я создать какой-то объект для более точного моделирования этих данных? Иногда вы не можете, но очень длинный идентификатор - это показатель того, что здесь стоит посмотреть.


3

Я очень согласен с другими ответами здесь, но хотел бы отметить еще один фактор, который, я думаю, часто упускается из виду. Хорошее имя часто идиоматично для кода. Это может быть на уровне языка, на уровне алгоритма или некоторых внутренних идиом для кодовой базы под рукой. Дело в том, что хотя имя может ничего не значить для того, кто не знает домен кода, оно все же может быть лучшим именем в данном контексте.


3

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

Очень короткое имя переменного только полезно , если у него есть история , что делает его доступным (например, i, j, и kдля индексов, dxна расстояние вдоль оси) или объем , который достаточно мало , чтобы все ссылки , чтобы быть видимыми одновременно (например , , temp). Худшие имена переменных в мире - это что-то вроде t47. («Что это значит и чем оно отличается t46?») Слава Богу, стиль именования в основном был реализован в FORTRAN, но именно здесь укоренилось желание иметь более длинные имена переменных.

Как показала ваша оригинальная статья, слишком длинные имена также трудно читать, поскольку при взгляде на код можно пропустить тонкие внутренние различия. (Разницу между DistanceBetweenXAxisAbscissae& DistanceBetweenYAxisAbscissaeочень сложно быстро определить.)

Как NoteToSelf указывал ранее, требования к уникальности имени зависят, прежде всего, от области, в которой имя должно быть уникальным. Индекс цикла из 5 строк может быть i; индекс активной записи, который передается от функции к функции, должен иметь гораздо более описательное имя.

Локальная для функции переменная может иметь небольшое описательное имя, как deltaXбез проблем. Статическая переменная delta X в модуле должна иметь имя, которое отличает этот deltaX от других deltaX в том же модуле, делая его длиннее. И глобальная переменная дельта-X должна быть уникальной для всех модулей и всех возможных других модулей, которые могут быть созданы, возможно, путем объединения имени модуля с другим описательным именем. Это одна из многих проблем с глобалами; чтобы быть полезными, имена должны быть достаточно длинными, чтобы их было трудно читать.


2

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


1
Вы были бы рады узнать, что одно из исследований, которые я связал, поддерживает ваши рассуждения, если не по тем же причинам. ;-)
Даниэль С. Собрал

1
Также очень легко неправильно прочитать очень длинные идентификаторы, возможно, запутав их или не осознав, что два из них одинаковы.
Дэвид Торнли

2
TheVariableThatHoldsTheCapacityOfMyContainerClass больше, чем я бы назвал «длинным» - десять слов слишком длинны, чтобы помочь CamelCase; вам нужны пробелы, чтобы сделать это читабельным.
Ричард Гадсден

1
Конечно, но это соломенный человек. Ваш пример длинного имени добавляет словоблудие, но без информации. Рассмотрим случай, когда у вас есть несколько переменных, связанных с различными формами емкости. Тогда вам действительно могут понадобиться имена, которые различают цели, например, initalCapacity или finalCapacity.
Чарльз Грант

2
@Maxpm, var total = Capacity + Capacity2; что Capacityсодержит и что Capacity2содержит? Для чего они будут использоваться? Необходимость искать контекстные ключи теряет время. Принимая во внимание, что если это написано так, как var totalStorageCapacity = truckCapacity + trailerCapacity;я знаю, о чем мы говорим.
CaffGeek

2

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


+1 ты сказал это очень-очень хорошо, я не смог найти слов, когда написал ответ :-)
ComputerSaysNo

1

Наблюдение, которое у меня было на протяжении многих лет, и сегодня оно меньше, чем 10-15 лет назад. Программисты, которые не умеют печатать, - это те, кто будет сражаться изо всех сил за переменное наименование. Они со всеми именами переменных 1-3 буквы.

Поэтому мой совет - используйте значимое имя, как говорили многие комментаторы, а затем научитесь печатать. Я собирался добавить тест для набора текста в интервью, просто чтобы посмотреть, где люди, но я начинаю видеть гораздо меньше нетипов, поскольку компьютеры становятся большей частью общества.


2
На самом деле я не видел такой корреляции. Если что-то кажется, люди с ОО-языков используют длинные идентификаторы, а люди с функционального языка - короткие. Это ставит под сомнение утверждение о том, что ОО помогает в моделировании. :-)
Даниэль С. Собрал

Не забывайте, что имена нужно не только набирать, но и читать. Использование слишком длинных идентификаторов может значительно снизить читабельность. Использование чего-либо, кроме как iв цикле, как for (int i=0; i<dst.size(); ++i) dst[i] += src[i]должно быть запрещено законом.
Maaartinus

1

Первая статья, на которую вы ссылаетесь, выглядит интересной, но ее вывод состоит в том, что они не нашли существенных доказательств за или против гипотезы о том, что «основательные намеки», включая значимые имена переменных, помогают в понимании кода. Используемое время ожидания взгляда в качестве прокси для понимания кода, что интересно, но не хлам.

Боюсь, я нашел вторую статью просто глупой. Первая проблема заключается в том, что примеры длинных имен, которые они предоставляют, являются длинными, не предоставляя дополнительной информации. Я думаю, что мы все можем согласиться с тем, что делать имя переменной длиннее, просто чтобы сделать ее длиннее, глупо. Их пример именования переменной distance_between_abscissae вместо dx - соломенный человек.

Что еще более важно, их эксперимент является тестом простого запоминания, а не понимания. Он проверяет способность субъектов заполнять недостающие фрагменты имени переменной, когда они представлены в списке без контекста. Да, более длинные имена труднее запомнить, но когда я пишу код, я не запоминаю имена переменных, я использую их для обеспечения контекста. Я полагаю, вы могли бы возразить, что трудность запоминания длинной переменной делает код труднее писать, но код читается гораздо чаще, чем пишется, поэтому какую деятельность следует оптимизировать?


Обратите внимание, что во втором документе четко указано, что «восемь имен, использованных в восьми вопросах, были извлечены из производственного кода». Кроме того, они проверяют не только на запоминание, но и на правильность.
Даниэль С. Собрал

1

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

Легко сказать, что «любой должен понимать, что i, j и k являются переменными цикла». И в большинстве случаев это действительно очевидно. Но я все еще стараюсь быть скромным и профессиональным в этом и предполагаю, что при программировании легко ошибаться. Так что если я перебираю массив Grobbles, я назову переменную цикла grobbleIndex. Я также мог принять I как сокращение индекса. Когда вы используете ij и k, сложнее обнаружить ошибку, например, использовать неправильный индекс с неправильным массивом и так далее. И это становится еще хуже, когда у вас есть внутренний цикл.

PS. В то время, когда я писал этот ответ, я кодировал некоторый javascript на 10 "мини-ноутбуке с вертикально разделенным экраном в vim, и я все еще находил время, чтобы назвать свои переменные цикла rowIndex и columnIndex.


0

В некоторых приложениях короткая переменная просто не может объяснить данные в переменной. Короткое или длинное не имеет значения. Использование более длинной переменной не замедляет ваш код. Конечно, это больше усилий, набирая длинное имя переменной, но, по крайней мере, человек, который читает код 6 месяцев спустя (может быть, вы), сможет разобрать, что происходит, без необходимости ставить следы, предполагая, что это даже возможно.


0

Я думаю, что в идеале имена должны быть описательными, если только ...

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

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


-2

Я никогда не использовал бы имена идентификаторов длиной менее 4-5 символов, например, переменная цикла могла бы быть Index или jIndex или kIndex, в зависимости от того, сколько внутренних циклов мне нужно для выполнения чего-либо, но для других имен, скажем, «ключ», который я бы использовал «String LKey» или «int LKey», «L» для local, если это переменная метода, или «F» для переменной частного класса, все другие идентификаторы, как и другие, упомянутые выше, должны объяснять причину его существования в своем имени, в противном случае Область «идентификатора» бесполезна, не так ли ?!


5
Какую дополнительную информацию «индекс» передает, что «я» не делает? Длинные имена переменных, которые ничего вам не говорят, хуже, чем односимвольные.
Анон.

2
Недавно, написав некоторые вещи, которые работали над трехмерной сеткой, у меня было много переменных с именами x, y и z. Учитывая контекст, они были совершенно наглядными.
Лорен Печтел
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.