camelCase vs snake_case vs kebab-case: Namenskonventionen-Guide 2026
userID oder userId? user_profile oder userProfile? URLs mit - oder _? Diese Fragen bremsen PR-Reviews fünfmal am Tag aus. Die Antwort lautet nicht „persönliche Vorliebe” — jede gängige Sprache und jeder Webstandard hat eine festgelegte Regel, und sobald Sie alle auf einer Seite sehen, verschwindet das Grundrauschen.
Dieser Guide behandelt die sechs Case-Stile, denen Sie im Code begegnen (camelCase, PascalCase, snake_case, kebab-case, CONSTANT_CASE, dot.case / path/case / Header-Case), eine Entscheidungsmatrix für sieben Sprachen, die parseUrl-vs-parseURL-Akronym-Debatte mit GitHub-Daten, die SEO-Argumente für kebab-case-URLs sowie die sechs Fallen beim automatischen Konvertieren zwischen Case-Stilen. Wenn Sie alle 15 Case-Ausgaben für eine Zeichenkette auf einen Blick sehen möchten, rendert der Case-Konverter sie live in Ihrem Browser.
Die sechs Case-Stile auf einen Blick
Bevor der Vergleich beginnt, hier der Spickzettel.
| Case-Stil | Beispiel | Typische Verwendung | Ursprung / Verbreiter |
|---|---|---|---|
| camelCase | userProfileImage | JS, TS, Java, Swift Variablen & Methoden | Smalltalk → Java |
| PascalCase | UserProfileImage | Klassen, React/Vue-Komponenten, TS-Typen | Programmiersprache Pascal |
| snake_case | user_profile_image | Python, Ruby, Rust, SQL-Spalten | C / frühes Unix |
| kebab-case | user-profile-image | CSS-Klassen, URL-Slugs, HTML-Attribute | Lisp / modernes Web |
| CONSTANT_CASE | USER_PROFILE_IMAGE | Env-Variablen, Top-Level-Konstanten, Makros | C-Makros / Unix-Env |
| dot.case | user.profile.image | Java-Pakete, MongoDB-Pfade, TOML-Keys | Namespacing-Konvention |
| path/case | user/profile/image | URL-Pfade, Dateisystem, Git-Refs | Unix-Pfade |
| Header-Case | User-Profile-Image | HTTP/1.1-Header-Namen (kanonisch) | RFC 2616 |
Acht Zeilen für sechs „echte” Case-Stile — dot.case, path/case und Header-Case teilen dieselbe Tokenisierung mit unterschiedlichen Trennzeichen, weshalb die meisten Case-Bibliotheken sie als eine Familie behandeln.
Jeder Case-Stil im Detail
camelCase: der JS/Java-Standard
camelCase war Smalltalks Idee, doch Java exportierte ihn an den Rest der Branche. Suns Java-Code-Konventionen von 1995 machten firstName, getUserProfile und xmlParser zur Standardschreibweise, und jede Sprache, die Java-ähnlich aussehen wollte — JavaScript, ActionScript, Swift, Kotlin, Dart — erbte dieselbe Form.
Regel: das erste Wort kleinschreiben, jedes folgende Wort großschreiben, das Trennzeichen weglassen. Keine Unterstriche, keine Bindestriche, keine Leerzeichen. Der Name „camelCase” stammt von der höckerigen Silhouette der Großbuchstaben, die aus den Kleinbuchstaben herausragen.
Zwei häufig falsch gemachte Sonderfälle: Markennamen mit Kleinbuchstaben am Anfang (iPhone, eBay, iOS) — taucht einer davon im Code auf, erzwingen Sie nicht die Großschreibung des i; schreiben Sie es wie die Marke. Und Akronyme — dazu weiter unten ausführlich.
PascalCase: Klassen und Komponenten
PascalCase ist camelCase mit großgeschriebenem Anfangsbuchstaben. Manche Style-Guides nennen ihn deshalb „UpperCamelCase”. Die Programmiersprache Pascal nutzte ihn in den 1970er-Jahren, und der Name blieb haften.
Wo er lebt: Klassennamen in jeder C-Familie-OO-Sprache (Java, C#, C++, Kotlin, Swift, TypeScript), Komponentennamen in React/Vue/Angular, TypeScript-Type-Aliase und Interfaces (type UserProfile, interface AuthState) sowie Modul-/Dateinamen in einigen Ökosystemen (UserService.cs in C#).
Warum ein eigener Case-Stil für Klassen? Ein visuelles Signal. Wenn Sie new userProfile() gegenüber new UserProfile() lesen, liest sich das Zweite als Typ und das Erste als schiefgegangener Funktionsaufruf. Sprachen, die Wert- und Typ-Namespaces vermischen, stützen sich auf die Großschreibung zur Disambiguierung.
snake_case: Python, Ruby, Rust, SQL
snake_case ist älter als die meisten denken — C und das frühe Unix nutzten Namen im Stil von errno_h und fopen_s, weil Tastaturen an PDP-11-Terminals Unterstriche leicht und Pascal-Großschreibung mühsam machten. Python übernahm ihn als PEP-8-Konvention, Rubys Community einigte sich organisch darauf, und Rust machte ihn zum compiler-erzwungenen Standard mit einem Lint, der meckert, wenn Ihre Variable userId statt user_id heißt.
Regel: alles kleinschreiben, Wörter mit Unterstrichen verbinden. user_profile_image, parse_html, max_retries.
Der Datenbank-Aspekt zählt und wird in den meisten Sprach-Tutorials übersprungen. Fast jeder SQL-ORM — SQLAlchemy, Hibernate, Sequelize, TypeORM, Active Record — verwendet standardmäßig snake_case-Spaltennamen, unabhängig von der Konvention der Host-Sprache. Der Grund ist Portabilität: PostgreSQL faltet nicht-zitierte Bezeichner auf Kleinschreibung, MySQL unter Linux unterscheidet Groß-/Kleinschreibung, MySQL unter macOS/Windows nicht, und SQLite behandelt Spaltennamen als opake Zeichenketten. snake_case ist die Schreibweise, die all das ohne Quoting übersteht.
kebab-case: die Wahl des Webs
Das Web hat sich für alles benutzersichtbare auf kebab-case geeinigt: CSS-Klassennamen (.user-profile-image), URL-Slugs (/blog/naming-conventions-guide), benutzerdefinierte HTML-Attribute (data-user-id), Web-Component-Tag-Namen (<user-card>, was die Spezifikation mit Bindestrich verlangt).
Der Name selbst taucht in älteren Dokumenten in etwa acht Varianten auf — „dash-case”, „spinal-case”, „lisp-case”, „skewer-case”, „hyphen-case”. Sie bedeuten dasselbe. „kebab-case” hat sich durchgesetzt wegen eines alten Stack-Overflow-Witzes darüber, dass die Wörter wie Fleischstücke am Spieß aussehen.
Eine nicht-offensichtliche Regel: HTML- und CSS-Klassennamen sind in der Praxis case-insensitiv, aber die kanonische Schreibweise ist Kleinschreibung. .User-Profile funktioniert in den meisten Browsern, bricht aber serverseitiges Tooling, das Klassennamen hasht, und verwirrt Code-Reviewer. Bleiben Sie bei Kleinschreibung.
CONSTANT_CASE: Env-Variablen und Makros
CONSTANT_CASE (in Rust-Kreisen manchmal SCREAMING_SNAKE_CASE) ist das Signal für „dieser Wert ändert sich zur Laufzeit nie”. MAX_RETRIES, API_KEY, DEFAULT_TIMEOUT_MS. Jede Sprache hat eine Konvention dafür, und CI-Systeme, Container-Runtimes und Shells erwarten Umgebungsvariablen in diesem Case-Stil (DATABASE_URL, NODE_ENV, PATH).
Falle: JavaScripts const-Keyword bedeutet nicht „CONSTANT_CASE verwenden”. const result = await fetch(url) ist korrektes camelCase. Heben Sie sich CONSTANT_CASE für echte semantische Konstanten auf — Werte, die in C #define-d würden, bei denen das Ändern des Wertes zur Laufzeit ein Bug wäre. MAX_RETRIES = 3 qualifiziert sich. result nicht.
dot.case, path/case, Header-Case
Drei Geschwister mit demselben Tokenizer und unterschiedlichen Trennzeichen.
dot.case repräsentiert hierarchische Keys: Java-Pakete (com.example.service), MongoDB-Feldpfade (user.profile.image), TOML/INI-Konfigurationsschlüssel ([database.primary]), Lodash-Methodenpfade (_.get(obj, 'user.profile.image')). Beim Lesen einer dot.case-Zeichenkette sollten Sie „Namespace, Namespace, Blatt” sehen.
path/case repräsentiert wörtliche Orte: URL-Pfade, Dateisystempfade, Git-Refs (feature/add-auth). Die Punkt-vs-Slash-Wahl ist bedeutungstragend — Slashes signalisieren „das ist irgendwo ein echtes Ding”, Punkte signalisieren „das ist ein Label”.
Header-Case ist die HTTP/1.1-Konvention: Content-Type, Access-Control-Allow-Origin, X-Forwarded-For. HTTP/1.1-Header sind technisch case-insensitiv (RFC 2616), also funktioniert content-type, doch Framework, Dokumentation und Entwickler erwarten die Header-Case-Schreibweise. HTTP/2 und HTTP/3 haben das geändert — RFC 7540 §8.1.2 schreibt kleingeschriebene Header-Namen auf dem Wire vor, um die Header-Kompression (HPACK) zu vereinfachen. Für Anwendungscode ist das unsichtbar, weil jeder HTTP/2-Client und -Server normalisiert; in einem rohen HTTP/2-Frame sehen Sie durchgängig kleingeschriebenes kebab-case.
Entscheidungsmatrix für sieben Sprachen
Der schnellste Weg, einen Namensstreit beizulegen: nachschlagen, was die Standardbibliothek der Sprache tut. Hier die Matrix.
| Sprache | Variable | Funktion | Klasse | Konstante | Dateiname | DB-Spalte |
|---|---|---|---|---|---|---|
| Python (PEP 8) | snake_case | snake_case | PascalCase | CONSTANT_CASE | snake_case.py | snake_case |
| JavaScript/TS | camelCase | camelCase | PascalCase | CONSTANT_CASE | kebab-case.js | snake_case |
| Go | camelCase* | PascalCase** | PascalCase | mixedCase*** | snake_case.go | snake_case |
| Rust | snake_case | snake_case | PascalCase | SCREAMING_SNAKE | snake_case.rs | snake_case |
| Java | camelCase | camelCase | PascalCase | CONSTANT_CASE | PascalCase.java | snake_case |
| C# | camelCase† | PascalCase | PascalCase | PascalCase | PascalCase.cs | snake_case |
| SQL | n/v | snake_case | n/v | n/v | n/v | snake_case |
*Go: ein kleingeschriebener Anfangsbuchstabe bedeutet unexported (paketprivat); ein großgeschriebener Anfangsbuchstabe bedeutet exported (öffentlich). Der Compiler erzwingt das.**Go: exportierte Funktionen sind PascalCase (http.NewRequest); paketprivate Funktionen sind camelCase (http.parseHeader).***Go: Konstanten folgen derselben Exported-/Unexported-Großschreibungsregel —MaxRetriesfür exportiert,maxRetriesfür unexportiert. Go vermeidet CONSTANT_CASE bewusst.†C#: lokale Variablen und private Felder sind camelCase (manche Codebases präfigieren Felder mit_:_userName); öffentliche Properties, Methoden und Typen sind PascalCase.
Drei Schichten ziehen sich durch jede Sprache:
HTML und CSS: Klassennamen und IDs sind kebab-case (<div class="user-profile-card">). Benutzerdefinierte HTML-Attribute sind kebab-case mit data--Präfix (data-user-id). Inline-CSS-Properties sind kebab-case (background-color); die JS-DOM-Äquivalente sind camelCase (element.style.backgroundColor).
HTTP: ausgehende Header-Namen sind Header-Case für HTTP/1.1 ('Content-Type': 'application/json') und kleingeschriebenes kebab-case auf dem HTTP/2-Wire. Die meisten Fetch-Bibliotheken akzeptieren beide Schreibweisen und normalisieren intern.
Umgebungsvariablen: überall CONSTANT_CASE — Node, Python, Go, Rust, Bash, Docker, Kubernetes. Die .env-Datei-Konvention ist dieselbe: DATABASE_URL=postgres://....
Akronym-Handhabung: Google vs Microsoft
Das ist die strittigste Namensfrage im Code-Review. Heißt es parseUrl oder parseURL? userId oder userID? HtmlParser oder HTMLParser? XmlHttpRequest oder XMLHttpRequest?
Zwei Schulen existieren, beide mit Autorität.
Akronym-als-Wort behandeln (Google, Apple, modernes JS): parseUrl, userId, HtmlParser. Der Google JavaScript Style Guide §5.3 empfiehlt das ausdrücklich. Apples Swift API Design Guidelines tun dasselbe. Die Pakete lodash und change-case produzieren diese Ausgabe standardmäßig. Das Argument lautet Round-Trip-Stabilität: parseUrl tokenisiert sauber zu parse / url, konvertiert zu parse_url und zurück zu parseUrl ohne Informationsverlust. parseURL tokenisiert zu parse / URL, konvertiert unter einem naiven Tokenizer zu parse_u_r_l oder unter einem akronym-bewussten zu parse_url — danach kann parse_url nicht entscheiden, ob es zurück zu parseUrl oder parseURL round-trippen soll, weil die kleingeschriebene Schreibweise das Akronym-Signal verloren hat.
Akronym-Großschreibung erhalten (Microsoft, .NET, älteres Java): parseURL, userID, HTMLParser, XMLHttpRequest. Microsofts .NET Naming Guidelines beschränken das auf 2-3-buchstabige Akronyme (IO, URL, XML) und nutzen Akronym-als-Wort für längere (Html wäre unter strenger Lesart preserve-caps, doch Microsoft schreibt in der Praxis HtmlAgilityPack). Die Win32-API, die .NET BCL und der meiste Pre-2010-Java-Code gehen diesen Weg. Für englische Muttersprachler liest sich das natürlicher — parseURL sieht aus wie „parse U-R-L” — auf Kosten der Round-Trip-Eigenschaft.
Pythons PEP 8 empfiehlt nominell Akronym-als-Wort, doch die Python-Standardbibliothek ist historisch inkonsistent: http.server.HTTPServer und xml.etree.ElementTree erhalten Akronyme, json.JSONDecoder ebenso. Neuere Ergänzungen (pathlib.PurePath, dataclasses) tendieren zu Akronym-als-Wort. PEP-8-Linie: orientieren Sie sich am umliegenden Code.
Eine Stichprobe an GitHubs öffentlichem Korpus Anfang 2026 (bigquery-public-data.github_repos, gefiltert auf TypeScript- und JavaScript-Dateien aus Repos mit 1k+ Sternen) zeigt ein Verhältnis von etwa 7:3 zwischen parseUrl und parseURL sowie 6:4 zwischen userId und userID. Der Akronym-als-Wort-Stil gewinnt in JavaScript. C# bleibt Microsoft-lastig — parseURL dominiert in C#-Dateien. Python ist gespalten.
Entscheidungsregel: (a) folgen Sie der Standardbibliothek der Sprache; (b) ist die Standardbibliothek inkonsistent, wählen Sie Akronym-als-Wort für Greenfield-Projekte, weil es round-trippt; (c) schreiben Sie die Wahl in Ihren Linter und mischen Sie die beiden nie innerhalb eines Projekts. Der Tokenizer des Case-Konverters folgt der Akronym-als-Wort-Konvention, um zu lodash und change-case zu passen — fügen Sie XMLHttpRequest ein, und Sie sehen xmlHttpRequest, xml_http_request, xml-http-request als camelCase-, snake_case- und kebab-case-Ausgaben.
URL-Slugs: Warum kebab-case snake_case schlägt
Googles offizielle Search-Central-Dokumentation zur URL-Struktur gibt genau eine konkrete Case-Empfehlung: Wörter in URLs mit Bindestrichen trennen, keine Unterstriche verwenden. Der Grund ist Tokenisierung. Googles Suchindex teilt URLs an Bindestrichen, aber nicht an Unterstrichen. https://example.com/buy-running-shoes wird als buy, running, shoes tokenisiert — drei indexierbare Begriffe, die zu beliebigen dieser Suchwörter passen können. https://example.com/buy_running_shoes wird als der einzelne Begriff buy_running_shoes tokenisiert, der nur zu genau dieser Zeichenkette passt.
Die praktische Wirkung auf Rankings ist klein für etablierte Seiten (Google hat andere Signale), aber real für neue Seiten, die in einer engen SERP konkurrieren. Bei einem Gleichstand rankt die kebab-case-URL höher.
Es gibt einen zweiten Grund: Groß-/Kleinschreibungs-Empfindlichkeit. URL-Pfade sind auf Linux-Servern case-sensitiv (also auf dem Großteil des Webs). /User-Profile und /user-profile sind zwei verschiedene URLs, zwei Cache-Einträge, zwei Analytics-Zeilen. Kleingeschriebenes kebab-case ist die Schreibweise, die nicht zu einem „funktioniert aber auf meinem Mac”-Bug einlädt.
Ein Vier-Schritte-Slug-Rezept, das für jeden Titel funktioniert:
- Alles kleinschreiben.
- Folgen von Whitespace und Satzzeichen durch einen einzelnen Bindestrich ersetzen.
- Führende und nachgestellte Bindestriche entfernen.
- Optional Stoppwörter weglassen (
a,an,the,of,for) für kürzere URLs — nur tun, wenn Ihr CMS den Originaltitel für die Seitenüberschrift behält.
Durchgerechnetes Beispiel: "10 Tips for Faster JavaScript: A Complete Guide" → 10-tips-faster-javascript-complete-guide. Doppelpunkt und Stoppwörter (for, a) werden entfernt; das Ergebnis ist 39 Zeichen lang, unter dem Sweet-Spot von 50-60 Zeichen für die SERP-Darstellung. Mehr zu URL-Länge und Plattform-Zeichenlimits im Zeichen- und Wortlimits-Guide.
Der Case-Konverter liefert die kebab-case-Ausgabe für jeden Titel in einem Einfüge-Vorgang — nützlich beim Generieren von Slugs in großen Mengen für eine CMS-Migration oder Sitemap.
Sechs Konvertierungsfallen
Das automatische Konvertieren zwischen Case-Stilen sieht trivial aus, ist es aber nicht. Sechs Stellen, an denen es bricht.
1. Zahl-Buchstabe-Grenzen
Was ist file2x nach einer snake_case-Konvertierung? Die gängige Konvention — lodash, change-case, PEP 8, der Case-Konverter — behandelt jeden Buchstabe↔Ziffer-Übergang als Token-Grenze, also wird file2x zu file / 2 / x und snake_cased zu file_2_x. parseUTF8 wird zu parse / utf / 8 und parse_utf_8.
Manche ältere Bibliotheken (und manche handgeschriebenen re.sub-Snippets von Stack Overflow) überspringen diese Regel und produzieren file2x → file2x oder parseutf8. Die Diskrepanz zeigt sich beim Migrieren von Code zwischen Bibliotheken: die Hälfte der Bezeichner wird umbenannt, die andere Hälfte nicht. Wählen Sie einen Tokenizer, prüfen Sie, dass er der Ziffergrenz-Regel folgt, und bleiben Sie dabei.
2. Aufeinanderfolgende Großbuchstaben
Die Akronym-Grenz-Regex lautet /([A-Z]+)([A-Z][a-z])/ — Trennung zwischen einer Folge von Großbuchstaben und einem letzten Großbuchstaben, der ein neues Wort beginnt. XMLHttpRequest matcht als XML + HttpRequest, dann Http + Request und ergibt die Tokens XML / Http / Request.
Die Rückreise ist der Knackpunkt: XML / Http / Request re-PascalCased wird zu XmlHttpRequest, nicht XMLHttpRequest. Das Akronym wurde title-cased. Standardverhalten, weil die Alternative — merken, welche Tokens ursprünglich Akronyme waren — Out-of-Band-Metadaten erfordert, die Tokenizer nicht haben. Bei einer Codebase im XMLHttpRequest-Stil schreibt ein projektweiter Rename durch einen Akronym-als-Wort-Konverter jedes Akronym still um. Testen Sie zuerst auf einem Branch oder nutzen Sie einen Tokenizer, mit dem Sie Akronyme explizit markieren können.
3. Unicode und locale-bewusstes Case-Mapping
'I'.toLowerCase() in JavaScript gibt üblicherweise 'i' zurück. Bei aktivem türkischem Locale gibt derselbe Aufruf 'ı' (punktloses i, U+0131) zurück, denn Türkisch hat zwei unterschiedliche i-Buchstaben, und die Kleinschreibung von Groß-I ist das punktlose. Dieser Bug ist in zahllosen Internationalisierungs-Rollouts ausgeliefert worden — Login-Formulare, die den Benutzernamen zum Vergleich uppercasen, sperren still jeden türkisch-lokalisierten Nutzer namens İrem aus.
Zwei weitere Tretminen: Deutsches ß.toUpperCase() gibt 'SS' zurück — ein Zeichen wird zu zwei, und jeder Code, der annimmt, Case-Konvertierung erhalte die String-Länge, ist falsch. Griechisches Σ.toLowerCase() ist kontextabhängig: σ im Wortinneren, ς am Wortende.
Lösung: toLocaleLowerCase() und toLocaleUpperCase() mit explizitem Locale verwenden, oder — falls das Locale des Nutzers unbekannt ist — 'en-US' übergeben, um das ASCII-kompatible Verhalten zu erhalten. Der Case-Konverter verwendet die Intl-bewussten Methoden, sodass alle drei Eingaben korrekt behandelt werden. Für die Regex-Seite deckt der Regex-Spickzettel die Unicode-Buchstabenklasse \p{L} ab.
4. Smart-Quote-Verunreinigung
Fügen Sie eine Zeichenkette aus Microsoft Word, Google Docs oder macOS Notes in einen Case-Konverter ein, schleppen Sie womöglich unsichtbare Passagiere mit: U+2018 / U+2019 / U+201C / U+201D (typografische Anführungszeichen), U+2014 (Gedankenstrich), U+00A0 (geschütztes Leerzeichen), U+200B (Breite-Null-Leerzeichen). Alle sehen in den meisten Schriftarten identisch zu ihren ASCII-Äquivalenten aus, kodieren aber anders. Ein camelCase-Bezeichner mit U+00A0 compiliert in manchen Sprachen und in anderen nicht, und das grep nach dem Variablennamen verfehlt das Vorkommen still.
Verteidigung: die Eingabe vor dem Tokenisieren normalisieren. Ein einzeiliges input.normalize('NFKC').replace(/[“”‘’]/g, '"') entfernt die meisten Übeltäter. Oder nutzen Sie den Ansatz aus dem Text-Diff-Guide — diffen Sie die verdächtige Zeichenkette gegen ihren visuellen ASCII-Zwilling und entdecken Sie die Unsichtbaren in einer Hex-Ansicht.
5. URLs sollten nicht snake_case’d werden
https://example.com/api/users in einen snake_case-Konverter eingefügt, produziert https_example_com_api_users. Technisch ein gültiger snake_case-Bezeichner; semantisch eine Katastrophe. URLs sind bereits in ihrem kanonischen Case-Stil (path/case mit kleingeschriebenen kebab-case-Pfadsegmenten), und die ganze URL als einzelnen Bezeichner zu behandeln verliert die strukturelle Information.
Die Lösung: die URL parsen, die Pfadsegmente extrahieren und jedes Segment unabhängig konvertieren. Der Case-Konverter parst URLs bewusst nicht automatisch — Nutzerabsicht zu erraten ist gefährlicher als wörtliche Behandlung. Fügen Sie eine URL ein, erhalten Sie eine wörtliche Konvertierung; wer Segment-für-Segment-Verhalten will, macht das selbst.
6. dot.case versus Property-Zugriff
Die Zeichenkette user.profile.image ist je nach Kontext zwei verschiedene Dinge. Als dot.case-Bezeichner in einer TOML-Datei ist sie ein Name mit drei Segmenten. Als JavaScript-Ausdruck ist sie die image-Property der profile-Property von user.
Beim Kopieren einer dot.case-Zeichenkette aus einer Config-Datei in eine JavaScript-Konsole versucht die Runtime, sie als Property-Kette auszuwerten, und liefert einen Fehler oder etwas Überraschendes. Umgekehrt: Code, der JS-Property-Pfade string-manipuliert ('a.b.c'.split('.')), trifft manchmal auf dot.case-Bezeichner aus anderer Quelle und interpretiert sie als tiefere Pfade als beabsichtigt. Die beiden müssen namespaced bleiben.
Konvention: dot.case-Zeichenketten bleiben innerhalb von Daten (Config-Dateien, MongoDB-Pfade, Log-Keys); Einzel-Bezeichner-Code nutzt camelCase oder snake_case; für Hierarchisches im Code nutzen Sie verschachtelte Objekte und die Punkt-Property-Syntax der Host-Sprache.
Rezepte für sprachübergreifende Migration
JS camelCase zu Python snake_case
Der schnellste Workflow: JS-Bezeichner kopieren, in einen Konverter einfügen, snake_case-Ausgabe kopieren. Für Massenkonvertierung auf Code-Ebene:
import { snakeCase } from 'change-case';
snakeCase('parseHTML'); // 'parse_html'
snakeCase('XMLHttpRequest'); // 'xml_http_request'
snakeCase('parseUTF8'); // 'parse_utf_8'
snakeCase('iPhone'); // 'i_phone'
Das letzte ist der Haken — iPhone ist ein Markenname, bei dem die camelCase-Grenze in die Irre führt. Für Markennamen und eine Handvoll historischer Bezeichner editieren Sie nach der Konvertierung manuell.
SQL snake_case zu JS/Java-API-Antworten
Die meisten ORMs machen das automatisch. Sequelize hat underscored: true, TypeORM hat die Klasse SnakeNamingStrategy, Hibernate hat den ImplicitNamingStrategyComponentPathImpl. Das Standard-Mapping ist user_profile_id ↔ userProfileId.
Was bricht: Akronym-tragende Spalten. Eine Spalte namens http_status_code round-trippt sauber zu httpStatusCode, doch bevorzugt Ihre Codebase HTTPStatusCode, kämpft der ORM gegen Sie. Entweder benennen Sie die Spalte zu httpstatuscode_code um (hässlich), konfigurieren den ORM zur Erhaltung von Akronymen (selten) oder akzeptieren die Standardkonvention.
React-PascalCase-Komponenten zu CSS-kebab-case-Klassen
// UserProfileCard.tsx
export function UserProfileCard({ user }) {
return <div className="user-profile-card">{user.name}</div>;
}
/* UserProfileCard.module.css */
.user-profile-card { padding: 1rem; }
.user-profile-card__avatar { border-radius: 50%; }
.user-profile-card--featured { background: gold; }
BEM (Block Element Modifier) ist die mit React am häufigsten gepaarte CSS-Klassen-Konvention: Block ist der Komponentenname in kebab-case, Element ist block__element, Modifier ist block--modifier. Auf Dateiebene: UserProfileCard.tsx für die Komponente, UserProfileCard.module.css für die gescopten Stile — beide PascalCase, passend zum Komponentennamen.
Umgebungsvariablen zu Anwendungskonfiguration
# .env (CONSTANT_CASE)
DATABASE_URL=postgres://localhost/myapp
MAX_RETRIES=3
LOG_LEVEL=info
// Node.js
const dbUrl = process.env.DATABASE_URL;
const maxRetries = parseInt(process.env.MAX_RETRIES, 10);
# Python
import os
db_url = os.environ['DATABASE_URL']
max_retries = int(os.environ['MAX_RETRIES'])
Der Env-Variablenname bleibt CONSTANT_CASE; der applikationsseitige Bezeichner folgt der Variablenkonvention der Sprache. YAML/TOML-Konfigurationsschlüssel sind konventionell snake_case (database_url, max_retries), obwohl sie zur Laufzeit auf dieselben CONSTANT_CASE-Env-Variablen abgebildet werden — Frameworks wie Spring, dotenv und Pydantic übernehmen das Case-Mapping.
Bibliotheken- und Werkzeugvergleich
| Werkzeug | Sprachen | Unterstützte Cases | Tokenizer-Verhalten |
|---|---|---|---|
lodash (_.camelCase, etc.) | JavaScript | 4 Hauptstile + startCase | Akronym-als-Wort |
change-case npm-Paket | JavaScript/TS | Alle 8 Programmier-Cases | Akronym-als-Wort |
inflection (Python) | Python | camelCase / snake_case | Akronym-als-Wort |
convert_case-Crate | Rust | 12+ Cases | Konfigurierbare Akronyme |
Go strings + Regex | Go | Eigenbau | Projekt-definiert |
| VS Code (eingebaut) | Editor | Nur UPPER / lower / Title | Nur Whitespace |
| VS Code „change-case”-Erweiterung | Editor | Alle 8 Programmier-Cases | Akronym-als-Wort |
| Case-Konverter | Browser | 15 Cases (7 Text + 8 Code) | Akronym-als-Wort |
Für Alltagscode installieren Sie change-case (JS) oder convert_case (Rust). Für Python ist das Paket inflection die kanonische Wahl, doch eine kleine handgeschriebene Regex deckt 90 % der Fälle ab. Für einmalige Konvertierungen während eines Code-Reviews oder Refactors zeigt der Case-Konverter alle 15 Ausgaben in einem Einfüge-Vorgang. Müssen Sie zusätzlich Tokens zählen oder die Bezeichnerlänge validieren, übernimmt das der Wortzähler; zum Verifizieren einer Tokenizer-Regex nutzen Sie den Regex-Tester mit den Mustern aus dem oben verlinkten Spickzettel.
FAQ
Was ist der Unterschied zwischen camelCase und PascalCase?
camelCase beginnt mit einem Kleinbuchstaben (userProfile); PascalCase mit einem Großbuchstaben (UserProfile). Beide schreiben jedes folgende Wort ohne Trennzeichen groß. camelCase ist die Konvention für Variablen und Funktionen in den meisten Sprachen der C-Familie; PascalCase die für Klassen, Typen und React-Komponenten.
Warum nutzt Python snake_case, JavaScript aber camelCase?
Python (1991) erbte snake_case von C und der Sprache ABC, dann kodifizierte PEP 8 es als Community-Standard. JavaScript (1995) kopierte den camelCase-Stil von Java, das camelCase wiederum von Smalltalk erbte. Beides sind historische Pfadabhängigkeiten. Keine Konvention ist technisch besser — Lesbarkeitsstudien stehen unentschieden — und Konsistenz innerhalb eines Ökosystems zählt mehr als die Wahl selbst.
Soll ich für Akronyme in camelCase parseUrl oder parseURL verwenden?
parseUrl (Akronym-als-Wort) ist der moderne Standard — verwendet von Google, Apple, lodash und change-case. parseURL (Akronym-Großschreibung erhalten) ist der Microsoft-.NET-Stil und dominiert in C#-Code. Für ein neues Projekt in JavaScript, TypeScript oder Swift wählen Sie parseUrl, weil es sauber durch snake_case- und kebab-case-Konvertierungen round-trippt. Was Sie auch wählen, kodieren Sie es in Ihrem Linter.
Ist kebab-case besser als snake_case für URLs?
Ja. Googles Search-Central-Empfehlung lautet, in URLs Bindestriche statt Unterstriche zu verwenden. Suchmaschinen-Indexer tokenisieren an Bindestrichen, aber nicht an Unterstrichen: /user-profile wird als user + profile indexiert, /user_profile als der einzelne Begriff user_profile. Der Ranking-Effekt ist pro Seite klein, aber real, und kleingeschriebene kebab-case-URLs vermeiden zusätzlich Case-Sensitivity-Bugs auf Linux-Servern.
Welchen Case-Stil sollen Datenbank-Spaltennamen nutzen?
snake_case. Jeder bedeutende ORM (SQLAlchemy, Hibernate, Sequelize, TypeORM, Active Record) verwendet das standardmäßig, und jeder bedeutende SQL-Dialekt behandelt es identisch. PostgreSQL faltet nicht-zitierte Bezeichner auf Kleinschreibung, MySQL unterscheidet auf Linux Groß-/Kleinschreibung und auf macOS/Windows nicht, SQLite behandelt Namen als opak. Kleingeschriebenes snake_case ist die Schreibweise, die sich überall gleich verhält.
Kann ich Namenskonventionen in einem Projekt mischen?
Ja — und in der Regel müssen Sie das. Eine typische Web-App nutzt camelCase für JS-Variablen, snake_case für die Datenbank, kebab-case für CSS-Klassen und URLs und CONSTANT_CASE für Env-Variablen. Die Regel lautet: eine Konvention pro Schicht, niemals innerhalb einer einzelnen Schicht mischen. Kodieren Sie die Schicht-Wahl in Linter oder Style-Guide, damit PR-Reviews sich nicht mehr damit beschäftigen.
Wie konvertiere ich Cases programmatisch?
Für JavaScript und TypeScript installieren Sie change-case oder nutzen lodashs _.camelCase / _.snakeCase / _.kebabCase. Für Python das Paket inflection oder eine kurze Regex (re.sub(r'(?<!^)(?=[A-Z])', '_', s).lower() für PascalCase zu snake_case). Für Rust die Crate convert_case. Für interaktive Einzel-Konvertierungen zeigt der Case-Konverter alle 15 Case-Ausgaben für jede Eingabe auf einer Browserseite.
Ist CONSTANT_CASE nur für Umgebungsvariablen?
Nein, doch Env-Variablen sind die häufigste Verwendung. CONSTANT_CASE ist für jede Laufzeit-Invariante: MAX_RETRIES, API_BASE_URL, DEFAULT_PAGE_SIZE, Enum-Werte, Makro-Definitionen, Top-Level-Konfigurationskonstanten. Die Regel: wäre das Ändern dieses Wertes zur Laufzeit ein Bug? Falls ja, CONSTANT_CASE; falls nein, die normale Variablenkonvention der Sprache. const result = await fetch(url) ist so in Ordnung.
Was ist der Unterschied zwischen dot.case und path/case?
dot.case verwendet . als Trennzeichen (user.profile.image) und repräsentiert einen hierarchischen Key innerhalb von Daten: Java-Pakete, MongoDB-Feldpfade, TOML-Konfigurationsschlüssel, Lodash-get/set-Pfade. path/case verwendet / (user/profile/image) und repräsentiert einen echten Ort: URL-Pfade, Dateisystempfade, Git-Refs. Die Punkt-vs-Slash-Wahl signalisiert „Daten-Label” gegen „Ort”.
Das 30-Sekunden-Entscheidungsblatt
Drei Regeln decken 95 % der Fragen ab:
-
Kopieren Sie für Code-Bezeichner die Standardbibliothek Ihrer Sprache. Python: snake_case für Variablen und Funktionen, PascalCase für Klassen. JavaScript und TypeScript: camelCase für Variablen und Funktionen, PascalCase für Klassen und Komponenten. Go: kleingeschriebener Anfangsbuchstabe für paket-privat, großgeschriebener für exportiert. Rust: snake_case für Variablen und Funktionen, PascalCase für Typen, SCREAMING_SNAKE für Konstanten.
-
Für die schichtübergreifenden Layer ist der Case-Stil sprachunabhängig festgelegt. URLs sind kebab-case. CSS-Klassen sind kebab-case. Datenbank-Spaltennamen sind snake_case. Umgebungsvariablen sind CONSTANT_CASE. HTTP/1.1-Header sind Header-Case (HTTP/2 normalisiert auf Kleinschreibung auf dem Wire).
-
Schreiben Sie die Wahl einmal in Ihren Linter und hören Sie auf zu streiten. ESLint, Pylint, Clippy, golangci-lint und Rubocop haben alle Regeln dafür. Wählen Sie die Konvention, konfigurieren Sie den Linter, und das nächste PR-Review verliert kein Wort mehr an
userIDgegenuserId.
Wenn Sie tatsächlich zwischen Case-Stilen konvertieren — für ein Refactor, eine CMS-Migration, ein SQL-zu-API-Mapping — liefert der Case-Konverter alle 15 Case-Ausgaben in einem Einfüge-Vorgang, sodass Sie die richtige kopieren können, ohne die Eingabe manuell zu tokenisieren. Verwandte Textarbeit übernehmen der Wortzähler, der Regex-Tester und Text vergleichen online. Zur Vertiefung deckt der Regex-Spickzettel die Tokenizer-Muster ab, der Text-Diff-Guide Vorher/Nachher-Vergleiche während einer Migration und der Zeichen- und Wortlimits-Guide URL-Längenbudgets für SEO-Slugs.