camelCase, snake_case, kebab-case: ściągawka z konwencji nazewnictwa

Oto wersja skrócona. Typy i klasy dostają PascalCase w niemal każdym języku. Zmienne i funkcje dostają camelCase w JavaScripcie, Javie, C#, Kotlinie i Swifcie, ale snake_case w Pythonie, Ruby i Rust. Stałe dostają SCREAMING_SNAKE_CASE w większości języków; wyjątki to Go, Swift, C# i C++ w stylu Google. Wszystko, co trafia do adresu URL, pliku CSS albo nazwy pakietu, to zwykle kebab-case małymi literami, a zmienne środowiskowe piszemy wielkimi literami z podkreślnikami.
To jest wzorzec. O szczegóły toczą się spory podczas code review, dlatego ta ściągawka trzyma się tego, co faktycznie mówi oficjalny lub najczęściej używany przewodnik stylu danego języka, i wskazuje źródło dla każdego z nich.
camelCase, snake_case, kebab-case: pięć stylów i ich inne nazwy
- camelCase (
orderTotal): pierwszy wyraz małymi literami, każdy kolejny od wielkiej. Nazywany też lowerCamelCase; PEP 8 nazywa go mixedCase. - PascalCase (
OrderTotal): każdy wyraz od wielkiej litery. Znany też jako UpperCamelCase, CapWords (PEP 8) albo StudlyCaps (PSR-1 w PHP). - snake_case (
order_total): wyrazy małymi literami połączone podkreślnikami. - SCREAMING_SNAKE_CASE (
ORDER_TOTAL): wyrazy wielkimi literami połączone podkreślnikami. Przewodnik Google do JavaScriptu nazywa go CONSTANT_CASE, a przewodnik do Javy UPPER_SNAKE_CASE. - kebab-case (
order-total): wyrazy małymi literami połączone łącznikami. W większości języków nie da się go użyć w identyfikatorach, bo łącznik to znak minus.
Aby zamienić nazwę z jednego stylu na drugi, wklej ją do naszego konwertera wielkości liter. Dzieli tekst na spacjach, podkreślnikach, łącznikach i istniejących wielkich literach, więc order_total, order-total i OrderTotal bez problemu zamieniają się jedno w drugie. Rób to jednak po jednej nazwie: konwerter traktuje wszystko w polu jako jeden identyfikator.
Ściągawka: konwencje nazewnictwa według języka
| Język | Zmienne i funkcje | Klasy i typy | Stałe | Źródło |
|---|---|---|---|---|
| JavaScript, TypeScript | camelCase | PascalCase | CONSTANT_CASE dla wartości na poziomie modułu, które nigdy się nie zmieniają | Przewodniki stylu Google do JavaScriptu i TypeScriptu |
| Java | camelCase | PascalCase | UPPER_SNAKE_CASE dla głęboko niemutowalnych pól static final | Google Java Style Guide |
| Kotlin | camelCase | PascalCase | SCREAMING_SNAKE_CASE dla const oraz głęboko niemutowalnych wartości na najwyższym poziomie lub w obiektach | Kotlin coding conventions |
| C# | camelCase dla zmiennych lokalnych i parametrów, _camelCase dla pól prywatnych, PascalCase dla metod i składowych publicznych | PascalCase, z prefiksem I dla interfejsów (IWorkerQueue) | PascalCase | Dokumentacja Microsoft .NET |
| Swift | camelCase | PascalCase | camelCase | Swift API Design Guidelines |
| Go | camelCase, jeśli niewyeksportowane, PascalCase, jeśli wyeksportowane | Ta sama reguła | Także 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 | metody w camelCase; właściwości zostawiono Tobie | PascalCase (StudlyCaps) | stałe klas w UPPER_SNAKE_CASE | PSR-1 |
| C++ | zmienne w snake_case, funkcje w PascalCase | PascalCase | kDaysInAWeek | Google C++ Style Guide (jeden z kilku) |
Kilka wierszy wymaga przypisu. W Go pierwsza litera w ogóle nie jest kwestią stylu: to reguła widoczności. Area jest eksportowane z pakietu, a area nie, i pilnuje tego kompilator. C++ nie ma konwencji obowiązującej w całym języku; sama biblioteka standardowa używa snake_case (std::unordered_map, push_back), więc wiersz Google traktuj jako jedną dobrze udokumentowaną opcję, a nie regułę.
Rust jest wyjątkowo rygorystyczny w kwestii stylu. Kompilator ostrzega bez żadnej konfiguracji: napisz fn GetUser() albo struct user_account, a rustc podpowie get_user i UserAccount, zanim uruchomisz lintera.
Nazwy plików, modułów i pakietów
- Java: publiczna klasa najwyższego poziomu musi leżeć w pliku o dokładnie takiej samej nazwie, łącznie z wielkimi literami.
OrderServicetrafia doOrderService.java, a javac odrzuci każdą inną nazwę. - Kotlin: plik z jedną klasą nazywa się tak jak ta klasa. Pozostałe pliki dostają opisową nazwę w UpperCamelCase, na przykład
ProcessDeclarations.kt. - Python: moduły dostają krótkie nazwy zapisane samymi małymi literami, z podkreślnikami, jeśli poprawiają czytelność. Pakiety też powinny być krótkie i pisane małymi literami, a PEP 8 odradza w nich podkreślniki.
- Ruby: pliki w snake_case, nazwane tak jak klasa w środku, więc
HelloWorldleży whello_world.rb. - Go: nazwy pakietów to pojedyncze wyrazy pisane małymi literami, bez podkreślników i mixedCaps:
base64, a nieencoding_base64aniencodingBase64. - JavaScript i TypeScript: brak jednej reguły. Przewodnik Google do JavaScriptu chce nazw plików samymi małymi literami, z podkreślnikami lub łącznikami, a jego przewodnik do TypeScriptu używa snake_case. Przewodnik Airbnb mówi, że nazwa pliku powinna odpowiadać jego eksportowi domyślnemu, więc klasa
CheckBoxleży wCheckBox.js. Wybierz jedną regułę na projekt i ją zapisz. - Pakiety npm: nowe nazwy pakietów w ogóle nie mogą zawierać wielkich liter.
Poza kodem źródłowym: zmienne środowiskowe, CSS, HTML, adresy URL, JSON i SQL
| Gdzie | Konwencja | Przykład | Dlaczego |
|---|---|---|---|
| Zmienne środowiskowe | SCREAMING_SNAKE_CASE | DATABASE_URL | Pasuje do zmiennych systemowych, takich jak PATH i HOME. Nazwy rozróżniają wielkość liter w Linuksie i macOS, w Windows nie. |
| Właściwości CSS | kebab-case | background-color | Ustala to sam język. |
| Właściwości niestandardowe CSS | kebab-case po dwóch łącznikach | --brand-color | Rozróżniają wielkość liter, więc --Brand-Color byłaby inną właściwością. |
| Nazwy klas CSS | kebab-case, często z BEM | card__title--large | Czyta się je tak jak otaczające właściwości. |
| CSS z poziomu JavaScriptu | camelCase | el.style.backgroundColor | Obiekt style udostępnia nazwy właściwości w camelCase. |
| Atrybuty data w HTML | kebab-case | data-index-number | W JavaScripcie odczytywane jako dataset.indexNumber. |
| Ścieżki URL | kebab-case małymi literami | /blog/developer-case-styles | Google zaleca łączniki zamiast podkreślników i traktuje /APPLE oraz /apple jako różne adresy URL. |
| Klucze JSON | Brak standardu | userId lub user_id | Dopasuj się do głównego odbiorcy i konwertuj na granicy. |
| Tabele i kolumny SQL | snake_case małymi literami | order_items | Działa bez cudzysłowów w każdej większej bazie danych. |
Jedna osobliwość zmiennych środowiskowych: POSIX mówi, że standardowe narzędzia używają nazw pisanych wielkimi literami, a nazwy zawierające małe litery rezerwuje dla aplikacji, więc nazwa małymi literami nigdy nie zderzy się ze standardową. Wielkie litery pozostają jednak ugruntowanym nawykiem, więc my zostalibyśmy przy nich, a żeby uniknąć kolizji, dodalibyśmy charakterystyczny prefiks (MYAPP_TIMEOUT).
Wiersze o CSS i SQL mają własne wpisy: o nazwach klas przeczytasz w wpisie o nazewnictwie w CSS i BEM, a o tym, dlaczego bazy danych popychają Cię ku małym literom, w wpisie o konwencjach nazewnictwa w SQL.
Skróty: tu przewodniki stylu się rozchodzą
Wszystkie przewodniki zgadzają się co do userName. Rozchodzą się przy userID. Przewodniki Google do JavaScriptu i Javy zapisują skróty jak zwykłe wyrazy (xmlHttpRequest, customerId). Go zachowuje każdy skrót w jednej wielkości liter (ServeHTTP, appID). Wytyczne Microsoftu dla .NET zapisują wielkimi literami obie litery skrótu dwuliterowego (IOStream), ale tylko pierwszą literę skrótów dłuższych (HtmlTag). Rust traktuje je jak wyrazy (Uuid), a PEP 8 woli HTTPServerError od HttpServerError. Porównujemy te opcje obok siebie we wpisie camelCase a PascalCase.
Jak wybrać, gdy nie masz pewności
- Sprawdź, czy decyduje za Ciebie platforma. Nazwy właściwości CSS, nazwy plików w Javie, eksportowane nazwy w Go i nazwy komponentów Reacta (które muszą zaczynać się wielką literą) to nie są wybory stylistyczne.
- Trzymaj się oficjalnego przewodnika języka. Nowy kod powinien wyglądać jak biblioteka standardowa, obok której stoi.
- Dopasuj się do istniejącego projektu. PEP 8 mówi to wprost: spójność w obrębie projektu jest ważniejsza niż spójność z przewodnikiem stylu.
- Niech zapamięta to linter. Reguła
camelcasew ESLint, regułyNw Ruff dla Pythona i wbudowane ostrzeżenia rustc wyłapią potknięcia, zanim zrobi to recenzent. - Konwertuj raz, na granicy. Gdy JSON w snake_case spotyka JavaScript w camelCase, zmień nazwy kluczy w jednej warstwie serializacji, zamiast pozwalać, by oba style przeciekały przez cały kod.


