Я вижу подобные вопросы в отношении имен параметров, которые соответствуют свойствам класса, но я не могу найти ничего относительно использования имени параметра, совпадающего с именем типа параметра, за исключением случая в C #. Кажется, это не нарушение, которое я могу найти, но считается ли это плохой практикой? Например, у меня есть следующий метод
public Range PadRange(Range range) {}
Этот метод берет диапазон и возвращает новый диапазон, к которому применен некоторый отступ. Итак, учитывая общий контекст, я не могу придумать более описательное имя для параметра. Однако мне напомнили один совет, который я прочитал, читая Code Complete о «психологической дистанции». Это говорит
Психологическая дистанция может быть определена как легкость, с которой можно различать два элемента ... Во время отладки будьте готовы к проблемам, вызванным недостаточным психологическим расстоянием между одинаковыми именами переменных и между похожими именами процедур. При создании кода выбирайте имена с большими различиями, чтобы избежать этой проблемы.
В сигнатуре моего метода происходит много «Range», поэтому мне кажется, что это может быть проблемой в отношении этой психологической дистанции. Теперь я вижу, что многие разработчики делают следующее
public Range PadRange(Range myRange) {}
Я лично испытываю сильное отвращение к этой конвенции. Добавление префикса «my» к именам переменных не дает дополнительного контекста.
Я также вижу следующее
public Range PadRange(Range rangeToPad) {}
Мне нравится это лучше, чем «мой» префикс, но все равно мне все равно. Мне это кажется слишком многословным и неуклюже читается как имя переменной. Для меня понятно, что диапазон будет дополнен из-за имени метода.
Так что со всем этим изложено, моя интуиция должна пойти с первой подписью. Для меня это чисто. Не нужно форсировать контекст, когда он не нужен. Но я делаю себе или будущим разработчикам медвежью услугу с этим соглашением? Я нарушаю лучшую практику?
источник
Range range
хорошо.Range r
(по крайней мере, для короткого тела метода) иRange toPad
.Ответы:
Не думай об этом,
Range range
хорошо. Я использую такое наименование уже более 15 лет в C # и, вероятно, гораздо дольше в C ++, и никогда не испытывало каких-либо реальных недостатков, как раз наоборот.Конечно, когда у вас есть разные локальные переменные в одной и той же области видимости, все они одного типа, это, вероятно, поможет инвестировать некоторые умственные усилия, чтобы правильно их различать.
источник
Wack(Bozo bozoToBeWacked)
в качестве примера избыточность в имени переменной, которая достаточно выражена самим методом (и, следовательно, нежелательна для исходного вопроса).Wack(Person bozo)
однако, является более ценным с точки зрения семантики, так как подразумевает, что ожидается уничтожение только бозо.initialRange
. Это все еще очень общий характер, но не имеет почти такой же уровень отвращения, какmyRange
.Punch(Bozo punchingBozo, Bozo bozoToBePunched)
. Подробное именование более уместно, когда вам нужно различать несколько вещей (которые семантически описываются практически одинаковыми словами). Предложение OPRange rangeToPad
не обязательно в его примере метода с одним параметром, но может быть крайне необходимо для метода, который принимает несколькоRange
объектов.Punch(Bozo source, Bozo target)
сделает работуЯ делаю это все время, это дает мне большой разум. Если это аргумент, передаваемый конструктору, который должен быть назначен члену, мой член также получит имя range, и назначение будет
И у меня обычно есть свойство с именем Range.
Это все одно и то же, они различаются только по контексту, поэтому имеет смысл сохранить одно имя, и вам придется запомнить только одно имя. Одно дело, различия чисто технические.
Вы должны быть строгими с полностью квалифицированными членами с «этим». хотя, но для этого и нужен StyleCop.
Примечание к стилю
Споры гарантированы!
Тем, кто выступает против использования «этого»: я видел _, m, m_ и просто ничего. Сам язык предлагает нам совершенно ясный, однозначный, общепризнанный способ указать, что мы имеем дело с учеником. С какой стати вы хотите придумать свой собственный путь, который искажает уже совершенные имена?
Единственная причина, по которой я могу думать об этом, - это унаследованная привычка эпохи С, когда это действительно имело смысл делать, потому что другого пути не было.
«Больше персонажей!» Шутки в сторону? "Время компиляции взлетит до небес!" Шутки в сторону? «Мне придется поднять мой мизинец при его наборе!». Как будто время набора текста имело какое-либо значение в общем времени разработки.
Я признаю, что любой стиль, отличный от того, к которому вы привыкли, вызовет некоторую оппозицию. Но с этим постоянно трудно спорить. Вот как это работает для меня: прежде чем я добавляю новый файл кода, я запускаю StyleCop, и он обнаружит, что в ряде участников отсутствуют квалификаторы «this». Я поставил «это». в буфер обмена, запустите его и вставьте. Никаких усилий.
StyleCop делает намного больше, чем это (ха-ха). Есть так много способов, которыми разработчик может (только учитывая форматирование кода) сорвать работу по обслуживанию своего преемника. StyleCop предотвращает большинство из них. Это бесценно.
Если вы новичок в этом: это обычно заставляет вас ворчать в течение недели или двух, и тогда вам это понравится.
источник
this
кроме случаев, когда это необходимо. Это просто шум в противном случае. Используйте_range
для поля иthis
никогда не требуется, кроме как в методах расширения._
предпочтительнее шумаthis.
? Я бы сказал, что один из них имеет значение, обеспечиваемое языком (и обычно имеет подсветку синтаксиса), а другой - нет.Мое руководство по именованию методов, параметров и переменных довольно простое:
Таким образом, оптимальный метод подписи, на мой взгляд, будет:
Сокращение имени метода говорит само за себя.
Имя параметра
toPad
немедленно сообщает читателю, что этот параметр, вероятно, будет изменен на месте путем дополнения, а затем возврата. Напротив, нельзя делать никаких предположений о названной переменнойrange
.Кроме того, в фактическом теле метода любые другие
Range
вводимые переменные будут (должны) называться по их намерению, так что вы можете иметьpadded
иunpadded
...toPad
соответствовать этим соглашениям об именах, ноrange
просто выпячиваться и не склеиваться.источник
padded
/unpadded
звучит хорошо для локальных неизменяемых переменных. Но если есть изменяемыйtoPad
параметр, то после того, как заполнение выполнено, имяtoPad
больше не подходит (если результат не возвращается немедленно). Я бы предпочел придерживатьсяRange range
в этих случаях.result
. Он модифицируется и возвращается . Последнее ясно из названия, и первое следует, поскольку возвращение неизмененного аргумента не имеет смысла.Pad
метод возвращает aRange
. Для меня это означает, что тот, который я передал, будет сохранен, не изменен на месте, иRange
будет возвращен новый, дополненный . ,Pad(toPad)
чувствует себя как-то не так ИМХО. Вы делаете хорошую точку зрения, отстаивая свою точку зрения, хотя. Вы получаете +0 от меня! :)Для именования элементов кода (типов, переменных, функций, чего угодно), ключевой вопрос, который нужно задать себе:
Если я сделаю опечатку, компилятор найдет ее для меня?
Наихудший тип ошибок, основанных на опечатках, - это ошибка, при которой код компилируется и запускается, но дает поведение, отличное от ожидаемого, по незаметным причинам. И поскольку это происходит из-за опечатки, обычно очень трудно увидеть, когда вы проверяете код. Если опечатка остановит компиляцию кода, то компилятор отметит строку, вызывающую проблему, и вы можете легко найти и исправить ее.
Для вашей ситуации, когда тип и переменная отличаются только заглавными буквами, это всегда будет так. (Или почти всегда - при достаточных усилиях, я уверен, что вы могли бы заставить это работать, но вы должны действительно попытаться.) Так что я думаю, что у вас все в порядке.
Если вас интересует, будут ли две переменные, методы, функции или свойства в текущей области вызваны
range
иRange
. В этом случае компилятор, вероятно , пропустит его, и вы получите неожиданное поведение во время выполнения. Обратите внимание , что это два из любых из этих типов коды элемента, а не только «две переменных» или «две функций» , - все это может быть неявно друг к другу, в результате чего с бойней , когда он работает. Вы можете получать предупреждения, но вы не можете гарантировать ничего большего. У вас есть похожие проблемы, если у вас есть два типа, объявленные какrange
иRange
.Также обратите внимание, что то же самое относится и к венгерскому стилю обозначений , где имена имеют префикс с одним или несколькими символами, чтобы сказать что-то еще о чем бы то ни было. Если у вас есть переменная с именем
Range
и указатель на нееPRange
, вы легко можетеP
, например, случайно пропустить . C # должен поймать это, но C и C ++ будут давать только самое большее предупреждение. Или, что еще более тревожно, предположим, что у вас есть двойная версия,DRange
и вы уменьшите ее до плавающей версииFRange
. Используйте поплавок один случайно (что легко , так как ключи находятся рядом на клавиатуре) и ваш код будет вид работы, но она будет падать в странных и непредсказуемо , когда процесс заканчивается разрешением и потери значимости.Мы больше не в те дни, когда у нас были ограничения именования из 8 символов, или 16 символов, или любого другого произвольного ограничения. Иногда я слышал, как новички жалуются на более длинные имена переменных, делающие кодирование более длительным. Только новички жалуются на это. Серьезные программисты знают, что на самом деле требуется время, чтобы выяснить неясные ошибки - и неправильный выбор имени - это классический способ попасть в эту конкретную дыру.
источник
Я хотел бы добавить один анекдот, хотя
Range range
это синтаксически допустимо, но это может усложнить отладку или рефакторинг. Ищете эту переменную с именем «диапазон» в файле с большим количеством переменных типа Range? Вы можете в конечном итоге выполнить больше работы в результате этого выбора имен.Это в значительной степени зависит от контекста, хотя. Если это файл из 30 строк, мои утверждения не вступают в игру.
источник
grep
это отличный инструмент, но это не инструмент рефакторинга. И инструменты рефакторинга существуют на каждой платформе разработки, которую я использовал. (OS X, Ubuntu, Windows).Я думаю, что вы можете использовать в
Range range
настоящее время по одной причине: подсветка синтаксиса. Современные IDE обычно выделяют имена типов и имена параметров разными цветами . Кроме того, тип и переменная имеют значительную «логическую дистанцию», которую легко перепутать.Если бы это было не так, я бы рассмотрел другое имя или пытался включить плагин / расширение, которое может делать подсветку синтаксиса.
источник
Когда функция является универсальной, очевидно, что параметры будут универсальными и, следовательно, должны иметь общие имена.
Не то, что вы говорите, но я видел функции, которые выполняют обобщенную функцию с именами параметров, которые вводят в заблуждение. подобно
Название функции звучит очень обобщенно, так как это может применяться ко многим строкам во многих ситуациях. Но имя параметра странно специфично, что заставляет меня задуматься, вводит ли имя функции в заблуждение, или ... что?
Так что, вместо того, чтобы сказать Range range, вы можете сказать Range rangeToPad. Но какую информацию это добавляет? Конечно, это диапазон для колодки. Что еще это будет?
Добавление некоторого произвольного префикса, «my» или «m_» или чего-либо еще, передает нулевую дополнительную информацию читателю. Когда я использовал языки, в которых компилятор не допускает, чтобы имя переменной совпадало с именем типа - с учетом или без учета регистра - я иногда ставил префикс или суффикс, просто чтобы получить его для компиляции , Но это только для удовлетворения компилятора. Можно утверждать, что даже если компилятор может различать, это облегчает распознавание читателю. Но вау, в Java я написал такие выражения, как «Customer customer = new Customer ();» миллиард раз, и я никогда не находил это запутанным. (Я всегда считал это немного избыточным, и мне нравится, что в VB вы можете просто сказать «dim customer as new Customer», и вам не нужно давать имя класса дважды).
Я категорически возражаю против общих имен, когда в одной и той же функции есть два или более экземпляров одного типа. ОСОБЕННО параметры. Подобно:
В чем разница между range1 и range2? Как я должен знать? Если это что-то, где они действительно являются двумя общими и взаимозаменяемыми значениями, хорошо, как
Я ожидаю, что он вернет true, если диапазоны перекрываются, и false, если они этого не делают, поэтому они являются общими и взаимозаменяемыми.
Но если они разные, дайте мне понять, чем они отличаются! Я недавно работал над программой, в которой был класс «Place» для хранения данных о географических местах, и с переменными этого типа с именами «p», «place», «place2», «myPlace» и т. Д. имена действительно помогают мне определить, что есть что.
источник