camelCase, snake_case, kebab-case: o guia rápido para desenvolvedores

Aqui vai a versão curta. Tipos e classes levam PascalCase em quase todas as linguagens. Variáveis e funções levam camelCase em JavaScript, Java, C#, Kotlin e Swift, mas snake_case em Python, Ruby e Rust. Constantes levam SCREAMING_SNAKE_CASE na maioria das linguagens, com Go, Swift, C# e o C++ no estilo do Google como exceções. Tudo o que vai parar numa URL, num arquivo CSS ou num nome de pacote costuma ser kebab-case em minúsculas, e as variáveis de ambiente ficam em maiúsculas, com sublinhados.
Esse é o padrão. Os detalhes é que rendem discussão nos code reviews, então este guia rápido se limita ao que o guia de estilo oficial, ou o mais usado, de cada linguagem realmente diz, e cita a fonte de cada uma.
camelCase, snake_case, kebab-case: os cinco estilos e seus outros nomes
- camelCase (
orderTotal): primeira palavra em minúsculas, cada palavra seguinte com inicial maiúscula. Também chamado de lowerCamelCase; a PEP 8 o chama de mixedCase. - PascalCase (
OrderTotal): todas as palavras com inicial maiúscula. Também UpperCamelCase, CapWords (PEP 8) ou StudlyCaps (PSR-1 do PHP). - snake_case (
order_total): palavras em minúsculas unidas por sublinhados. - SCREAMING_SNAKE_CASE (
ORDER_TOTAL): palavras em maiúsculas unidas por sublinhados. O guia de JavaScript do Google o chama de CONSTANT_CASE, e o de Java, de UPPER_SNAKE_CASE. - kebab-case (
order-total): palavras em minúsculas unidas por hifens. A maioria das linguagens não pode usá-lo em identificadores, porque o hífen é o sinal de menos.
Para trocar um nome de um estilo para outro, cole-o no nosso conversor de maiúsculas e minúsculas. Ele separa por espaços, sublinhados, hifens e maiúsculas já existentes, então order_total, order-total e OrderTotal se convertem sem problemas entre si. Converta um nome por vez, porém: ele trata tudo o que está na caixa como um único identificador.
Guia rápido: convenções de nomenclatura por linguagem
| Linguagem | Variáveis e funções | Classes e tipos | Constantes | Fonte |
|---|---|---|---|---|
| JavaScript, TypeScript | camelCase | PascalCase | CONSTANT_CASE para valores de nível de módulo que nunca mudam | Guias de estilo de JavaScript e TypeScript do Google |
| Java | camelCase | PascalCase | UPPER_SNAKE_CASE para campos static final profundamente imutáveis | Google Java Style Guide |
| Kotlin | camelCase | PascalCase | SCREAMING_SNAKE_CASE para const e para valores de nível superior ou de objetos profundamente imutáveis | Kotlin coding conventions |
| C# | camelCase para variáveis locais e parâmetros, _camelCase para campos privados, PascalCase para métodos e membros públicos | PascalCase, com o prefixo I para interfaces (IWorkerQueue) | PascalCase | Documentação do .NET, da Microsoft |
| Swift | camelCase | PascalCase | camelCase | Swift API Design Guidelines |
| Go | camelCase se não exportado, PascalCase se exportado | Mesma regra | Também 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 | métodos em camelCase; as propriedades ficam por sua conta | PascalCase (StudlyCaps) | Constantes de classe em UPPER_SNAKE_CASE | PSR-1 |
| C++ | variáveis em snake_case, funções em PascalCase | PascalCase | kDaysInAWeek | Google C++ Style Guide (um entre vários) |
Algumas linhas pedem uma nota de rodapé. Em Go, a primeira letra nem é uma escolha de estilo: é a regra de visibilidade. Area é exportado do seu pacote e area não é, e o compilador faz valer isso. O C++ não tem uma convenção para a linguagem toda; a própria biblioteca padrão usa snake_case (std::unordered_map, push_back), então trate a linha do Google como uma opção bem documentada, não como a regra.
O Rust é incomumente rígido com o estilo. O compilador avisa já de fábrica: escreva fn GetUser() ou struct user_account e o rustc sugere get_user e UserAccount antes mesmo de você rodar um linter.
Nomes de arquivos, módulos e pacotes
- Java: uma classe pública de nível superior precisa ficar num arquivo com exatamente o seu nome, maiúsculas incluídas.
OrderServicevai emOrderService.java, e o javac rejeita qualquer outra coisa. - Kotlin: um arquivo que contém uma única classe leva o nome dessa classe. Os demais arquivos recebem um nome descritivo em UpperCamelCase, como
ProcessDeclarations.kt. - Python: os módulos recebem nomes curtos, todos em minúsculas, com sublinhados se ajudarem na legibilidade. Os pacotes também devem ser curtos e em minúsculas, e a PEP 8 desaconselha sublinhados neles.
- Ruby: arquivos em snake_case com o nome da classe que contêm, então
HelloWorldfica emhello_world.rb. - Go: nomes de pacote são palavras únicas em minúsculas, sem sublinhados nem mixedCaps:
base64, e nãoencoding_base64nemencodingBase64. - JavaScript e TypeScript: não há uma regra única. O guia de JavaScript do Google quer nomes de arquivo todos em minúsculas, com sublinhados ou hifens, e o guia de TypeScript dele usa snake_case. O guia da Airbnb diz que o nome do arquivo deve corresponder à sua exportação padrão, então uma classe
CheckBoxfica emCheckBox.js. Escolha uma regra por projeto e anote-a. - Pacotes npm: nomes de pacotes novos não podem conter letras maiúsculas.
Além do código-fonte: variáveis de ambiente, CSS, HTML, URLs, JSON e SQL
| Onde | Convenção | Exemplo | Por quê |
|---|---|---|---|
| Variáveis de ambiente | SCREAMING_SNAKE_CASE | DATABASE_URL | Combina com variáveis do sistema, como PATH e HOME. Os nomes diferenciam maiúsculas e minúsculas no Linux e no macOS, mas não no Windows. |
| Propriedades CSS | kebab-case | background-color | Definido pela própria linguagem. |
| Propriedades personalizadas do CSS | kebab-case depois de dois hifens | --brand-color | Diferenciam maiúsculas e minúsculas, então --Brand-Color seria outra propriedade. |
| Nomes de classes CSS | kebab-case, muitas vezes com BEM | card__title--large | Lê-se como as propriedades ao redor. |
| CSS a partir do JavaScript | camelCase | el.style.backgroundColor | O objeto style expõe os nomes das propriedades em camelCase. |
| Atributos data do HTML | kebab-case | data-index-number | Lidos no JavaScript como dataset.indexNumber. |
| Caminhos de URL | kebab-case em minúsculas | /blog/developer-case-styles | O Google recomenda hifens em vez de sublinhados e trata /APPLE e /apple como URLs diferentes. |
| Chaves JSON | Não há padrão | userId ou user_id | Acompanhe o consumidor principal e converta na fronteira. |
| Tabelas e colunas SQL | snake_case em minúsculas | order_items | Funciona sem aspas em todos os bancos de dados importantes. |
Uma peculiaridade das variáveis de ambiente: o POSIX diz que os utilitários padrão usam nomes em maiúsculas e reserva os nomes com letras minúsculas para as aplicações, de modo que um nome em minúsculas nunca colide com um nome padrão. Mesmo assim, as maiúsculas continuam sendo o hábito estabelecido, então nós manteríamos esse hábito e acrescentaríamos um prefixo distintivo (MYAPP_TIMEOUT) para evitar colisões.
As linhas de CSS e de SQL têm cada uma um artigo próprio: veja nomenclatura CSS e BEM para os nomes de classes e convenções de nomenclatura SQL para entender por que os bancos de dados empurram você para as minúsculas.
Siglas: onde os guias de estilo discordam
Todos os guias concordam em userName. Eles se dividem em userID. Os guias de JavaScript e de Java do Google escrevem as siglas em minúsculas, como palavras comuns (xmlHttpRequest, customerId). O Go mantém cada sigla numa única caixa (ServeHTTP, appID). As diretrizes do .NET da Microsoft põem em maiúsculas as duas letras de uma sigla de duas letras (IOStream), mas só a primeira letra das mais longas (HtmlTag). O Rust as trata como palavras (Uuid), e a PEP 8 prefere HTTPServerError a HttpServerError. Comparamos as opções lado a lado em camelCase vs. PascalCase.
Como escolher quando você não tem certeza
- Veja se a plataforma decide por você. Os nomes de propriedades CSS, os nomes de arquivo Java, os nomes exportados do Go e os nomes de componentes React (que precisam começar com letra maiúscula) não são escolhas de estilo.
- Siga o guia oficial da linguagem. O código novo deve se parecer com a biblioteca padrão ao lado da qual ele fica.
- Acompanhe o projeto existente. A PEP 8 diz isso com todas as letras: a consistência dentro de um projeto importa mais do que a consistência com o guia de estilo.
- Deixe um linter lembrar por você. A regra
camelcasedo ESLint, as regrasNdo Ruff para Python e os avisos embutidos do rustc pegam deslizes antes que um revisor precise fazer isso. - Converta uma vez, na fronteira. Quando um JSON em snake_case encontra um JavaScript em camelCase, renomeie as chaves numa única camada de serialização em vez de deixar os dois estilos vazarem pela base de código.


