Що ви робите, коли ваша конвенція про іменування стикається з вашою мовою?


14

Гаразд, це одна з тих дрібниць, які мене завжди клопочуть. Я, як правило, не скорочую ідентифікатори, і єдиний раз, коли я використовую короткий ідентифікатор (наприклад, i), - це жорсткий цикл. Тож це мене дратує, коли я працюю в C ++, і у мене є змінна, яку потрібно назвати, operatorабо classмені потрібно обійти її або використовувати абревіатуру, оскільки вона в кінцевому підсумку стирчить. Caveat: це може траплятися зі мною непропорційно часто, тому що я багато працюю в дизайні мови програмування, де доменні об'єкти можуть відображати поняття на мові хоста і ненавмисно викликати сутички.

Як би ти справився з цим? Скоротити? ( op) Неправильне написання? ( klass) Щось ще? ( operator_)


7
Крім простору імен, можливо, ми повинні розглянути можливість зміни наших умов іменування? Вибачте за очевидне.
Кріс

1
@Chris: Ви ніколи не можете довіряти програмісту, щоб зрозуміти очевидне! (Хоча в цьому випадку я і є.)
Джон Перді

7
Якщо є якісь причини сподобатися $varсинтаксису PHP , це все.
Joey Adams

3
@Joey Adams: Я коротко посміхнувся, коли побачив це питання і згадав усі основоположні питання PHP, що плавали навколо SE.
Кріс

3
Очевидно, змініть вихідний код мови, щоб дозволити мої умови іменування. Це також має перевагу "захисту" мого коду, оскільки він буде працювати / компілюватись лише на моєму перекладачі / компіляторі.
дієтабудди

Відповіді:


21
  1. Прийміть, що вам, можливо, доведеться внести незначні зміни до свого правила іменування, наприклад, додавання великих літер. Краще прийняти це якомога швидше, щоб весь наступний код був узгодженим.

  2. Розглянемо більш конкретні. Ключові слова, як правило, досить широкі, тому звуження classдо demonstrationClassне тільки вирішує проблеми, але й збільшує читабельність.


10

Це не те, з чим я стикався, але якщо я потрапляю в таку ситуацію, я б спробував вирішити це за допомогою наступних варіантів, для того, щоб.

  1. Спробуйте знайти синонім.
  2. (особливо для змінних) спробуйте знайти префікс або постфікс
  3. (особливо для класів) змініть першу букву на верхній регістр і забудьте про правило кодування, що імена не повинні відрізнятися лише у випадку. Цей варіант я б, мабуть, використовував лише в тому випадку, якщо конфлікт знаходиться з ключовим словом.
  4. Використовуйте абревіатуру.

1
Я не бачу, що не так у іменах, що відрізняються лише у випадку, особливо у списках аргументів, де параметр типу const Foo&не має жодного розумного повного імені, крім foo. Зрозуміло, може бути краще надати Fooбільш описову назву, ніж fooякщо вона живе у функціональному органі та служить менш спеціалізованій меті.
Джон Перді

@Jon - Я згоден, хоча особисто я більше схильний до префіксів "p_", "l_" та "m_", а не залежно від регістру. Я прийняв цю конвенцію через проблему "все-таки-ж-очевидно-ім'я". Яку конвенцію ви використовуєте для вирішення цього питання, в основному не має значення, якщо ви послідовно використовуєте його в будь-якому конкретному контексті - звичайно, підхід, що змінюється залежно від випадків, застосовується досить широко, щоб більшість розробників повинні його визнати.
Стів314

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

@ Steve314: Я отримав ваше значення з першого коментаря. Я не знаю, такі афікси завжди відчували себе занадто близькими до Системи Угорщини для мого комфорту.
Джон Перді

@Jon: Це правило, яке я застосовую релігійно, але я вважаю, що простіше помилитися, якщо два ідентифікатори відрізняються лише у випадку. Деякі з цих помилок буде помічено компілятором, а деякі їх набагато важче знайти (особливо якщо два ідентифікатори називають однаковий предмет). Я вважаю за краще одне загальне правило, за винятками від випадку до випадку, ніж ціла книга, що вартує правил, що стосуються всіх можливих випадків.
Барт ван Інген Шенау

6

Мова перемагає; ви не можете перехитрити компілятора (ігноруючи гидоти, такі як PL / 1 IF IF = THEN THEN THEN = ELSE ELSE ELSE = IF END, але тоді PL / 1 не змусить вас в першу чергу задавати питання). В основному, ви повинні дотримуватися правил мови, і ви повинні знайти альтернативу ключовим словам мови для власного використання - або знайти альтернативну мову.

Тож, за винятком дуже незвичних обставин, ви пристосовуєтесь до мови, а не навпаки.


5

Замість скорочення, як щодо подовження? Якщо ви реалізуєте конструкцію класу мовою Foo, як щодо використання FooClass та foo_class? (Модулюйте будь-які ваші переваги корпусу).


Чи встановив би ви префікс "java" на кожен ідентифікатор, який ви використовуєте в коді Java? І давайте навіть не згадувати проблеми з префіксом "C ++" на кожному ідентифікаторі ...
Steve314

@ Steve314, ви б не використовували префікс java в коді java, ви б використовували префікс java в коді c ++, який реалізує компілятор java. Крім того, ви б використовували його, лише якщо решта ідентифікатора була ключовим словом.
Вінстон Еверт

Гаразд - ви маєте на увазі подовження в загальних рисах, як конкретніше, на що посилається і ідентифікатор. Для різних програм "клас" може бути перейменований на "class_taught" або "class_of_animal" або "classiness_value" або будь-що інше. Я згоден - я просто знайшов приклад, орієнтований на компілятори, заплутаним.
Steve314

5

Деякі скорочення, які я використовував class, за частотою:

  • cls
  • clss
  • clazz
  • theClass
  • aClass

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

  • stringClass = Class.forName("java.lang.String");

Ніколи раніше не бачив "cls" для цього. Я в основному використовую aClass.
Костянтин Петрухнов

4

У C і C ++ ключові слова є всіма малими літерами, а мова чутливою до регістру, тому час від часу натискайте клавішу "shift", і багато питань відходять.

У Модулі 2, ключові слова прописних букви - але до тих пір , поки ваші ідентифікатори мають деякі малі літери різниця очевидна і зіткнення неможливо.

Крім того, абсолютно іменні конвенції певною мірою повинні відображати нормальні умови мови, яку ви використовуєте, тому я, безумовно, напишу "myClass" на Java, де я швидше за все напишу "My_Class" на C ++.

По суті, ви не просто пишете для компілятора, але те, що люди вважають читабельним, певною мірою залежить від контексту та пов'язаних з ними очікувань.


3
Навіть для чутливих до регістру мов я вважаю, що змішання classта Classзашкодить читабельності коду.
Кармастан

@Karmastan - можливо, це залежить від того, скільки часу ви витратили на роботу з чутливими до регістру мовами та умовами. Особисто верхній і нижній регістр "C" візуально дуже очевидний - я бачу шаблони використання випадків для довгих ідентифікаторів швидше, ніж я можу їх прочитати.
Steve314

3

Я часто не стикаюся з цим, але коли я це роблю, це, як правило, не проблема, оскільки я використовую Delphi, і це дозволяє вам вирішити цю проблему, попередньо встановивши & до ідентифікатора. Отже, "клас" не є дійсним ідентифікатором, але "& class" є.


Цікаво. У мене є утиліта, що генерує код, що дозволяє використовувати рядкові літерали де завгодно, де можна використовувати ідентифікатор. Спочатку більшість ідентифікаторів для згенерованого коду були записані у вигляді рядкових літералів, щоб уникнути ризику зіткнення ключових слів із зростаючим (і багатим на ключові слова) DSL. Тепер для більшості імен використовуються ідентифікатори (дивно, наскільки таким чином читається джерело), ​​але рядкові літерали завжди доступні як резервний. Я вважав, що це добре для створення коду, але обхід способів зіткнення ключових слів буде поганою ідеєю мовою загального призначення - але, можливо, я помиляюся.
Steve314

2

Я б додав якийсь простір імен до імені змінної. Наприклад, припустимо, що у вас є модуль з ім'ям користувача, я б змінив оператор імені змінної на щось на зразок user_operator або userOperator.


2
просто не використовуйте "гладкий", "ні" або "мій" як префікс
Стівен А. Лоу

2
Абсолютно. Я голосую "Jon_Purdys_Carerely_Chosen_Identifier_Prefix_".
Steve314

1
@Steven: Ще гірше, я бачу a, anі theвикористовується з тривожною частотою студентами CS початківців.
Джон Перді

1
@Jon Purdy, це не наша вина! Винен професор, який вирішив назвати їх екземпляр класу People () aPerson.
Бен Л

@Jon: Конвенція про іменування, де я працюю, вказує на те, що локальні змінні повинні починатися, aокрім щільних змінних циклу: /
Matthieu M.

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