camelCase, snake_case, kebab-case: la guida rapida per sviluppatori

Ecco la versione breve. Tipi e classi usano PascalCase in quasi tutti i linguaggi. Variabili e funzioni usano camelCase in JavaScript, Java, C#, Kotlin e Swift, ma snake_case in Python, Ruby e Rust. Le costanti usano SCREAMING_SNAKE_CASE nella maggior parte dei linguaggi, con le eccezioni di Go, Swift, C# e del C++ in stile Google. Tutto ciò che finisce in un URL, in un file CSS o nel nome di un pacchetto è di solito in kebab-case minuscolo, e le variabili d'ambiente sono in maiuscolo con i trattini bassi.
Questo è lo schema. I dettagli sono il punto in cui nascono le discussioni nelle code review, quindi questa guida rapida si attiene a ciò che dicono davvero la guida di stile ufficiale o quella più diffusa di ciascun linguaggio, e indica la fonte per ognuno.
camelCase, snake_case, kebab-case: i cinque stili e gli altri nomi con cui li trovi
- camelCase (
orderTotal): la prima parola è in minuscolo, ogni parola successiva ha l'iniziale maiuscola. Si chiama anche lowerCamelCase; PEP 8 lo chiama mixedCase. - PascalCase (
OrderTotal): ogni parola ha l'iniziale maiuscola. Si chiama anche UpperCamelCase, CapWords (PEP 8) o StudlyCaps (PSR-1 di PHP). - snake_case (
order_total): parole in minuscolo unite da trattini bassi. - SCREAMING_SNAKE_CASE (
ORDER_TOTAL): parole in maiuscolo unite da trattini bassi. La guida JavaScript di Google lo chiama CONSTANT_CASE, quella per Java UPPER_SNAKE_CASE. - kebab-case (
order-total): parole in minuscolo unite da trattini. Nella maggior parte dei linguaggi non si può usare per gli identificatori, perché il trattino è il segno meno.
Per passare un nome da uno stile all'altro, incollalo nel nostro convertitore di maiuscole/minuscole. Divide il testo in corrispondenza di spazi, trattini bassi, trattini e maiuscole già presenti, così order_total, order-total e OrderTotal si convertono senza problemi l'uno nell'altro. Però fai un nome alla volta: tutto ciò che c'è nel riquadro viene trattato come un unico identificatore.
Guida rapida: le convenzioni di nomi linguaggio per linguaggio
| Linguaggio | Variabili e funzioni | Classi e tipi | Costanti | Fonte |
|---|---|---|---|---|
| JavaScript, TypeScript | camelCase | PascalCase | CONSTANT_CASE per i valori a livello di modulo che non cambiano mai | Google JavaScript Style Guide e Google TypeScript Style Guide |
| Java | camelCase | PascalCase | UPPER_SNAKE_CASE per i campi static final immutabili in profondità | Google Java Style Guide |
| Kotlin | camelCase | PascalCase | SCREAMING_SNAKE_CASE per const e per i valori top-level o di object immutabili in profondità | Kotlin coding conventions |
| C# | camelCase per variabili locali e parametri, _camelCase per i campi privati, PascalCase per metodi e membri pubblici | PascalCase, con il prefisso I per le interfacce (IWorkerQueue) | PascalCase | Documentazione Microsoft .NET |
| Swift | camelCase | PascalCase | camelCase | Swift API Design Guidelines |
| Go | camelCase se non esportato, PascalCase se esportato | Stessa regola | Anche 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 | metodi in camelCase; per le proprietà decidi tu | PascalCase (StudlyCaps) | Costanti di classe in UPPER_SNAKE_CASE | PSR-1 |
| C++ | variabili in snake_case, funzioni in PascalCase | PascalCase | kDaysInAWeek | Google C++ Style Guide (una tra le tante) |
Un paio di righe richiedono una nota. In Go la prima lettera non è affatto una scelta di stile: è la regola di visibilità. Area è esportata dal suo pacchetto e area no, e a farlo rispettare è il compilatore. Il C++ non ha una convenzione valida per tutto il linguaggio; la libreria standard stessa usa snake_case (std::unordered_map, push_back), quindi considera la riga di Google come un'opzione ben documentata, non come la regola.
Rust è insolitamente rigido sullo stile. Il compilatore avvisa già di serie: se scrivi fn GetUser() o struct user_account, rustc ti suggerisce get_user e UserAccount prima ancora che tu abbia usato un linter.
Nomi di file, moduli e pacchetti
- Java: una classe pubblica di primo livello deve stare in un file che ha esattamente il suo nome, maiuscole comprese.
OrderServiceva inOrderService.java, e javac rifiuta qualsiasi altra cosa. - Kotlin: un file che contiene una sola classe prende il nome di quella classe. Gli altri file hanno un nome descrittivo in UpperCamelCase, come
ProcessDeclarations.kt. - Python: i moduli hanno nomi brevi, tutti in minuscolo, con trattini bassi se aiutano la leggibilità. Anche i pacchetti dovrebbero avere nomi brevi in minuscolo, e PEP 8 sconsiglia di usarvi i trattini bassi.
- Ruby: file in snake_case che prendono il nome della classe che contengono, quindi
HelloWorldsta inhello_world.rb. - Go: i nomi dei pacchetti sono parole singole in minuscolo, senza trattini bassi né mixedCaps:
base64, nonencoding_base64néencodingBase64. - JavaScript e TypeScript: nessuna regola unica. La guida JavaScript di Google vuole nomi di file tutti in minuscolo con trattini bassi o trattini, e la sua guida TypeScript usa snake_case. La guida di Airbnb dice che il nome di un file deve corrispondere al suo export predefinito, quindi una classe
CheckBoxsta inCheckBox.js. Scegline una per progetto e mettila per iscritto. - Pacchetti npm: i nomi dei nuovi pacchetti non possono contenere lettere maiuscole.
Oltre il codice sorgente: variabili d'ambiente, CSS, HTML, URL, JSON e SQL
| Dove | Convenzione | Esempio | Perché |
|---|---|---|---|
| Variabili d'ambiente | SCREAMING_SNAKE_CASE | DATABASE_URL | Come le variabili di sistema, ad esempio PATH e HOME. I nomi distinguono maiuscole e minuscole su Linux e macOS, non su Windows. |
| Proprietà CSS | kebab-case | background-color | Stabilito dal linguaggio. |
| Proprietà personalizzate CSS | kebab-case dopo due trattini | --brand-color | Distinguono maiuscole e minuscole, quindi --Brand-Color sarebbe una proprietà diversa. |
| Nomi delle classi CSS | kebab-case, spesso con BEM | card__title--large | Si legge come le proprietà che le circondano. |
| CSS da JavaScript | camelCase | el.style.backgroundColor | L'oggetto style espone i nomi delle proprietà in camelCase. |
| Attributi data di HTML | kebab-case | data-index-number | In JavaScript si legge come dataset.indexNumber. |
| Percorsi degli URL | kebab-case minuscolo | /blog/developer-case-styles | Google raccomanda i trattini rispetto ai trattini bassi e considera /APPLE e /apple due URL diversi. |
| Chiavi JSON | Nessuno standard | userId o user_id | Adeguati al principale consumatore dei dati e converti al confine. |
| Tabelle e colonne SQL | snake_case minuscolo | order_items | Funziona senza virgolette in tutti i principali database. |
Una particolarità sulle variabili d'ambiente: POSIX dice che le utility standard usano nomi in maiuscolo e riserva alle applicazioni i nomi che contengono lettere minuscole, quindi un nome in minuscolo non può mai entrare in conflitto con uno standard. Il maiuscolo resta comunque l'abitudine consolidata, perciò noi lo manterremmo e, per evitare i conflitti, aggiungeremmo un prefisso distintivo (MYAPP_TIMEOUT).
Le righe su CSS e SQL hanno ciascuna un articolo dedicato: per i nomi delle classi vedi convenzioni di nomi in CSS e BEM, mentre le convenzioni di nomi in SQL spiegano perché i database ti spingono verso il minuscolo.
Le sigle: dove le guide di stile non sono d'accordo
Tutte le guide concordano su userName. Si dividono su userID. Le guide Google per JavaScript e Java scrivono le sigle in minuscolo come parole normali (xmlHttpRequest, customerId). Go lascia ogni sigla tutta in maiuscolo o tutta in minuscolo (ServeHTTP, appID). Le linee guida .NET di Microsoft mettono in maiuscolo entrambe le lettere di una sigla di due lettere (IOStream) ma solo la prima lettera in quelle più lunghe (HtmlTag). Rust le tratta come parole (Uuid), e PEP 8 preferisce HTTPServerError a HttpServerError. Mettiamo a confronto le varie opzioni in camelCase e PascalCase.
Come scegliere quando hai dei dubbi
- Controlla se è la piattaforma a decidere per te. I nomi delle proprietà CSS, i nomi dei file Java, i nomi esportati di Go e i nomi dei componenti React (che devono iniziare con la maiuscola) non sono scelte di stile.
- Segui la guida ufficiale del linguaggio. Il codice nuovo dovrebbe somigliare alla libreria standard accanto a cui sta.
- Adegua il codice al progetto esistente. PEP 8 lo dice chiaro e tondo: la coerenza all'interno di un progetto conta più della coerenza con la guida di stile.
- Lascia che se ne ricordi un linter. La regola
camelcasedi ESLint, le regoleNdi Ruff per Python e gli avvisi integrati di rustc intercettano le sviste prima che debba farlo chi revisiona il codice. - Converti una volta sola, al confine. Quando il JSON in snake_case incontra JavaScript in camelCase, rinomina le chiavi in un solo livello di serializzazione invece di lasciare che entrambi gli stili si diffondano in tutto il codice.


