Как назвать что-то, когда логическим вариантом является зарезервированное ключевое слово? [закрыто]


64

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

Я полагаю, что для этой проблемы есть эвристика наилучшей практики. Они могут быть предоставлены создателями или руководителями языков программирования и сред. Например, если python.org (или Гвидо ван Россум) говорит, как с этим обращаться в Python, это было бы хорошим руководством в моей книге. Ссылка на MSDN о том, как с этим справляться в C #, тоже подойдет.
В качестве альтернативы, рекомендации, предоставляемые основными авторитетами в разработке программного обеспечения, также должны быть ценными. Возможно, у Google / Alphabet есть хорошее руководство по стилю, которое учит нас, как с этим бороться?

Вот только пример: в языке C # «default» - зарезервированное ключевое слово. Когда я использую enum, я могу назвать значение по умолчанию "default" (аналогично операторам "switch"), но не могу.
(C # чувствителен к регистру, и константы перечисления должны быть написаны заглавными буквами, поэтому здесь по умолчанию очевиден «Default», но давайте предположим, что наше текущее руководство по стилю предписывает, чтобы все константы перечисления были в нижнем регистре.)
Мы могли бы рассмотреть слово «defaultus» ", но это не соответствует принципу наименьшего удивления . Мы также должны рассмотреть «стандартный» и «начальный», но, к сожалению, «по умолчанию» - это слово, которое точно передает его назначение в этой ситуации.


15
Я бы использовал что-то вроде «default_value». Значение остается прежним, но вы должны ввести еще несколько символов.
Mael

26
@ Darkhogg, если я найду что-то из этого в своем коде, я немедленно их заменю. Ошибки правописания или нарушения правил именования не допускаются.
MetaFight

26
@MetaFight - за исключением того, что в Java вызов переменной, содержащей класс clazz, фактически является стандартом де-факто. По сути, это часть соглашения об именах платформ. Делать что-либо еще было бы нарушением ожиданий того, что другие могут прочитать ваш код, поэтому делать это следует только в случае крайней необходимости.
Периата Breatta

6
значение по умолчанию, так как значение enum кажется непродуктивным. Это должно быть доменное имя, которое описывает имя по умолчанию. Должен быть способ вернуть значение по умолчанию.
qwerty_so

18
@AndresF. Я не согласен. Мне часто очень легко спорить с дизайнерами Java. Я не держу это против них, все же. Они работали на диком западе.
MetaFight

Ответы:


63

Для опции enum вы должны использовать case case вроде Default. Поскольку C # чувствителен к регистру, он не будет конфликтовать с зарезервированным ключевым словом. См. Руководство по именованию .net .

Поскольку все открытые члены должны иметь регистр заголовка в .net, а все зарезервированные имена - строчные, вам не следует сталкиваться с этим, за исключением локальных переменных (включая параметры). И местные жители обычно имеют имена или фразы в качестве имен, поэтому довольно редко наиболее естественное имя сталкивается с ключевым словом. Например. defaultValueкак правило, было бы более естественным именем, чем default. Так что на практике это не большая проблема.

В C # вы можете использовать @префикс " " для экранирования зарезервированных ключевых слов, чтобы их можно было использовать в качестве идентификаторов (например @default). Но это следует использовать только в том случае, если у вас действительно нет другого выбора, т.е. если вы взаимодействуете со сторонней библиотекой, которая использует зарезервированные ключевые слова в качестве идентификатора.


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

В SQL достаточно много ключевых слов, но очень часто просто экранировать идентификаторы, например [Table]. Некоторые даже делают это для всех идентификаторов, независимо от того, сталкиваются ли они с ключевым словом или нет. (В конце концов, ключевое слово может быть введено в будущем!)

Powershell (и множество других языков сценариев) ставит перед всеми переменными символ, такой как $, что означает, что они никогда не столкнутся с ключевыми словами.

В Лиспе вообще нет ключевых слов, по крайней мере, в общепринятом смысле этого слова.

У Python есть официально признанное соглашение в PEP-8 :

Всегда используйте cls в качестве первого аргумента для методов класса.

Если имя аргумента функции конфликтует с зарезервированным ключевым словом, обычно лучше добавить одно завершающее подчеркивание, а не использовать сокращение или орфографическое искажение. Таким образом, class_ лучше, чем clss. (Возможно, лучше избегать таких столкновений, используя синоним.)

Некоторые языки, такие как Brainfuck или Whitespace, вообще избегают определения слов, элегантно обходя проблему.

Короче говоря, не существует независимого от языка ответа на ваш вопрос, поскольку он сильно зависит от синтаксиса и соглашений конкретного языка.


2
Вы не должны полагаться только на чувствительность к регистру. Хотя на практике это вряд ли будет проблемой, не все языки .NET чувствительны к регистру, поэтому в какой-то момент вы можете столкнуться с неожиданными проблемами.
Вивелин

6
@Vivelin: у вас не должно быть открытых членов или имен типов, которые отличаются только регистром, поскольку это может привести к проблемам для другого языка. Но это не связано с тем, что я предлагаю, поскольку ключевые слова не являются идентификаторами (и другие языки будут иметь другие ключевые слова).
JacquesB

Даже если синтаксис @ доступен, IMHO лучше всего его зарезервировать для сценариев, когда нужно взаимодействовать с библиотеками, написанными на разных языках с разными ключевыми словами. Даже там, я думаю, было бы лучше иметь что-то вроде языковой функции #define, но правый операнд всегда интерпретировался бы как регистрозависимый идентификатор. Это позволило бы разрешить многие виды конфликтов именования (включая для языков без учета регистра импорт идентичных символов, кроме регистра).
суперкат

@ Vivelin не все языки .NET чувствительны к регистру - я знаю VB.NET и Powershell; есть ли другие?
Зев Шпиц

@ZevSpitz ОП специально вызвал C #, поэтому я думаю, что Vivelin использовал его в качестве своего примера, однако, как вы говорите, VB.NET не чувствителен к регистру, поэтому, как обычно, я думаю, что он будет сводиться к языковой основе , Не все языки имеют одинаковые зарезервированные слова
Shaggy13spe

22

Я хотел бы добавить подчеркивание (default_)

Плюсы:

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

Почему мне не нравятся другие решения:

Синоним:

  • трудно найти
  • часто не одно и то же значение (нюансы)

Добавление / добавление слова:

  • несовместимый (defaultValue, defaultItem)
  • увеличенное многословие без повышенной читабельности

Смена букв (клац вместо класса):

  • несовместимый (клац, класс, клац)

Добавление номера (по умолчанию1):

  • ставит вопрос по умолчанию2

Добавление / добавление письма:

  • неочевидно (программист должен догадаться, что он использовался для именного коллизии, а не для чего-то другого)

Выход из ключевого слова (@default (c #), `default` (scala))

  • возможно только на некоторых языках
  • редко используемая функция, в основном для совместимости с другими языками
  • усложняет использование для пользователей вашего API (они должны знать, как это сделать и помнить, как это сделать)

Когда бы я не использовал его:

  • существующие, широко используемые другие конвенции
  • Я уже знаю подходящий синоним
  • в вашем конкретном случае перечисления я бы следовал за ответом @JacquesB

7
Это решение часто используется в Python. Я не защищаю это как самое изящное, но это работает.
fralau

1
@fralau Python особенно плох - я действительно ненавижу такие идентификаторы, как «вход»
Кристиан Сауэр

Во многих языках можно klassнайти переменную, где classзарезервированное слово. Я никогда не видел, defawltно это та же идея. Я бы предпочел default_(и, возможно, class_если бы не растоптал какие-либо установленные соглашения при этом).
nigel222

Вы не включили возможность экранирования ключевого слова.
CodesInChaos

1
Вы приводите обоснованные и разумные аргументы, хотя я не уверен, что «очевидно, почему подчеркивание было использовано». Я редко работал с фрудами, которые знают все ключевые слова языков, на которых они работают!
Один защитник

18

Значение по умолчанию, вероятно, не является полезным значением перечисления. Он представляет поведение, которое может меняться в зависимости от контекста, в котором оно используется.

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

Или, еще лучше, приложите дополнительные усилия, чтобы набрать еще несколько букв и назвать его DefaultValue.


3
Я согласен. «По умолчанию» не указывает, что это за значение. Рассмотрим enum ErrorHandlingLevel { Default = 0, ... }против enum ErrorHandlingLevel { None = 0, ... }. Во втором примере факт, который Noneявляется значением по умолчанию, может быть известен путем установки значения enum в 0, использования xmldoc или явно в коде. Вы получаете дополнительное преимущество, зная, что это означает, когда объект ErrorHandlingLevelустановлен None. Сравните это с проверкой объекта с ErrorHandlingLevelустановленным по умолчанию.
Харрисон Пейн

9

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

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

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


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

3

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

  • совершенно другое слово
  • префикс
  • суффикс

Другой фактор, который нужно определить, - это то, как объединить несколько слов, и варианты обычно

  • allonewordnoseparators
  • words_with_underscores-or-dashes ( snake_case )
  • CapitalizationForClarityAndReadability ( CamelCase )

Мое предложение состоит в том, чтобы использовать префикс или суффикс и подчеркивание / тире, например

local_default, my_default, a_default, domain_specific_default
default_local, default_me, default_a, default_domain_specific

local_defaultимеет преимущество в том, что все местные жители выровнены и, следовательно, выделяются быстро, но недостатком является то, что вам всегда нужно читать вторую часть, чтобы получить уникальное имя. default_localимеет обратное преимущество: быстрое распознавание уникального имени переменной, но не всегда так легко сгруппировать визуально.

Вот пара примеров для подхода domain_specific, который я видел: vehicle_modelвместо modelкоторого было зарезервированное слово; room_tableдля таблицы SQL как tableзарезервированное слово.

Два других варианта, которые я видел, используют языки или скрипты:

  • кавычки или всплывающие подсказки для окружения имен переменных и, таким образом, позволяют использовать зарезервированные слова. Подобно этому, я мог предположить, что некоторые языки могут позволять специальному символу, такому как backspace, экранировать имя.
  • пробелы в именах переменных.

В качестве небольшого, возможно, интересного примечания: я видел упоминание words_with_underscores-or-dashesс двумя именами - snake_caseпри использовании подчеркивания и kebab-caseпри использовании тире. Я нашел последнее смешным.
ВЛАЗ

2

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

Вы можете сделать много вещей, например удвоить первую или последнюю букву ( reservedd) или добавить начальное или конечное подчеркивание ( reserved_). То, что подходит, будет во многом зависеть от используемых вами соглашений, особенно в отношении начальных или конечных подчеркиваний. Также старайтесь не делать вещи с делом, которое может быть неправильно истолковано людьми (например, использовать, Reservedкогда оно отличается от reserved).

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

int ccase;  // Name dodges a reserved word

10
Не downvoter, но предложение «удвоение первого или последнего письма»
Виллем ван Румпт

@WillemvanRumpt Мне тоже не нравится это делать, но время от времени приходится выбирать между занятиями гимнастикой, чтобы избежать зарезервированного слова, которое вызывает много царапин на голове или странного вида идентификатора, который подсказывает только немного ,
Blrfl

6
Никаких суждений не было, просто ... озноб .... холодный ...;)
Виллем ван Румпт

1
Добавлять подчеркивание лучше, чем двойное последнее письмо. (Любые голоса для classs?)
nigel222

1
Правила кодирования! Это было бы хорошо иметь! Хорошая точка зрения.
Один защитник

2

В C # вы можете добавить имя идентификатора с помощью @ . Это говорит компилятору обрабатывать имя как имя идентификатора, а не как возможное ключевое слово.

enum @default {Sat, Sun, Mon, Tue, Wed, Thu, Fri}; 

3
Интересно , кто будет голосовать этот «ответ» , который просто повторяет точку уже сделали (и гораздо лучше представлено) в верхней голосовала ответить на день раньше
комара
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.