Remove ads
З Вікіпедії, вільної енциклопедії
У комп'ютерному програмуванні узгодження імен — це набір правил для вибору послідовності символів, які будуть використовуватися для ідентифікаторів, які позначають змінні, типи, функції та інші сутності у початковому коді та документації.
Причини використання угоди про іменування (на відміну від дозволу програмістам вибирати будь-яку послідовність символів) включають наступне:
Вибір умов найменування може бути надзвичайно суперечливим питанням, коли прихильники кожного вважають своє найкращим, а інших — нижчим. У просторіччі кажуть, що це питання догми.[2] Багато компаній також створили власний набір конвенцій.
Деякі з потенційних переваг, які можна отримати, прийнявши угоду про іменування, включають наступне:
Вибір конвенцій про найменування (і ступінь їх дотримання) часто є спірним питанням, прихильники вважають свою точку зору найкращою, а інші — нижчою. Більше того, навіть за наявності відомих і чітко визначених домовленостей про найменування деякі організації можуть не дотримуватися їх послідовно, що спричиняє непослідовність і плутанину. Ці проблеми можуть посилюватися, якщо правила іменування є внутрішньо суперечливими, довільними, складними для запам'ятовування або іншим чином сприймаються як більш обтяжливі, ніж корисні.
Добре підібрані ідентифікатори значно полегшують розробникам і аналітикам розуміння того, що робить система та як виправити або розширити вихідний код для застосування для нових потреб.
Наприклад, хоча
a = b * c;
синтаксично правильний, його мета неочевидна. Порівняйте це з:
weekly_pay = hours_worked * hourly_pay_rate;
що визначає значення і зміст початкового коду, принаймні для тих, хто знайомий з контекстом виразу.
Експерименти показують, що стиль ідентифікатора впливає на запам'ятовування та точність, а знайомство зі стилем прискорює запам'ятовування.[3]
Точні правила іменування залежать від контексту, у якому вони використовуються. Тим не менш, є кілька загальних елементів, які впливають на більшість, якщо не на всі угоди про найменування, які широко використовуються сьогодні.
Фундаментальними елементами всіх домовленостей про іменування є правила, що стосуються довжини ідентифікатора (тобто кінцевої кількості окремих символів, дозволених в ідентифікаторі). Деякі правила диктують фіксовану числову межу, тоді як інші визначають менш точні евристики чи вказівки.
Правила щодо довжини ідентифікатора постійно оскаржуються на практиці та є предметом багатьох академічних дебатів.
Деякі міркування:
Це відкрите питання дослідження, чи деякі програмісти віддають перевагу коротшим ідентифікаторам, тому що їх легше ввести або придумати, ніж довші ідентифікатори, чи тому, що в багатьох ситуаціях довший ідентифікатор просто захаращує видимий код і не дає видимої додаткової переваги.
Стислість у програмуванні частково пояснюється:
Деякі угоди про найменування обмежують, чи літери можуть відображатися у верхньому чи нижньому регістрі. Інші конвенції не обмежують регістр літер, але надають чітке тлумачення на основі регістру літер. Деякі угоди про найменування визначають, чи можна використовувати букви, цифри або буквено-цифрові символи, і якщо так, то в якій послідовності.
Загальна рекомендація: «Використовуйте значущі ідентифікатори». Одне слово може бути не таким значущим або конкретним, як кілька слів. Отже, деякі домовленості про найменування визначають правила обробки «складених» ідентифікаторів, що містять більше одного слова.
Оскільки більшість мов програмування не дозволяють використовувати пробіли в ідентифікаторах, необхідний метод розмежування кожного слова (щоб полегшити наступним читачам інтерпретацію того, які символи належать якому слову). Історично деякі ранні мови, зокрема FORTRAN (1955) і ALGOL (1958), дозволяли пропуски в ідентифікаторах, визначаючи кінець ідентифікаторів за контекстом. Від цього відмовилися в пізніших мовах через складність токенізації. Можна писати назви, просто з'єднуючи слова, і це іноді використовується, як у mypackage
для назв пакетів Java,[4] хоча розбірливість страждає для більш довгих термінів, тому зазвичай використовується певна форма розділення.
Один із підходів полягає в тому, щоб розділяти окремі слова не буквено-цифровим символом. Для цієї мети зазвичай використовуються два символи: дефіс («-») і підкреслення («_»); наприклад, назва з двох слів «два слова» буде представлена як «два слова» або «два_слова». Дефіс використовується майже всіма програмістами, які пишуть COBOL (1959), Forth (1970) і Lisp (1958); він також поширений в Unix для команд і пакетів і використовується в CSS.[5] Ця конвенція не має стандартної назви, хоча її можна називати lisp-case або COBOL-CASE (порівняйте Pascal case), kebab-case, brochette-case або інші варіанти.[6][7][8][9] З них kebab-case, датований принаймні 2012 роком,[10] з тих пір набув певної популярності.[11][12]
Навпаки, мови традиції FORTRAN/ALGOL, зокрема мови сімейств C і Pascal, використовували дефіс для інфіксного оператора віднімання та не бажали вимагати пробілів навколо нього (як мови вільної форми), запобігаючи його використанню в ідентифікатори. Альтернативою є використання підкреслень; це поширене явище в сімействі C (включаючи Python), зі словами з малого регістру, які можна знайти, наприклад, у «Мові програмування C» (1978), і стало відомим як «зміїний регістр». Знаки підкреслення у верхньому регістрі, як у UPPER_CASE, зазвичай використовуються для макросів препроцесора C, тому відомих як MACRO_CASE, і для змінних середовища в Unix, таких як BASH_VERSION у bash. Іноді це з гумором називають SCREAMING_SNAKE_CASE.
Інший підхід полягає в тому, щоб позначити межі слів за допомогою середньої літери, що називається «camelCase», «PascalCase» і багатьма іншими іменами, таким чином відповідно відображаючи «два слова
» як «twoWords
» або «TwoWords
». Ця конвенція зазвичай використовується в Pascal, Java, C# та Visual Basic . Обробка ініціалізмів в ідентифікаторах (наприклад, «XML» і «HTTP» у XMLHttpRequest
) різниться. Деякі вимагають, щоб вони були написані у нижньому регістрі (наприклад, XmlHttpRequest
), щоб полегшити введення, читабельність і легкість сегментації, тоді як інші залишають їх у верхньому регістрі (наприклад, XMLHTTPRequest
). для точності.
Форматування | Імена |
---|---|
два слова |
flatcase[13][14] |
ДВА СЛОВА |
ВЕЛИКИЙ РЕГІСТР[13] |
два слова |
(нижній) camelCase, dromedaryCase |
Два слова |
PascalCase, UpperCamelCase, StudlyCase[15] |
два_слова |
snake_case, snail_case, вибоїна_case |
ДВА_СЛОВА |
ALL_CAPS, SREAMING SNAKE CASE, MACRO_CASE, CONSTANT_CASE |
два_слова |
camel_Snake_Case |
Два_слова |
Pascal_Snake_Case, Title_Case |
два слова |
kebab-case, dash-case, lisp-case, spinal-case |
ДВА СЛОВА |
TRAIN-CASE, COBOL-CASE, SCREAMING-KEBAB-CASE |
Два слова |
Train-Case,[13] HTTP-Header-Case[16] |
Деякі домовленості про найменування представляють правила або вимоги, які виходять за рамки вимог конкретного проекту чи проблемної області, а натомість відображають більший всеосяжний набір принципів, визначених архітектурою програмного забезпечення, базовою мовою програмування чи іншою міжпроектною методологією.
Мабуть, найвідомішою є угорська нотація, яка кодує призначення («Apps Hungarian») або тип («Systems Hungarian») змінної в назві.[17] Наприклад, префікс «sz» для змінної szName вказує на те, що змінна є рядком із нульовим завершенням.
Стиль, який використовується для дуже короткого (вісім символів і менше), може бути таким: LCCIIL01, де LC буде заявкою (акредитиви), C для COBOL, IIL для конкретної підмножини процесу, а 01 — порядковий номер.
Цей вид конвенції все ще активно використовується в мейнфреймах, що залежать від JCL, і також спостерігається у стилі MS-DOS 8.3 (максимум вісім символів із крапкою-роздільником, після якого йде три символи).
«Мова OF» IBM була задокументована в посібнику IMS (система управління інформацією).
У ньому детально описана схема слів PRIME-MODIFIER-CLASS, яка складалася з імен на кшталт «CUST-ACT-NO» для позначення «номера рахунку клієнта».
Слова PRIME мали на меті позначити основні «сутності», що представляють інтерес для системи.
Для додаткового уточнення, кваліфікації та читабельності використано слова-МОДИФІКАТОРИ.
Слова CLASS в ідеалі були б дуже коротким списком типів даних, що стосуються конкретної програми. Загальні слова CLASS можуть бути такими: NO (номер), ID (ідентифікатор), TXT (текст), AMT (сума), QTY (кількість), FL (прапор), CD (код), W (робота) тощо. На практиці доступні слова КЛАСУ являтимуть собою список із менш ніж двох десятків термінів.
Слова CLASS, зазвичай розташовані праворуч (суфікс), служили майже тій самій меті, що й префікси угорської нотації.
Призначення слів CLASS, крім узгодженості, полягало в тому, щоб вказати програмісту тип даних певного поля даних. До прийняття полів BOOLEAN (лише два значення) FL (прапор) вказував на поле лише з двома можливими значеннями.
Конвенції та передові методи кодування Adobe пропонують стандарти імен для ActionScript, які здебільшого відповідають стандартам ECMAScript. Стиль ідентифікаторів схожий на стиль Java.
В Ada єдиним рекомендованим стилем ідентифікаторів є Mixed_Case_With_Underscores
.[18]
In APL dialects, the delta (Δ) is used between words, e.g. PERFΔSQUARE (no lowercase traditionally existed in older APL versions). If the name used underscored letters, then the delta underbar (⍙) would be used instead.
У C і C++ ключові слова та стандартні ідентифікатори бібліотек здебільшого написані малими літерами. У стандартній бібліотеці C найпоширенішими є скорочені назви (наприклад, isalnum для функції, яка перевіряє, чи є символ буквено-цифровим), тоді як стандартна бібліотека C++ часто використовує підкреслення як роздільник слів (наприклад, out_of_range). Ідентифікатори, що представляють макроси, за домовленістю записуються лише з використанням великих літер і підкреслення (це пов'язано з угодою багатьох мов програмування про використання ідентифікаторів у верхньому регістрі для констант). Імена, які містять подвійне підкреслення або починаються з підкреслення та великої літери, зарезервовані для реалізації (компілятор, стандартна бібліотека) і не повинні використовуватися (наприклад, __reserved або _Reserved).[19][20] Зовні це схоже на стропінг, але семантика відрізняється: підкреслення є частиною значення ідентифікатора, а не символами лапок (як стропінг): значенням __foo є __foo (що зарезервовано), а не foo (але в іншому просторі імен).
Угоди про найменування C# зазвичай відповідають інструкціям, опублікованим Microsoft для всіх мов .NET[21] (див. розділ .NET нижче), але жодні угоди не застосовуються C# компілятор.
Інструкції Microsoft щодо іменування полів стосуються лише static
, public
і protected
полів; поля, які не є static
та мають інші рівні доступності (наприклад, internal
та private
), явно не охоплюються цими рекомендаціями.[22] Найбільш поширеною практикою є використання PascalCase
для назв усіх полів, за винятком тих, які є private
(і не є ані const
, ані static
), яким надаються імена, що використовують camelCase
, перед яким стоїть одне підкреслення; наприклад, _totalCount
.
Будь-яке ім'я ідентифікатора може мати префікс комерційного символу (@
) без будь-яких змін у значенні. Тобто і factor
, і @factor
посилаються на той самий об'єкт. За домовленістю цей префікс використовується лише у випадках, коли інакше ідентифікатор був би або зарезервованим ключовим словом (наприклад, for
і while
), яке не можна використовувати як ідентифікатор без префікса, або контекстним ключовим словом (наприклад, from
і where
), у яких випадках префікс не є обов'язковим (принаймні, не під час його оголошення; наприклад, хоча оголошення dynamic dynamic;
є дійсним, це зазвичай розглядатиметься як dynamic @dynamic;
щоб одразу вказати читачеві, що остання є назвою змінної).
У мові Dart, яка використовується у Flutter SDK, угоди подібні до умов Java, за винятком того, що константи записуються в нижньому регістрі. Dart нав'язує синтаксичне правило, згідно з яким нелокальні ідентифікатори, які починаються з підкреслення (_), розглядаються як приватні (оскільки мова не має явних ключових слів для публічного чи приватного доступу). Крім того, імена вихідних файлів не відповідають правилу Java «один загальнодоступний клас на вихідний файл, ім'я має збігатися», замість цього для імен файлів використовується snake_case.[23]
У Go для написання багатослівних імен прийнято використовувати MixedCaps
або mixedCaps
, а не підкреслення. Коли йдеться про структури чи функції, перша буква вказує на видимість зовнішніх пакетів. Зробивши першу літеру великою, цей фрагмент коду експортується, тоді як нижній регістр робить його придатним для використання лише в поточній області.[24]
У Java різні спільноти Java, такі як Sun Microsystems,[25] Netscape,[26] AmbySoft,[27] тощо. Нижче наведено зразок умов іменування, встановлених Sun Microsystems, де ім'я в «CamelCase» складається з ряду слів, з'єднаних без пробілів, причому початкова літера кожного слова, за винятком першого слова, написана великими літерами — наприклад, «camelCase».
Тип ідентифікатора | Правила найменування | Приклади |
---|---|---|
Класи | Назви класів мають бути іменниками UpperCamelCase , з великою першою літерою кожного слова. Використовуйте цілі слова — уникайте акронімів і абревіатур (окрім випадків, коли абревіатура використовується набагато ширше, ніж довга форма, наприклад URL-адреса або HTML). |
|
Методи | Методи мають бути дієсловами lowerCamelCase або багатослівними назвами, які починаються з дієслова малими літерами; тобто з першою літерою малої та першими літерами наступних слів великими. |
|
Змінні | Локальні змінні, змінні екземпляра та змінні класу також записуються в lowerCamelCase . Імена змінних не повинні починатися з символів підкреслення (_ ) або знака долара ($ ), навіть якщо обидва дозволені. Це відрізняється від інших конвенцій кодування, які стверджують, що підкреслення слід використовувати для префікса всіх змінних екземпляра.
Імена змінних мають бути короткими, але змістовними. Вибір назви змінної має бути мнемонічним — тобто таким, щоб вказувати випадковому спостерігачеві намір її використання. Слід уникати односимвольних імен змінних, за винятком тимчасових змінних, які «викидаються». Загальні назви для тимчасових змінних: i, j, k, m і n для цілих чисел; c, d і e для символів. |
|
Константи | Константи слід писати великими літерами, розділеними символами підкреслення. Імена констант також можуть містити цифри, якщо це необхідно, але не як перший символ. |
|
Компілятори Java не дотримуються цих правил, але недотримання їх може призвести до плутанини та помилкового коду. Наприклад, widget.expand()
і Widget.expand()
увазі істотно різні поведінки: widget.expand()
передбачає виклик методу expand()
в екземплярі під назвою widget
, тоді як Widget.expand()
передбачає виклик статичного методу expand()
у класі Widget
.
Один із широко поширених стилів кодування Java передбачає використання UpperCamelCase
для класів і lowerCamelCase
використовуватися для примірників (instances) і методів.[25]
Визнаючи таке використання, деякі IDE, такі як Eclipse, реалізують ярлики на основі CamelCase. Наприклад, у функції content assist Eclipse введення лише великих літер слова CamelCase запропонує будь-яке відповідне ім’я класу чи методу (наприклад, введення «NPE» та активація content assist може запропонувати NullPointerException
).
Ініціалізація з трьох або більше літер — CamelCase замість верхнього регістру (наприклад, parseDbmXmlFromIPAddress
замість parseDBMXMLFromIPAddress
). Можна також встановити межу на дві або більше букв (наприклад parseDbmXmlFromIpAddress
).
Вбудовані бібліотеки JavaScript використовують ті самі правила іменування, що й Java. Типи даних і функції конструктора використовують верхній регістр (RegExp
, TypeError
, XMLHttpRequest
, DOMObject
), а методи використовують нижній регістр (getElementById
, getElementsByTagNameNS
, createCDATASection
). Щоб бути послідовними, більшість розробників JavaScript дотримуються цих умов.[28] Дивіться також: Конвенції Дугласа Крокфорда
Загальною практикою в більшості діалектів Lisp є використання тире для розділення слів в ідентифікаторах, як у with-open-file
та make-hash-table
. Імена динамічних змінних зазвичай починаються і закінчуються зірочками: *map-walls*
. Назви констант позначені знаком плюс: +map-size+
.[29][30]
Microsoft .NET рекомендує UpperCamelCase
, також відомий як PascalCase, для більшості ідентифікаторів. (lowerCamelCase
рекомендовано для параметрів і змінних) і є спільною угодою для .NET мови.[31] Корпорація Майкрософт також рекомендує не використовувати підказки щодо префіксів типів (також відомі як Угорська нотація).[32] Замість використання угорської нотації рекомендується закінчувати назву назвою базового класу; LoginButton
замість BtnLogin
.[33]
Objective-C має загальний стиль кодування, який сягає корінням у Smalltalk.
Сутності верхнього рівня, включаючи класи, протоколи, категорії, а також конструкції C, які використовуються в програмах Objective-C, як-от глобальні змінні та функції, мають верхній регістр із коротким префіксом у верхньому регістрі, що позначає простір імен, наприклад NSString
, UIAppDelegate
, NSApp
або CGRectMake
. Константи можуть мати префікс малої літери «k», наприклад kCFBooleanTrue
.
Змінні екземпляра об'єкта використовують lowerCamelCase із префіксом підкреслення, як-от _delegate
та _tableView
.
Назви методів використовують кілька частин нижнього регістру CamelCase, розділених двокрапками, які розмежовують аргументи, наприклад: application:didFinishLaunchingWithOptions:
stringWithFormat:
і isRunning
.
У мовах Wirthian Pascal, Modula-2 і Oberon зазвичай використовуються ідентифікатори з Capitalized
або UpperCamelCase
для програм, модулів, констант, типів і процедур, а lowerCamelCase
ідентифікатори в lowercase
або в нижньому регістрі для математичних констант, змінних, формальних параметрів і функцій.[34] У той час як деякі діалекти підтримують підкреслення та знаки долара в ідентифікаторах, регістр «змія» та регістр макросів, швидше за все, обмежуються використанням в іноземних інтерфейсах API.[35]
Perl бере деякі ознаки своєї спадщини C для конвенцій. Назви локальних змінних і підпрограм пишуться малими літерами з інфіксним підкресленням. Підпрограми та змінні, призначені для обробки як приватні, мають префікс підкреслення. Змінні пакета виділяються в регістр заголовків. Усі оголошені константи мають великі літери. Назви пакетів пишуться регістром, за винятком прагмат, наприклад strict
і mro
, які пишуться малими літерами.[36]
[37]
Рекомендації PHP містяться в PSR-1 (стандартна рекомендація PHP 1) і PSR-12.[38] Згідно з PSR-1, назви класів повинні бути в регістрі Pascal, константи класів повинні бути в MACRO_CASE, а назви функцій і методів повинні бути в верблюдячому регістрі.[39]
Python і Ruby рекомендують UpperCamelCase
для назв класів, CAPITALIZED_WITH_UNDERSCORES
для констант і snake_case
для інших назв.
У Python, якщо ім'я має бути «private», перед ним ставиться один або два символи підкреслення (у Python це більш-менш хак). Приватні змінні застосовуються в Python лише за угодою. Імена також можуть бути суфіксами підкреслення, щоб запобігти конфлікту з ключовими словами Python. Префікс із подвійним підкресленням змінює поведінку в класах щодо викривлення імен. Префікс і з подвійним підкресленням — так звані методи «dunder» («double under») у Python — зарезервовано для «магічних імен», які виконують особливу поведінку в об'єктах Python.[40]
Хоча немає офіційного посібника зі стилю для R, посібник зі стилю tidyverse від R-гуру Хедлі Вікхема встановлює стандарт для більшості користувачів.[41] Цей посібник рекомендує уникати спеціальних символів у назвах файлів і використовувати лише цифри, літери та підкреслення для назв змінних і функцій, напр. fit_models.R.
Raku дотримується більш-менш тих самих умов, що й Perl, за винятком того, що він допускає інфіксний дефіс -
або апостроф '
(або одиночний цитата) всередині ідентифікатора (але не двох поспіль), за умови, що після нього йде буква. Тому програмісти Raku часто використовують у своїх ідентифікаторах kebab case; наприклад,
fish-food
і don't-do-that
є дійсними ідентифікаторами.
[42]
Rust рекомендує UpperCamelCase
для псевдонімів типів і назв структур, ознак, enum і варіантів enum, SCREAMING_SNAKE_CASE
для констант або статики та snake_case
для імен членів змінних, функцій і структур.[43]
Swift змінив правила іменування з кожним окремим випуском. Однак велике оновлення Swift 3.0 стабілізувало умови іменування для lowerCamelCase
у змінних і оголошеннях функцій. Константи зазвичай визначаються типами перерахувань або константними параметрами, які також записуються таким чином. Оголошення класів та інших типів об'єктів є UpperCamelCase
.
Починаючи з Swift 3.0, було створено чіткі вказівки щодо іменування мови з метою стандартизації імен і декларацій API для всіх сторонніх API. [44]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.