Стили регистра и соглашения об именовании
Имена в коде, файлах, URL и заголовках подчиняются соглашениям, которые меняются от языка к языку и от формата к формату. Это руководство описывает распространённые стили регистра, где какой из них ожидается, и детали, на которых чаще всего спотыкаются: аббревиатуры, числа, заголовки и буквы за пределами английского.
Распространённые стили
| Стиль | Пример | Как строится |
|---|---|---|
| camelCase | orderTotal | Первое слово строчными, следующие с заглавной буквы, без разделителя |
| PascalCase | OrderTotal | Каждое слово с заглавной буквы, без разделителя |
| snake_case | order_total | Строчные буквы, слова соединены _ |
| CONSTANT_CASE | ORDER_TOTAL | Прописные буквы, слова соединены _ |
| kebab-case | order-total | Строчные буквы, слова соединены - |
| dot.case | order.total | Строчные буквы, слова соединены . |
| Title Case | Order Total | Слова разделены пробелами, каждое с заглавной буквы |
| Sentence case | Order total | С заглавной буквы только первое слово |
camelCase иногда называют lower camel case, а PascalCase — upper camel case. CONSTANT_CASE также известен как screaming snake case.
Какой стиль ожидают разные языки и форматы
Большинство экосистем давно договорились о соглашении, и следование ему делает код понятнее для всех, кто знает эту экосистему:
| Где | Обычное соглашение |
|---|---|
| JavaScript, TypeScript, Java | camelCase для переменных и функций, PascalCase для классов, CONSTANT_CASE для неизменяемых констант |
| Python (PEP 8) | snake_case для функций и переменных, PascalCase для классов, CONSTANT_CASE для констант |
| C# | PascalCase для типов, методов и публичных членов; camelCase для локальных переменных и параметров |
| Go | PascalCase экспортирует имя из пакета, camelCase оставляет его закрытым |
| Ruby, Rust | snake_case для методов и переменных, PascalCase для типов |
| CSS и HTML | kebab-case для свойств, имён классов и атрибутов data- |
| URL | kebab-case; Google рекомендует дефисы, а не подчёркивания между словами |
| Таблицы и столбцы SQL | snake_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), а официальное написание оставлять для текста, который читают люди.