Перейти к содержимому
LeedyBox
Поддержать

Стили регистра и соглашения об именовании

Имена в коде, файлах, URL и заголовках подчиняются соглашениям, которые меняются от языка к языку и от формата к формату. Это руководство описывает распространённые стили регистра, где какой из них ожидается, и детали, на которых чаще всего спотыкаются: аббревиатуры, числа, заголовки и буквы за пределами английского.

Распространённые стили

СтильПримерКак строится
camelCaseorderTotalПервое слово строчными, следующие с заглавной буквы, без разделителя
PascalCaseOrderTotalКаждое слово с заглавной буквы, без разделителя
snake_caseorder_totalСтрочные буквы, слова соединены _
CONSTANT_CASEORDER_TOTALПрописные буквы, слова соединены _
kebab-caseorder-totalСтрочные буквы, слова соединены -
dot.caseorder.totalСтрочные буквы, слова соединены .
Title CaseOrder TotalСлова разделены пробелами, каждое с заглавной буквы
Sentence caseOrder totalС заглавной буквы только первое слово

camelCase иногда называют lower camel case, а PascalCase — upper camel case. CONSTANT_CASE также известен как screaming snake case.

Какой стиль ожидают разные языки и форматы

Большинство экосистем давно договорились о соглашении, и следование ему делает код понятнее для всех, кто знает эту экосистему:

ГдеОбычное соглашение
JavaScript, TypeScript, JavacamelCase для переменных и функций, PascalCase для классов, CONSTANT_CASE для неизменяемых констант
Python (PEP 8)snake_case для функций и переменных, PascalCase для классов, CONSTANT_CASE для констант
C#PascalCase для типов, методов и публичных членов; camelCase для локальных переменных и параметров
GoPascalCase экспортирует имя из пакета, camelCase оставляет его закрытым
Ruby, Rustsnake_case для методов и переменных, PascalCase для типов
CSS и HTMLkebab-case для свойств, имён классов и атрибутов data-
URLkebab-case; Google рекомендует дефисы, а не подчёркивания между словами
Таблицы и столбцы SQLsnake_case, потому что многие базы данных приводят имена без кавычек к одному регистру
Переменные окруженияCONSTANT_CASE, например DATABASE_URL
Ключи конфигурацииdot.case для вложенных настроек, например server.port
JSON APIЕдиного правила нет: многие используют camelCase, другие snake_case; следуйте API, с которым работаете

В большинстве языков программирования kebab-case нельзя использовать в именах переменных: дефис читается как знак минуса, и order-total означает order минус total.

Аббревиатуры и числа

Сильнее всего соглашения расходятся в аббревиатурах. Одна школа оставляет их прописными (userID, parseHTML), другая пишет их как обычные слова (userId, parseHtml). Руководства по стилю Java и JavaScript от Google следуют второму подходу, при котором границы слов остаются ясными, когда аббревиатуры идут подряд: XmlHttpRequest разбить проще, чем XMLHTTPRequest. Рекомендации Microsoft для .NET оставляют прописными двухбуквенные аббревиатуры (IOStream), а в более длинных делают заглавной только первую букву (HtmlButton). API браузера XMLHttpRequest смешивает оба подхода, поэтому его часто приводят как предостережение.

У цифр нет регистра, поэтому конвертер не может понять, означает ли utf8Decoder «utf8 decoder» или «utf 8 decoder». Обычно конвертеры присоединяют число к предыдущему слову. Выберите одно написание и используйте его везде.

Title Case и Sentence case в заголовках

В английских заголовках руководства по стилю расставляют заглавные буквы по-разному. Стили AP и Chicago оставляют строчными короткие артикли, союзы и предлоги, если они не стоят в начале или в конце («The Lord of the Rings»), и расходятся в точном списке таких слов. Многие руководства по интерфейсам и документации, включая руководства Microsoft и Google по документации для разработчиков, вместо этого используют Sentence case («Change your password»): его проще применять последовательно, и он звучит менее официально.

Title Case в конвертере LeedyBox делает заглавной первую букву каждого слова. Это подходит для подписей и имён в стиле переменных, но не для газетного заголовка: короткие слова потом нужно вручную сделать строчными.

Преобразование между стилями теряет информацию

Любое преобразование сначала делит имя на слова, ориентируясь на заглавные буквы и разделители, а затем соединяет слова в новом стиле. То, что целевой стиль не может выразить, теряется: parseHTML становится parse_html, а обратное преобразование даёт parseHtml. Знаки препинания тоже отбрасываются, поэтому «don't» превращается в два слова.

Поэтому считайте эталонным один стиль. Если база данных использует snake_case, а код — camelCase, преобразуйте на границе каждый раз в одном направлении, а не храните имена в обеих формах.

Переименование ключей на границе API

Когда фронтенд на camelCase общается с бэкендом на snake_case, большинство библиотек сериализации умеют сопоставлять имена автоматически, и данные никогда не переименовываются вручную. Разовое преобразование JSON-документа, например тестовых данных или примера ответа, — другая задача, и вариант «Ключам JSON» в конвертере регистра выполняет её, не трогая значения.

Следите за конфликтами: user_name и userName в любом из стилей становятся одним ключом, и один перезапишет другой. Ведущие символы вроде _id или $ref часто имеют значение для конкретной базы данных или схемы, поэтому проверьте, можно ли их вообще переименовывать.

Регистр за пределами английского

Правила регистра не одинаковы во всех языках. Немецкая ß в верхнем регистре превращается в SS, и слово удлиняется. В турецком есть i с точкой и ı без точки: их пары в верхнем регистре — i → İ и ı → I, тогда как правило по умолчанию в большинстве языков программирования превращает i в I. toUpperCase() в JavaScript использует правило по умолчанию, а toLocaleUpperCase('tr') — турецкое. В корейском, китайском и японском регистра нет вовсе, поэтому меняются только разделители между словами.

Регистр важен и в именах файлов. Windows и по умолчанию macOS считают Readme.md и README.md одним файлом, а Linux — двумя. Поэтому переименование, меняющее только регистр, может остаться незамеченным в одной системе и сломать ссылки или импорты в другой.

Частые вопросы

Что лучше: camelCase или snake_case?

В общем случае ни один не лучше. Используйте соглашение языка, фреймворка или API, с которыми работаете; единообразие внутри одной кодовой базы важнее самого выбора.

Что использовать в URL: дефисы или подчёркивания?

Дефисы. Рекомендации Google по URL советуют разделять слова дефисами, и слаги в kebab-case вроде /case-converter/ — обычная практика в вебе.

Почему Git не замечает, что я изменил только регистр в имени файла?

В файловой системе без учёта регистра Git часто считает старое и новое имя одним файлом. Переименуйте файл через git mv, например через временное имя, чтобы изменение сохранилось для систем, где регистр важен.

Как записать в camelCase название бренда вроде iPhone или eBay?

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