camelCase, snake_case, kebab-case: naamgevingsconventies per taal (spiekbriefje)

Dit is de korte versie. Types en klassen krijgen in vrijwel elke taal PascalCase. Variabelen en functies krijgen camelCase in JavaScript, Java, C#, Kotlin en Swift, maar snake_case in Python, Ruby en Rust. Constanten krijgen in de meeste talen SCREAMING_SNAKE_CASE, met Go, Swift, C# en C++ in Google-stijl als uitzonderingen. Alles wat in een URL, een CSS-bestand of een pakketnaam terechtkomt, is meestal kebab-case in kleine letters, en omgevingsvariabelen staan in hoofdletters met underscores.
Dat is het patroon. Over de details wordt in code reviews gediscussieerd, dus dit spiekbriefje houdt zich aan wat de officiële of meest gebruikte stijlgids van elke taal echt zegt, en noemt voor elke taal de bron.
camelCase, snake_case, kebab-case: de vijf stijlen en hun andere namen
- camelCase (
orderTotal): eerste woord in kleine letters, elk volgend woord met een hoofdletter. Ook lowerCamelCase genoemd; PEP 8 noemt het mixedCase. - PascalCase (
OrderTotal): elk woord met een hoofdletter. Ook UpperCamelCase, CapWords (PEP 8) of StudlyCaps (PSR-1 van PHP). - snake_case (
order_total): woorden in kleine letters, verbonden met underscores. - SCREAMING_SNAKE_CASE (
ORDER_TOTAL): woorden in hoofdletters, verbonden met underscores. De JavaScript-gids van Google noemt het CONSTANT_CASE en zijn Java-gids UPPER_SNAKE_CASE. - kebab-case (
order-total): woorden in kleine letters, verbonden met koppeltekens. In de meeste talen kun je het niet voor identifiers gebruiken, omdat het koppelteken een minteken is.
Om een naam van de ene stijl naar de andere om te zetten, plak je hem in onze hoofdletter-converter. Die splitst op spaties, underscores, koppeltekens en bestaande hoofdletters, dus order_total, order-total en OrderTotal zijn probleemloos in elkaar om te zetten. Doe wel één naam tegelijk: alles in het veld wordt als één identifier behandeld.
Spiekbriefje: naamgevingsconventies per taal
| Taal | Variabelen en functies | Klassen en types | Constanten | Bron |
|---|---|---|---|---|
| JavaScript, TypeScript | camelCase | PascalCase | CONSTANT_CASE voor waarden op moduleniveau die nooit veranderen | Stijlgidsen van Google voor JavaScript en TypeScript |
| Java | camelCase | PascalCase | UPPER_SNAKE_CASE voor volledig onveranderlijke (deeply immutable) static final-velden | Google Java Style Guide |
| Kotlin | camelCase | PascalCase | SCREAMING_SNAKE_CASE voor const en volledig onveranderlijke waarden op topniveau of in objecten | Kotlin coding conventions |
| C# | camelCase voor lokale variabelen en parameters, _camelCase voor privévelden, PascalCase voor methoden en publieke leden | PascalCase, met het voorvoegsel I voor interfaces (IWorkerQueue) | PascalCase | .NET-documentatie van Microsoft |
| Swift | camelCase | PascalCase | camelCase | Swift API Design Guidelines |
| Go | camelCase als de naam niet wordt geëxporteerd, PascalCase als hij wel wordt geëxporteerd | Dezelfde regel | Ook 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 voor methoden; eigenschappen laat je zelf bepalen | PascalCase (StudlyCaps) | UPPER_SNAKE_CASE voor klasseconstanten | PSR-1 |
| C++ | snake_case voor variabelen, PascalCase voor functies | PascalCase | kDaysInAWeek | Google C++ Style Guide (een van meerdere) |
Een paar rijen vragen om een voetnoot. In Go is de eerste letter helemaal geen stijlkeuze: het is de zichtbaarheidsregel. Area wordt uit zijn pakket geëxporteerd en area niet, en de compiler dwingt dat af. C++ kent geen conventie voor de hele taal; de standaardbibliotheek zelf gebruikt snake_case (std::unordered_map, push_back), dus zie de rij van Google als één goed gedocumenteerde optie en niet als de regel.
Rust is ongewoon streng over stijl. De compiler waarschuwt standaard al: schrijf je fn GetUser() of struct user_account, dan stelt rustc get_user en UserAccount voor voordat je een linter hebt gedraaid.
Namen van bestanden, modules en pakketten
- Java: een publieke klasse op het hoogste niveau moet in een bestand staan dat precies haar naam draagt, hoofdletters inbegrepen.
OrderServicehoort inOrderService.java, en javac weigert alles wat daarvan afwijkt. - Kotlin: een bestand met één klasse draagt de naam van die klasse. Andere bestanden krijgen een beschrijvende naam in UpperCamelCase, zoals
ProcessDeclarations.kt. - Python: modules krijgen korte namen in alleen kleine letters, met underscores als die de leesbaarheid helpen. Pakketten moeten ook kort zijn en uit kleine letters bestaan, en PEP 8 raadt underscores daarin af.
- Ruby: bestanden in snake_case, genoemd naar de klasse erin, dus
HelloWorldstaat inhello_world.rb. - Go: pakketnamen zijn losse woorden in kleine letters, zonder underscores of mixedCaps:
base64, nietencoding_base64ofencodingBase64. - JavaScript en TypeScript: geen eenduidige regel. De JavaScript-gids van Google wil bestandsnamen in alleen kleine letters met underscores of streepjes, en zijn TypeScript-gids gebruikt snake_case. Volgens de gids van Airbnb moet een bestandsnaam overeenkomen met de default export, dus een klasse
CheckBoxstaat inCheckBox.js. Kies er per project één en schrijf die op. - npm-pakketten: nieuwe pakketnamen mogen helemaal geen hoofdletters bevatten.
Buiten de broncode: omgevingsvariabelen, CSS, HTML, URL's, JSON en SQL
| Waar | Conventie | Voorbeeld | Waarom |
|---|---|---|---|
| Omgevingsvariabelen | SCREAMING_SNAKE_CASE | DATABASE_URL | Past bij systeemvariabelen zoals PATH en HOME. Namen zijn hoofdlettergevoelig op Linux en macOS, op Windows niet. |
| CSS-eigenschappen | kebab-case | background-color | Vastgelegd door de taal. |
| Custom properties in CSS | kebab-case na twee streepjes | --brand-color | Hoofdlettergevoelig, dus --Brand-Color zou een andere eigenschap zijn. |
| CSS-klassenamen | kebab-case, vaak met BEM | card__title--large | Leest als de eigenschappen eromheen. |
| CSS vanuit JavaScript | camelCase | el.style.backgroundColor | Het style-object biedt de eigenschapsnamen aan in camelCase. |
| HTML-data-attributen | kebab-case | data-index-number | In JavaScript uitgelezen als dataset.indexNumber. |
| URL-paden | kebab-case in kleine letters | /blog/developer-case-styles | Google raadt koppeltekens aan boven underscores en behandelt /APPLE en /apple als verschillende URL's. |
| JSON-sleutels | Geen standaard | userId of user_id | Volg de belangrijkste afnemer en zet om aan de grens. |
| SQL-tabellen en -kolommen | snake_case in kleine letters | order_items | Werkt zonder aanhalingstekens in elke grote database. |
Een eigenaardigheid bij omgevingsvariabelen: volgens POSIX gebruiken de standaardprogramma's namen in hoofdletters en zijn namen met kleine letters gereserveerd voor toepassingen, zodat een naam in kleine letters nooit kan botsen met een standaardnaam. Hoofdletters zijn toch de gevestigde gewoonte, dus wij zouden daarbij blijven en botsingen liever voorkomen met een onderscheidend voorvoegsel (MYAPP_TIMEOUT).
De rijen over CSS en SQL hebben elk een eigen artikel: zie CSS-naamgeving en BEM voor klassenamen en naamgeving in SQL voor de reden waarom databases je richting kleine letters duwen.
Afkortingen: waar de stijlgidsen het oneens zijn
Over userName zijn alle gidsen het eens. Over userID gaan de meningen uiteen. De JavaScript- en Java-gidsen van Google behandelen afkortingen als gewone woorden (xmlHttpRequest, customerId). Go houdt elke afkorting in één letterstand (ServeHTTP, appID). De .NET-richtlijnen van Microsoft schrijven bij een afkorting van twee letters beide met een hoofdletter (IOStream), maar bij langere alleen de eerste letter (HtmlTag). Rust behandelt ze als woorden (Uuid), en PEP 8 geeft de voorkeur aan HTTPServerError boven HttpServerError. In camelCase of PascalCase zetten we de opties naast elkaar.
Zo kies je als je het niet zeker weet
- Kijk of het platform voor je beslist. Namen van CSS-eigenschappen, Java-bestandsnamen, geëxporteerde namen in Go en namen van React-componenten (die met een hoofdletter moeten beginnen) zijn geen stijlkeuze.
- Volg de officiële gids van de taal. Nieuwe code hoort eruit te zien als de standaardbibliotheek waar hij naast staat.
- Pas je aan het bestaande project aan. PEP 8 zegt het ronduit: consistentie binnen een project is belangrijker dan consistentie met de stijlgids.
- Laat een linter het onthouden. De regel
camelcasevan ESLint, deN-regels van Ruff voor Python en de ingebouwde waarschuwingen van rustc vangen uitglijders af voordat een reviewer dat moet doen. - Zet één keer om aan de grens. Komt JSON in snake_case samen met JavaScript in camelCase, hernoem de sleutels dan in één serialisatielaag in plaats van beide stijlen door de hele codebase te laten sijpelen.


