camelCase, snake_case, kebab-case: шпаргалка для разработчиков

Вот краткая версия. Типы и классы почти во всех языках пишутся в PascalCase. Переменные и функции в JavaScript, Java, C#, Kotlin и Swift пишутся в camelCase, а в Python, Ruby и Rust — в snake_case. Константы в большинстве языков пишутся в SCREAMING_SNAKE_CASE; исключения — Go, Swift, C# и C++ в стиле Google. Всё, что попадает в URL, файл CSS или имя пакета, обычно пишется строчными буквами в kebab-case, а переменные окружения — заглавными буквами с подчёркиваниями.
Такова общая картина. Споры в код-ревью идут о деталях, поэтому эта шпаргалка опирается на то, что на самом деле говорит официальное или самое распространённое руководство по стилю каждого языка, и для каждого языка называет источник.
camelCase, snake_case, kebab-case: пять стилей и их другие названия
- camelCase (
orderTotal): первое слово строчными буквами, каждое следующее — с заглавной. Ещё называется lowerCamelCase; в PEP 8 он называется mixedCase. - PascalCase (
OrderTotal): каждое слово с заглавной буквы. Ещё UpperCamelCase, CapWords (PEP 8) или StudlyCaps (PSR-1 в PHP). - snake_case (
order_total): слова строчными буквами, соединённые подчёркиваниями. - SCREAMING_SNAKE_CASE (
ORDER_TOTAL): слова заглавными буквами, соединённые подчёркиваниями. В руководстве Google по JavaScript он называется CONSTANT_CASE, а в руководстве по Java — UPPER_SNAKE_CASE. - kebab-case (
order-total): слова строчными буквами, соединённые дефисами. В большинстве языков его нельзя использовать для идентификаторов, потому что дефис — это знак минус.
Чтобы переключить имя из одного стиля в другой, вставьте его в наш конвертер регистра. Он разбивает текст по пробелам, подчёркиваниям, дефисам и уже имеющимся заглавным буквам, поэтому order_total, order-total и OrderTotal чисто превращаются друг в друга. Но обрабатывайте по одному имени: всё, что есть в поле, он считает одним идентификатором.
Шпаргалка: соглашения об именовании по языкам
| Язык | Переменные и функции | Классы и типы | Константы | Источник |
|---|---|---|---|---|
| JavaScript, TypeScript | camelCase | PascalCase | CONSTANT_CASE для значений уровня модуля, которые никогда не меняются | Руководства Google по стилю для JavaScript и TypeScript |
| Java | camelCase | PascalCase | UPPER_SNAKE_CASE для глубоко неизменяемых полей static final | Google Java Style Guide |
| Kotlin | camelCase | PascalCase | SCREAMING_SNAKE_CASE для const и глубоко неизменяемых значений верхнего уровня или объектов | Kotlin coding conventions |
| C# | camelCase для локальных переменных и параметров, _camelCase для приватных полей, PascalCase для методов и публичных членов | PascalCase, с префиксом I для интерфейсов (IWorkerQueue) | PascalCase | Документация Microsoft по .NET |
| Swift | camelCase | PascalCase | camelCase | Swift API Design Guidelines |
| Go | camelCase, если имя не экспортируется, PascalCase, если экспортируется | То же правило | Тоже MixedCaps (MaxPacketSize) | Effective Go, Google Go Style |
| Python | snake_case | PascalCase (CapWords) | UPPER_SNAKE_CASE | PEP 8 |
| Ruby | snake_case | PascalCase | SCREAMING_SNAKE_CASE | Ruby Style Guide |
| Rust | snake_case | PascalCase (UpperCamelCase) | SCREAMING_SNAKE_CASE | Rust API Guidelines (RFC 430) |
| PHP | camelCase для методов; свойства остаются на ваше усмотрение | PascalCase (StudlyCaps) | UPPER_SNAKE_CASE для констант классов | PSR-1 |
| C++ | snake_case для переменных, PascalCase для функций | PascalCase | kDaysInAWeek | Google C++ Style Guide (один из нескольких) |
Несколько строк требуют пояснения. В Go первая буква вообще не вопрос стиля, это правило видимости. Area экспортируется из своего пакета, а area нет, и за этим следит компилятор. В C++ нет общего для всего языка соглашения; сама стандартная библиотека использует snake_case (std::unordered_map, push_back), поэтому воспринимайте строку Google как один хорошо задокументированный вариант, а не как правило.
Rust необычно строг к стилю. Компилятор предупреждает сразу, без настройки: напишите fn GetUser() или struct user_account, и rustc предложит get_user и UserAccount ещё до запуска линтера.
Имена файлов, модулей и пакетов
- Java: публичный класс верхнего уровня должен лежать в файле с точно таким же именем, включая заглавные буквы.
OrderServiceидёт вOrderService.java, и javac отвергает любой другой вариант. - Kotlin: файл с одним классом называют по имени этого класса. Остальным файлам дают описательное имя в UpperCamelCase, например
ProcessDeclarations.kt. - Python: модулям дают короткие имена целиком строчными буквами, с подчёркиваниями, если они улучшают читаемость. Пакеты тоже должны быть короткими и строчными, и PEP 8 не советует использовать в них подчёркивания.
- Ruby: файлы в snake_case, названные по классу внутри, так что
HelloWorldлежит вhello_world.rb. - Go: имена пакетов — отдельные слова строчными буквами, без подчёркиваний и mixedCaps:
base64, а неencoding_base64илиencodingBase64. - JavaScript и TypeScript: единого правила нет. Руководство Google по JavaScript требует имена файлов целиком строчными буквами, с подчёркиваниями или дефисами, а его руководство по TypeScript использует snake_case. По руководству Airbnb имя файла должно совпадать с экспортом по умолчанию, так что класс
CheckBoxлежит вCheckBox.js. Выберите один вариант на проект и запишите его. - Пакеты npm: в именах новых пакетов вообще нельзя использовать заглавные буквы.
За пределами исходного кода: переменные окружения, CSS, HTML, URL, JSON и SQL
| Где | Соглашение | Пример | Почему |
|---|---|---|---|
| Переменные окружения | SCREAMING_SNAKE_CASE | DATABASE_URL | Совпадает с системными переменными вроде PATH и HOME. В Linux и macOS имена чувствительны к регистру, в Windows — нет. |
| Свойства CSS | kebab-case | background-color | Задано самим языком. |
| Пользовательские свойства CSS | kebab-case после двух дефисов | --brand-color | Чувствительны к регистру, поэтому --Brand-Color было бы другим свойством. |
| Имена классов CSS | kebab-case, часто с БЭМ | card__title--large | Читается так же, как окружающие свойства. |
| CSS из JavaScript | camelCase | el.style.backgroundColor | Объект style даёт имена свойств в camelCase. |
| Атрибуты data в HTML | kebab-case | data-index-number | В JavaScript читаются как dataset.indexNumber. |
| Пути в URL | kebab-case строчными буквами | /blog/developer-case-styles | Google рекомендует дефисы вместо подчёркиваний и считает /APPLE и /apple разными URL. |
| Ключи JSON | Стандарта нет | userId или user_id | Ориентируйтесь на главного потребителя данных и преобразуйте на границе. |
| Таблицы и столбцы SQL | snake_case строчными буквами | order_items | Работает без кавычек в любой крупной СУБД. |
Одна странность с переменными окружения: по POSIX стандартные утилиты используют имена заглавными буквами, а имена со строчными буквами зарезервированы для приложений, так что имя строчными никогда не столкнётся со стандартным. Заглавные буквы всё равно остаются устоявшейся привычкой, поэтому мы бы придерживались её, а столкновений избегали бы с помощью характерного префикса (MYAPP_TIMEOUT).
У строк про CSS и SQL есть отдельные статьи: про имена классов читайте в материале об именовании в CSS и БЭМ, а почему базы данных подталкивают вас к строчным буквам, объясняют соглашения об именовании в SQL.
Аббревиатуры: в чём руководства расходятся
Насчёт userName согласны все руководства. А вот userID их разделяет. Руководства Google по JavaScript и Java пишут аббревиатуры строчными буквами, как обычные слова (xmlHttpRequest, customerId). Go оставляет у каждой аббревиатуры один регистр (ServeHTTP, appID). Рекомендации Microsoft для .NET пишут заглавными обе буквы двухбуквенной аббревиатуры (IOStream), а у более длинных — только первую (HtmlTag). Rust считает их словами (Uuid), а PEP 8 предпочитает HTTPServerError варианту HttpServerError. Эти варианты мы сравниваем бок о бок в статье camelCase и PascalCase.
Как выбирать, если вы не уверены
- Проверьте, не решает ли за вас платформа. Имена свойств CSS, имена файлов Java, экспортируемые имена в Go и имена компонентов React (они должны начинаться с заглавной буквы) — не вопрос стиля.
- Следуйте официальному руководству языка. Новый код должен выглядеть как стандартная библиотека, рядом с которой он стоит.
- Подстраивайтесь под существующий проект. PEP 8 говорит об этом прямо: единообразие внутри проекта важнее единообразия с руководством по стилю.
- Поручите помнить об этом линтеру. Правило ESLint
camelcase, правилаNв Ruff для Python и встроенные предупреждения rustc ловят промахи раньше, чем это придётся делать ревьюеру. - Преобразуйте один раз на границе. Когда JSON в snake_case встречается с JavaScript в camelCase, переименуйте ключи в одном слое сериализации, а не позволяйте обоим стилям расползаться по всей кодовой базе.


