Скорочення в CamelCase [закрито]


243

У мене є сумніви щодо CamelCase. Припустимо, у вас є ця абревіатура:Unesco = United Nations Educational, Scientific and Cultural Organization.

Ви повинні написати: unitedNationsEducationalScientificAndCulturalOrganization

Але що робити, якщо вам потрібно написати абревіатуру? Щось на зразок:

getUnescoProperties();

Чи правильно це писати так? getUnescoProperties() OR getUNESCOProperties();


2
Чи не повинно це бути у програмістів.SE?
Pacerier

5
Перетворення IMO на snake_case виявляє найкраще рішення. Вам подобається get_unesco_propertiesчи get_u_n_e_s_c_o_properties?
jchook

Пов’язана публікація - Чи повинна змінна називатися Id чи ID
RBT

Відповіді:


195

Деякі вказівки , про camelCaseякі написала Microsoft :

Використовуючи абревіатури, використовуйте регістр Паскаль або регістр верблюда для акронімів довжиною більше двох символів. Наприклад, використовувати HtmlButtonабо htmlButton. Однак слід використовувати великі літери, що складаються лише з двох символів, наприклад System.IOзамість System.Io.

Не використовуйте абревіатури в ідентифікаторах або назвах параметрів. Якщо вам потрібно використовувати абревіатури, використовуйте корпус верблюда для скорочень, які складаються з двох символів, навіть якщо це суперечить стандартній абревіатурі слова.

Підводячи підсумки:

  • Якщо ви використовуєте абревіатуру або абревіатуру, яка має два символи, покладіть їх у великі літери;

  • Коли абревіатура довша двох символів, використовуйте велику літер для першого символу.

Отже, у вашому конкретному випадку getUnescoProperties()це правильно.


11
Я думаю, я повинен почати використовувати IDзамість цього Id(який я використовую / бачу скрізь)
jasonscript

30
Технічно "ідентифікатор" не є абревіатурою (це абревіатура "ідентифікатор" або "ідентифікація"), але я не знаю, як / якщо ця інструкція допомагає в цьому. : - \
Брайант

64
Я не думаю, що це хороший стандарт. Розрізнення звичайних абревіатур, двобуквених акронімів та звичайних слів видається надскладним і суперечить ідеї про послідовну конвенцію іменування.
Сем

40
Крім того, заявляючи Microsoft, це не робить щось "правильним".
Сем

48
Приємно знати, що вони дотримуються власних рекомендацій: XMLHttpRequest()спочатку вони походили від Microsoft.
Макіен

315

У зв'язку із прийнятою відповіддю є справедливі зауваження щодо порад Microsoft .

  • Непослідовне трактування абревіатур / ініціалізмів залежно від кількості символів:
    • playerIDпроти playerIdпроти playerIdentifier.
  • Питання про те, чи варто все-таки використовувати великі літери, якщо вони з’являються на початку ідентифікатора:
    • USTaxes проти usTaxes
  • Складність у розрізненні декількох абревіатур:
    • тобто USIDvs usId(або parseDBMXMLна прикладі Вікіпедії).

Тому я опублікую цю відповідь як альтернативу прийнятій відповіді. Усі абревіатури слід обробляти послідовно; абревіатури слід трактувати як будь-яке інше слово. Цитуючи Вікіпедію :

... деякі програмісти вважають за краще абревіатури трактувати так, ніби вони є малими словами ...

Тому повторно: питання ОП, я згоден з прийнятою відповіддю; це вірно:getUnescoProperties()

Але я думаю, я б дійшов до іншого висновку в цих прикладах:

  • US TaxesusTaxes
  • Player IDplayerId

Тож голосуйте за цю відповідь, якщо ви вважаєте, що двобуквові абревіатури повинні трактуватися як інші абревіатури.

Справа верблюда - це умова, а не специфікація. Тож я здогадуюсь правил поширеної думки.

( EDIT: Видалення цієї пропозиції, щоб голоси вирішили це питання; як говорить @Brian David; Переповнення стека - це не "конкурс популярності", і це питання було закрито як "на основі думки")

Незважаючи на те, що багато хто вважає за краще ставитися до абревіатур як до будь-якого іншого слова, більш поширеною практикою може бути ставлення абревіатур у "all-caps" (хоча це призводить до "гидоти")

Інші ресурси:

  • Зауважимо, деякі люди розрізняють абревіатуру та абревіатуру
  • Зауважте, що в інструкціях Microsoft розрізняють дво символьні абревіатури та "абревіатури довше двох символів"
  • Зауважте, деякі люди рекомендують взагалі уникати скорочень / абревіатур
  • Зауважте, деякі люди рекомендують взагалі уникати CamelCase / PascalCase
  • Зауважимо, що деякі люди розрізняють "послідовність" як "правила, які здаються внутрішньо непослідовними" (тобто трактування дво символьних абревіатур, відмінних від три символьних абревіатур); деякі люди визначають "послідовність" як "послідовно застосовувати одне і те ж правило" (навіть якщо правило є внутрішньо непослідовним)
  • Рамкові рекомендації щодо дизайну
  • Правила Microsoft

26
1) Невідповідності немає. "Id" - це абревіатура , а не абревіатура. 2) Це залежить від контексту ідентифікатора, тобто класу, інтерфейсу, атрибута, типу перерахунку, статичного поля, параметра, методу, властивості чи події. Якщо в настанові для ідентифікатора використовується PascalCase, це було б USTaxesі PlayerId; camelCase: usTaxesі playerId. 3) Це було б USIdу PascalCase, usIdу camelCase та parseDbmXmlу camelCase.
Фредерік Краутвальд

6
Ви маєте рацію, це абревіатура. Моя думка, що це повинні бути UsTaxes, UsId. Двохбуквену "абревіатуру або абревіатуру" не слід трактувати інакше, ніж трибуквенні або інші "звичайні слова". Інша порада, відповідь @ Eonil, полягає в тому, щоб взагалі уникати скорочувачів. unitedStatesTaxes або playerIdentifier.
Червоний горох

3
Ха-ха. Я сумніваюся, що плутанина може виникнути - багато - але вказівки є, ну, вказівками, щоб запобігти можливій плутанині. Надуманий (поганий) приклад акроніма в науковому контексті: InIN(item)vs InIn(item)(підказка: IN - дюйм (и)). Або, IDById(id)порівняно IdById(id), з контекстною наукою (натяк: ID означає інфекційну хворобу). "Два символи довго" - що в якому контексті?
Фредерік Краутвальд

2
На посиланні Microsoft "... використовуйте регістр Паскаля або корпус верблюда для акронімів довжиною більше двох символів . ... Однак, ви повинні використовувати великі літери, що складаються лише з двох символів ..." Це частина, яку я назвав би "непослідовною ". Краща характеристика - це "виняток". І ви принаймні ви раціоналізували, чому два буквені абревіатури можуть бути більше плутанини. Але я здогадуюсь, що цим програмам із "CanCan" просто не пощастило; неоднозначно, чи це танцювальний хід, чи територіальна мережа спільнот Церкви де А'Авірон де Нант :)
The Red Pea

18
Автор « Порушення капіталу»: Як поводитися з абревіатурами в CamelCase правильно посилається на термін «гидота», коли він пише: «Хоча [використання великих абревіатур] працює у простих випадках, це призводить до гидоти, коли одна абревіатура слідує за іншою: HTTPURLConnection, XMLIDREF»
kghastie

21

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


Найкращою практикою для абревіатури було б максимально уникати акронімів. Так чи інакше, це не так, оскільки абревіатура UNESCOбільше знайома, ніж повна назва UnitedNationsEducationalScientificAndCulturalOrganization.

Тоді, я думаю, це UNESCOмає більше сенсу, ніж Unescoтому, що просто це ближче до форми реального життя, настільки звичної. У мене були проблеми, щоб зрозуміти, що це слово Unescoнасправді означає.

Як інший приклад, подумайте Arc. Це звучить як крива навколо кола, але в Іржі це означає Atomically Reference Counted. Якби це було написано так ARC, принаймні читачі визнали б, що це слово є абревіатурою чогось іншого, а не якоюсь кривою.

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

З цієї точки зору, ми втрачаємо деяку легкість для читання, використовуючи Unescoбільш , UNESCOпоки не отримує нічого.

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


4
Наведені вище приклади трохи вводять в оману. "Найкращий підхід, який я коли-небудь бачив, - це Apple ... Це означає поводження з абревіатурами як власним іменником ... Отже, ЮНЕСКО має більше сенсу" - Це не те, як ви пишете власні іменники.
Мікко Рантанен

@MikkoRantanen Я оновив свою відповідь.
Еоніл

7
Нічого собі, я навряд чи знайду пропозицію у цій відповіді, з якою я погодився б :-)
Йозеф Сабл

Це повністю залежить від контексту коду, над яким ви працюєте, чи мають абревіатури / абревіатури більше чи менше сенсу. Наприклад, я працюю у фінансах, і існує стільки унікальних термінів, які є єдиними в галузі та фактично в усьому світі. Ви витрачаєте час і створюєте зайве багатослів’я, не використовуючи абревіатур, які кожен, хто буде працювати в цій компанії, знає напам’ять. Наприклад, PV для теперішньої вартості, FV для майбутньої вартості, середня середня величина, exp для показника тощо.
Буде Едігер

@ pm100 Це не те, що я сказав? ЮНЕСКО - це не те, як ви пишете власні іменники.
Мікко Рантанен

17

Для перетворення в CamelCase існує також (майже) детермінований алгоритм випадку Camel :

Починаючи з прозової форми назви:

  1. Перетворіть фразу в звичайний ASCII і видаліть усі апострофи. Наприклад, "алгоритм Мюллера" може стати "алгоритмом Мюллера".
  2. Розподіліть цей результат на слова, розділяючи пробіли та будь-які інші розділові знаки (зазвичай дефіси).
    1. Рекомендовано: якщо будь-яке слово вже має звичайний вигляд верблюда в загальному вигляді, розділіть його на складові частини (наприклад, "AdWords" стає "рекламними словами"). Зауважте, що таке слово, як "iOS", насправді не є справді у справі верблюда; він не відповідає будь-якій умові, тому ця рекомендація не застосовується.
  3. Тепер усе пропишене (в тому числі і абревіатури), а тоді лише перший символ:
    1. … Кожне слово, щоб отримати верхній корпус верблюда, або
    2. … Кожне слово, окрім першого, дає нижню справу верблюда
  4. Нарешті, об’єднайте всі слова в єдиний ідентифікатор.

Зауважимо, що з написання оригінальних слів майже повністю не враховується.

У наступних прикладах "XML HTTP-запит" правильно перетворений на XmlHttpRequest, XMLHTTPRequest неправильний.


17

getUnescoProperties() має бути найкращим рішенням ...

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

Зазвичай в програмуванні OO змінні повинні починатися з малої літери ( lowerCamelCase), а клас повинен починатися з великої літери ( UpperCamelCase).

Коли сумніваєтесь, просто очистіть camelCase;)

parseXMLдобре, parseXmlтежcamelCase

XMLHTTPRequestмає бути XmlHttpRequestабо xmlHttpRequestвзагалі не підходити до наступних абревіатур верхнього регістру, остаточно не зрозуміло для всіх тестових випадків.

наприклад, як ви читаєте це слово HTTPSSLRequest, HTTP + SSLабо HTTPS + SL(це не означає нічого, окрім…), у такому випадку дотримуйтесь конвенції справи про верблюдів та йдіть на, httpSslRequestабо httpsSlRequest, можливо, це вже не приємно, але це, безумовно, більш зрозуміло.


2
Мені подобається ваш HTTPSSLприклад, хоча SL нічого не означає, як щодо чогось типу HTTPSSHTunnel? Це HTTPS + SH (оболонка) чи HTTP + SSH? Конвенція Google, безумовно, менш неоднозначна.
L. Holanda

10

У github є airbnb Guide для стилю JavaScript з великою кількістю зірок (~ 57,5 ​​тис. На даний момент) та посібники про абревіатури, які говорять:

Акроніми та ініціалізми завжди мають бути написані з великої літери або всі з малої літери.

Чому? Назви призначені для читабельності, а не для заспокоєння комп'ютерного алгоритму.

// bad
import SmsContainer from './containers/SmsContainer';

// bad
const HttpRequests = [
  // ...
];

// good
import SMSContainer from './containers/SMSContainer';

// good
const HTTPRequests = [
  // ...
];

// also good
const httpRequests = [
  // ...
];

// best
import TextMessageContainer from './containers/TextMessageContainer';

// best
const requests = [
  // ...
];

7
" Чому? Імена призначені для читабельності, а не для заспокоєння комп'ютерного алгоритму ". Так, XMLHTTPRequestчи краще читати, ніж XmlHttpRequestтак?
Л. Голландія

2
Не має сенсу, чому httpRequestsце вважається хорошим, але HttpRequestsпогано. дотримуючись цього принципу, для XML запит HTTP повинен бути xmlhttpRequest???
Л. Голландія

1
Я часто цитую посібник зі стилю AirBnb, але в цьому випадку я не згоден. Я особливо не згоден з їх твердженням: "Акроніми та ініціалізми завжди повинні бути великими, або всі нижчі." xmlHttpRequestчитабельніше, ніж XMLHTTPRequestна мою думку.
Ронан

3

В даний час я використовую такі правила:

  1. Капітал випадку абревіатур: XMLHTTPRequest, xmlHTTPRequest, requestIPAddress.

  2. Camel разі скорочень: ID[entifier], Exe[cutable], App[lication].

ID виняток, вибачте, але правда.

Коли я бачу велику літеру, я припускаю абревіатуру, тобто окреме слово для кожної літери. У скороченнях немає окремих слів для кожної літери, тому я використовую випадок верблюда.

XMLHTTPRequest є неоднозначним, але це рідкісний випадок, і це не так багатозначно, тому це нормально, правила і логіка важливіші, ніж краса.


1

Посібник зі стилю JavaScript Airbnb трохи розповідає про це . В основному:

// bad
const HttpRequests = [ req ];

// good
const httpRequests = [ req ];

// also good
const HTTPRequests = [ req ];

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


1

Окрім того, що сказав @valex, я хочу скласти ще кілька речей із поданими відповідями на це питання.

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

C Різкий

Microsoft написала деякі вказівки, де здається, що HtmlButtonце правильний спосіб назвати клас для цих випадків.

Javascript

У Javascript є кілька глобальних змінних з абревіатурами, і він використовує їх у верхньому регістрі (але смішно, не завжди послідовно) ось кілька прикладів:

encodeURIComponent XMLHttpRequest toJSON toISOString


Ну, це стара Netscape, у неї навіть є деякі, на яких немає верблюда onerror.
Едді

1

відмова від відповідальності: Англійська мова не є моїм материнським тоном. Але я довго думав над цією проблемою, особливо при використанні вузла (стиль верблюда) для обробки бази даних, оскільки ім’я полів таблиці слід зміяти, це моя думка:

Існує 2 види "абревіатур" для програміста:

  • природною мовою, ЮНЕСКО
  • наприклад, в мові програмування комп'ютера tmc and textMessageContainer, яка зазвичай представляється локальною змінною.

У світі програмування всі абревіатури природною мовою слід розглядати як слово , причини:

  1. при програмуванні ми повинні називати змінну або в стилі абревіатури, або в стилі неакронім. Отже, якщо ми називаємо функцію getUNESCOProperties, це означає, що ЮНЕСКО є абревіатурою (інакше це не повинні бути всі великі літери), але, очевидно, getі propertiesне є абревіатурами. Таким чином, ми повинні називати цю функцію або gunescop, або getUnitedNationsEducationalScientistAndCulturalOrganizationProperties , обидва неприйнятні.

  2. Природна мова постійно розвивається, і сьогоднішні акроніми стануть словами завтра , але програми повинні бути незалежними від цієї тенденції і стояти назавжди.

До речі, у найбільш голосовій відповіді IO - це абревіатура в значенні комп’ютерної мови (означає InputOutput), але це ім'я мені не подобається, оскільки я думаю, що абревіатура (на комп'ютерній мові) повинна використовуватися лише для імені локальна змінна, але клас / функція вищого рівня, тому InputOutput слід використовувати замість IO


"язик", а не "тон"
Дан Даскалеску

0

ЮНЕСКО - особливий випадок, оскільки його зазвичай (англійською) читають як слово, а не абревіатуру - як УЄФА, RADA, BAFTA та на відміну від BBC, HTML, SSL


1
Це відмінність між "абревіатурами" і простими "абревіатурами"; ця відмінність, здавалося б, є актуальною для всієї дискусії, але майже повністю усунута у поданих відповідях.
симон

BBC, HTML, SSL та інші абревіатури, де ви озвучуєте кожну букву, більш точно називаються ініціалізмами. Такі слова, як ЮНЕСКО, які вимовляються як слово, є справжніми абревіатурами.
Lrdwhyt

-2

Існує також ще одна угода про верблюжість, яка намагається сприяти читанню для абревіатур, використовуючи або великі HTMLрегістри ( html), або малі регістри ( ), але уникаючи обох ( Html).

Тож у вашому випадку ви могли написати getUNESCOProperties. Ви також можете написати unescoPropertiesдля змінної або UNESCOPropertiesдля класу (умова для класів починається з великої літери).

Це правило стає складним, якщо ви хочете скласти дві абревіатури, наприклад для класу XML HTTP Request. XMLHTTPRequestПочнеться з великого регістру, але оскільки прочитати його буде непросто (це XMLH TTP-запит?), І XMLhttpRequestпорушив би угоду верблюда (це XM Lhttp Request?), Найкращим варіантом було б змішати регістр:, XMLHttpRequestщо є власне те, що використовував W3C . Однак використання подібних назв не рекомендується. Для цього прикладу HTTPRequestбуло б краще ім’я.

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

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


3
Я не вірю цілій нитці :-) Так це було б XMLToHtmlConverter, але HTMLToXmlConverter? Нічого ...
Йозеф Сабл

1
@ JosefSábl, так, було б так. Щодо вашої голоси, я не кажу, що мені подобається ця конвенція, але вона, безумовно, існує.
Jesús Carrera

1
Я читав питання як "Що таке хороша умова написання акронімів у справі верблюдів", а не "Чи можете ви перелічити всі існуючі умовні умови". І оскільки я вважаю вашу згадану конвенцію дуже поганою, я подав заяву :-)
Йозеф Сабл

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