Як назвати щось, коли логічний параметр є зарезервованим ключовим словом? [зачинено]


64

Іноді найбільш логічна назва чогось (наприклад, змінної) - це зарезервоване ключове слово у вибраній мові чи середовищі. Коли не існує однаково відповідного синоніма, як його називати?

Я думаю, що для цієї проблеми є найкраща евристика практики. Вони можуть бути надані творцями або керуючими мовами та середовищами програмування. Наприклад, якщо python.org (або Гвідо ван Россум) говорить, як поводитися з цим на Python, це було б гарним керівництвом у моїй книзі. MSDN-посилання про те, як поводитися з цим у C #, також було б добре.
Крім того, рекомендації, що надаються великими впливовими виробниками програмного забезпечення, також повинні бути цінними. Можливо, у Google / Alphabet є приємний посібник зі стилів, який навчає нас як з цим боротися?

Ось лише приклад: у мові C # "за замовчуванням" - це зарезервоване ключове слово. Коли я використовую enum, я, можливо, хотів би назвати значення за замовчуванням "default" (аналогічно твердженням "switch"), але не можу.
(C # відрізняється від регістру, а константи перерахунків мають бути використані з великої літери, тому "За замовчуванням" тут очевидний вибір, але припустимо, що наш поточний посібник зі стилів диктує, що всі константи перерахунків мають бути малими літерами.)
Ми можемо вважати слово "defaultus" ", але це не дотримується Принципу найменшого здивування . Слід також розглянути "стандартне" та "початкове", але, на жаль, "за замовчуванням" - це слово, яке точно передає своє призначення в цій ситуації.


15
Я б використовував щось на кшталт "default_value". Значення залишається незмінним, але вам потрібно набрати ще кілька символів.
Маєль

26
@Darkhogg Якби я знайшов будь-який із них у своєму коді, я б негайно змінив їх. Орфографічні помилки або називання порушень конвенції неприйнятні.
MetaFight

26
@MetaFight - за винятком випадків на Java, виклик змінної, яка містить клас, clazzє практично де-факто стандартом. Він по суті є частиною конвенції про іменування платформи. Робити що-небудь інше було б порушенням очікувань, що інші можуть прочитати ваш код, тому робити це слід лише в разі крайньої необхідності.
Periata Breatta

6
за замовчуванням, оскільки значення enum здається контрапродуктивним. Це має бути доменне ім'я, яке описує за замовчуванням. Однак повинен бути метод повернення за замовчуванням.
qwerty_so

18
@AndresF. Я не погоджуюсь. Мені часто буває дуже легко сперечатися проти дизайнерів Java. Я не заперечую проти них. Вони працювали на дикому заході.
MetaFight

Відповіді:


63

Для опції перерахування слід використовувати назву регістру типу Default. Оскільки C # відрізняється від регістру, він не зіткнеться із зарезервованим ключовим словом. Див .net Правила іменування .

Оскільки всі загальнодоступні члени повинні бути заголовком у .net, а всі зарезервовані імена - малі регістри, вам не слід стикатися з цим, окрім локальних змінних (включаючи параметри). А місцеві жителі зазвичай мають іменники чи фрази як імена, тому досить рідко найприродніше ім’я стикається з ключовим словом. Напр. defaultValueяк правило, більш природна назва, ніж default. Тож на практиці це не велике питання.

У C # ви можете використовувати @префікс " ", щоб уникнути зарезервованих ключових слів, щоб вони могли використовуватись як ідентифікатори (як @default). Але це слід використовувати лише в тому випадку, якщо у вас дійсно немає іншого варіанту, тобто якщо ви взаємодієте зі сторонніми бібліотеками, які використовують зарезервовані ключові слова як ідентифікатор.


Звичайно, інші мови мають різний синтаксис та ключові слова, а тому різні проблеми вирішують цю проблему.

У SQL є досить багато ключових слів, але дуже часто просто уникати ідентифікаторів, наприклад [Table]. Деякі навіть роблять це для всіх ідентифікаторів, незалежно від того, стикаються вони з ключовим словом чи ні. (Зрештою, ключове слово, що стикається, може бути введено в майбутньому!)

Powershell (і купа інших мов сценаріїв) префіксує всі змінні знаком sigil, як $, що означає, що вони ніколи не зіткнуться з ключовими словами.

У Lisp взагалі немає ключових слів, принаймні, не в звичайному розумінні.

Python мають офіційно визнану конвенцію в PEP-8 :

Завжди використовуйте cls для першого аргументу для методів класу.

Якщо ім'я аргументу функції стикається із зарезервованим ключовим словом, як правило, краще додати єдиний кінцевий підкреслення, а не використовувати абревіатуру або написання корупції. Таким чином class_ краще, ніж clss. (Можливо, краще - уникати таких сутичок, використовуючи синонім.)

Деякі мови, такі як Brainfuck або Whitespace, уникають визначення слів взагалі, елегантно уникаючи проблеми.

Коротше кажучи, не існує незалежної від мови відповіді на ваше запитання, оскільки вона сильно залежить від синтаксису та умов конкретної мови.


2
Не варто покладатися лише на чутливість до справ. Хоча це, ймовірно, не є проблемою на практиці, не всі мови .NET залежать від регістру, тому в певний момент у вас можуть виникнути несподівані проблеми.
Вівелін

6
@Vivelin: У вас не повинно бути публічних членів або імен типів, які відрізняються лише у випадку, оскільки це може призвести до проблем з іншою мовою. Але це не пов'язане з тим, що я пропоную, оскільки ключові слова не є ідентифікаторами (а інші мови матимуть інші ключові слова).
ЖакБ

Навіть якщо синтаксис @ доступний, IMHO найкраще зарезервований для сценаріїв, коли потрібно взаємодіяти з написаними мовами бібліотек з різними ключовими словами. Навіть там, я думаю, може бути краще, щоб мовна функція була дещо схожа #define, але правий операнд завжди інтерпретується як ідентифікатор регістру. Це дозволило б вирішити багато видів конфліктів іменування (у тому числі, для мов, що не залежать від регістру, імпорт символів, ідентичних за винятком регістру).
supercat

@Vivelin не всі .NET мови залежать від регістру - я знаю VB.NET та Powershell; чи є інші?
Zev Spitz

@ ZevSpitz OP спеціально назвав C #, тому я думаю, що Vivelin використовував це як свій приклад, однак, як ви кажете, VB.NET не відрізняється від регістру, тому, як зазвичай, я думаю, що це зводиться до мови . Не всі мови мають однакові зарезервовані слова
Shaggy13spe

22

Я додав би підкреслення (за замовчуванням_)

Плюси:

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

Чому я не люблю інші рішення:

Синонім:

  • важко знайти
  • часто не точно таке значення (нюанси)

Додавання / попереднє слово:

  • непослідовний (defaultValue, defaultItem)
  • підвищена багатослівність без підвищеної читабельності

Зміна літер (clazz замість класу):

  • непослідовний (clazz, klass, klazz)

Додавання номера (за замовчуванням1):

  • ставить питання за замовчуванням2

Додавання / попередження листа:

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

Уникнення ключового слова (@default (c #), `default '(scala))

  • можливо лише в деяких мовах
  • рідко використовується функція, головним чином для сумісності з іншими мовами
  • робить його складніше використовувати для користувачів вашої програми (вони повинні знати, як це зробити, і пам'ятати, як це зробити)

Коли я б не користувався ним:

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

7
Це рішення, яке часто використовується в Python. Я не виступаю за це як найелегантніше, але це працює.
fralau

1
@fralau Python ist posebno погано - я дуже ненавиджу такі ідентифікатори, як "input"
Крістіан Зауер

У багатьох мовах ви бачите 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встановленого за замовчуванням.
Harrison Paine

9

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

У кожному випадку має бути можливість або використовувати слово з синонімічним значенням, або зробити ім'я більш конкретним (або навіть багатослівним). Навіть коли це може ввести повторення контексту, це може бути кращим рішенням.

Наприклад, скажімо, що у вас є enum, Modeякий повинен викрити значення за замовчуванням, як у вашому випадку. Названня його default_modeможе здатися не найкращим через повторення, але це дозволяє уникнути неоднозначності, передаючи бажаний сенс.


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

3

Вам потрібно буде використовувати різні або модифіковані слова (слова), це зрозуміло.
Отже, це зазвичай означає будь-яке

  • зовсім інше слово
  • префікс
  • суфікс

Інший фактор, який визначає, як це об'єднати декілька слів та варіанти, як правило

  • allonewordnoseparators
  • words_with_underscores-or- dash ( 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зарезервоване слово.

Інші два варіанти, якими я бачив мови чи сценарії:

  • цитати або резервні копії для оточення імен змінних і таким чином дозволяють використовувати зарезервовані слова. Схоже на це, я можу уявити, що деякі мови можуть дозволити спеціальним символам, таким як зворотна область, уникнути імені.
  • пробіли в назвах змінних.

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

2

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

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

Після того, як ви щось вибрали, введіть його у свої вказівки щодо кодування, переконайтеся, що люди знають про це та що воно використовується постійно. Я навіть заходжу так, щоб додати нагадування, щоб читачі не думали, що це помилка, і знають, що побачать її знову:

int ccase;  // Name dodges a reserved word

10
Не прихильник, але пропозиція "подвоєння першої чи останньої літери" послала озноб у мене по хребту ....
Віллем ван Румпт

@WillemvanRumpt Мені теж не подобається це робити, але раз у раз вона зводиться до вибору між тим, як займатися гімнастикою, щоб уникнути зарезервованого слова, яке спонукає до сильного подряпини в голові або дивного ідентифікатора, який підказує лише трохи .
Blrfl

6
Жодного суду не мав на увазі, просто .... озноб .... холодні ...;)
Віллем ван Румпт

1
Відкладати підкреслення краще, ніж подвійний останній лист. (Є голоси за classs?)
nigel222

1
Правила кодування! Це було б добре! Влучне зауваження.
Захисник один

2

У C # ви можете додати ім'я ідентифікатора за допомогою @ . Це вказує компілятору трактувати ім'я як ім'я ідентифікатора, а не як можливе ключове слово.

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

3
цікаво, хто би проголосував за цю "відповідь", що просто повторює пункт, який вже був зроблений (і набагато краще представлений) у голосованій відповіді за день до цього
gnat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.