Texto

camelCase, snake_case e kebab-case: qual vai em cada lugar

Três convenções de nomes e uma regra para escolher entre elas: quem decide é o contexto, não o seu gosto.

Quem escolhe é o contexto, não o seu gosto. camelCase (userName) nomeia variáveis e funções em JavaScript, Java, Kotlin e Swift. snake_case (user_name) nomeia variáveis e funções em Python, Ruby e Rust, e colunas em SQL. kebab-case (user-name) fica em qualquer lugar que não seja um identificador de programa — URLs, nomes de classe CSS, atributos HTML, nomes de arquivo, pacotes npm — porque em quase toda linguagem o hífen é o operador de subtração e user-name é lido como user menos name.

As exceções são poucas: a família Lisp usa hífens para tudo, o C# escreve os nomes dos métodos com maiúscula inicial e o Go transforma a primeira letra em um modificador de acesso. Nenhuma delas é o que custa o seu tempo. O que custa é o ponto de contato entre um back end em snake_case e um front end em camelCase.

Como é cada convenção?

Três é o número errado. As duas convenções sobre as quais você não perguntou moram nos mesmos arquivos que as três sobre as quais perguntou.

ConvençãoExemploOnde ela fica
camelCasetotalItemCountVariáveis, funções e chaves JSON em JavaScript, Java, Kotlin e Swift
PascalCaseTotalItemCountClasses, tipos e componentes React em quase todo lugar
snake_casetotal_item_countIdentificadores de Python, Ruby e Rust; tabelas e colunas em SQL
CONSTANT_CASETOTAL_ITEM_COUNTConstantes e variáveis de ambiente, em quase qualquer linguagem
kebab-casetotal-item-countURLs, classes CSS, atributos HTML, nomes de arquivo, nomes de pacote

Qual convenção a minha linguagem espera?

A maioria está escrita em algum documento, o que significa que a discussão já foi resolvida e você pode pular essa parte.

Quando um repo já tem uma convenção, siga-a mesmo que você goste menos dela. Um código consistentemente fora de moda se lê melhor do que um convertido pela metade.

As constantes são o caso quase universal

Maiúsculas com sublinhados para constantes vale em toda essa lista, menos no Go, que nomeia constantes em MixedCaps como todo o resto — MaxRetries, não MAX_RETRIES. As variáveis de ambiente são a coisa mais próxima de uma regra absoluta: shells, runtimes de contêiner e todo o ferramental em volta dos arquivos .env presumem maiúsculas com sublinhados. Um nome de variável de ambiente em minúsculas costuma funcionar e mesmo assim parece um erro para quem olhar depois.

Por que kebab-case não pode ser nome de variável

Porque o hífen já é o sinal de menos. Escreva user-name = 5 em JavaScript e o parser lê uma subtração entre uma variável chamada user e outra chamada name, e depois se recusa a atribuir ao resultado: Invalid left-hand side in assignment. Coloque let na frente e ele falha um passo antes, no próprio hífen. O Python responde cannot assign to expression. Java, C#, Go, Rust, PHP e SQL rejeitam pelo mesmo motivo. É essa a história inteira: kebab-case fica restrito aos lugares onde nada está tentando avaliar uma expressão.

Há duas exceções reais. A família Lisp — Clojure, Scheme, Emacs Lisp — usa kebab-case para tudo, e é por isso que o estilo às vezes é chamado de lisp-case; o reader dessas linguagens não trata um hífen solto como operador. E as custom properties do CSS são escritas --brand-colour, com hífens e tudo, porque o CSS também não está avaliando aritmética sobre identificadores.

Onde kebab-case é a resposta certa

O que acontece onde duas convenções se encontram?

Dentro de um mesmo código, convenção é questão de estilo. O custo aparece onde duas delas se encontram: um serviço em Python usando snake_case, um front end em JavaScript usando camelCase e um payload JSON passando entre os dois. Alguma coisa precisa converter, e o jeito como isso falha é que todo mundo converte um pouco, em lugares diferentes, até que metade dos seus objetos carrega created_at e createdAt ao mesmo tempo e nenhum dos dois é preenchido de forma confiável.

Escolha uma camada — o serializador, normalmente — e converta ali e em nenhum outro lugar. O guia de estilo JSON do Google recomenda camelCase para nomes de propriedade, o que é um padrão razoável se você não tem outra restrição, mas a escolha importa muito menos do que fazê-la uma única vez.

O SQL merece o próprio aviso. Identificadores sem aspas são convertidos para uma única caixa — o padrão converte para maiúsculas, o PostgreSQL converte para minúsculas — então uma coluna que você cria como createdAt na verdade se chama createdat. Coloque aspas duplas na criação e a maiúscula sobrevive, mas aí toda consulta que tocar nela também precisa usar aspas, para sempre, e esquecer uma vez é um erro, não um deslize de digitação. snake_case é a convenção ali porque sai dessa conversão sem mudança.

Como converto um nome de uma convenção para outra?

Renomear na mão é de onde vêm os erros de digitação. Um conversor de maiúsculas e minúsculas pega um nome e devolve o mesmo nome em camelCase, PascalCase, snake_case, CONSTANT_CASE ou kebab-case, que é o jeito rápido de levar um identificador de uma linguagem para outra. Ele roda no navegador, então colar ali nomes de variáveis internas não manda nada para lugar nenhum.

Dois limites valem a pena conhecer antes de confiar no resultado. Siglas derrotam o conversor, e derrotam qualquer conversor de uso geral pelo mesmo motivo: a separação depende de uma letra minúscula seguida de uma maiúscula, e HTTPResponse não tem essa fronteira. Você recebe httpresponse, não http_response; parseXMLFile vira parse_xmlfile. Se os seus nomes têm siglas, leia o resultado antes de colar de volta.

As convenções de programação tratam a caixa de texto inteira como um identificador só. Maiúsculas, minúsculas, Title Case e Sentence case funcionam em um parágrafo, mas camelCase, snake_case e kebab-case achatam tudo o que você colar — quebras de linha incluídas — em um único nome. Passe um identificador por vez para esses modos.

Como renomeio uma convenção em um projeto inteiro?

A tentação é um localizar e substituir geral, e o perigo não é o que as pessoas esperam. A correspondência de palavra inteira impede que userName seja encontrado dentro de userNames. O que ela não impede é a substituição cair dentro de um string literal, de um comentário, de uma consulta SQL ou da chave de um payload de API — então uma renomeação que era para ser cosmética muda em silêncio o formato dos dados que trafegam. Passar por uma substituição que lista cada ocorrência com o número da linha antes de se comprometer deixa esses casos visíveis enquanto ainda são baratos.

Essa funciona sobre um bloco de texto que você cola, e lista as primeiras cem ocorrências. Serve para um único arquivo que você vai colar de volta, não para uma varredura em cem arquivos. Para a varredura você quer o sed ou a busca em todo o projeto do seu editor — mesma disciplina: leia as ocorrências antes de substituir.

Depois, leia o diff em vez da saída dos testes. Comparar o antes e o depois lado a lado pega as três linhas que você não queria tocar mais rápido do que uma suíte de testes que só cobre os caminhos nos quais você pensou.

Isso tudo importa?

Para a correção, não, e para o desempenho, também não. Importa para o grep: nomes consistentes significam que uma busca só acha todas as ocorrências, enquanto nomes inconsistentes significam que você acha quase todas e é mordido pelo resto. Existe trabalho acadêmico comparando a velocidade com que as pessoas leem snake_case e camelCase, e ele não resolve nada: os estudos são pequenos e os resultados se contradizem, então não é base sólida para uma decisão. A consistência é o benefício que dá para observar de verdade. Todo o resto é preferência fantasiada de princípio.

Para a parte mecânica — um nome, cinco convenções, nada de digitar — o conversor de maiúsculas e minúsculas resolve no navegador, incluindo os modos Title Case e Sentence case que não têm nada a ver com código. Só lembre que ele achata tudo o que você colar em um identificador único quando você escolhe uma das convenções de programação.

Se o motivo de você estar aqui é que uma convenção precisa mudar em um projeto inteiro, a renomeação em si é a parte arriscada. Os erros que transformam um localizar e substituir em uma hora de limpeza cobre o que dá errado dentro de strings, comentários e correspondências parciais, que é exatamente onde uma renomeação de convenção causa estrago.

Perguntas frequentes

Qual é a diferença entre camelCase e snake_case?

camelCase junta as palavras colocando em maiúscula cada uma depois da primeira, como em userName. snake_case junta com sublinhados e deixa tudo em minúsculas, como em user_name. Nenhuma é melhor; elas marcam a qual comunidade de linguagem o código pertence, com camelCase padrão em JavaScript, Java e Swift, e snake_case padrão em Python, Ruby e Rust.

Posso usar kebab-case em um nome de variável?

Na maioria das linguagens, não. O hífen é o operador de subtração, então user-name é lido como user menos name e a linha não compila. As exceções são a família Lisp, incluindo Clojure e Scheme, onde kebab-case é o estilo normal, e as custom properties do CSS, como --brand-colour.

Qual convenção devo usar em URLs?

kebab-case em minúsculas. O Google trata hífens em uma URL como separadores de palavras e os recomenda em vez de sublinhados há anos. Minúsculas também evitam problemas de conteúdo duplicado em servidores que tratam caminhos diferenciando maiúsculas de minúsculas.

Chaves JSON devem ser camelCase ou snake_case?

As duas funcionam, e a consistência importa mais do que a escolha. O guia de estilo JSON do Google recomenda camelCase, que é um padrão sensato para uma API consumida por JavaScript. Se a sua API é a cara pública de um serviço em Python ou Ruby, chaves em snake_case vão combinar com o resto da sua documentação e poupar uma camada de conversão.

Como converto camelCase para snake_case?

Separe o nome em todo ponto onde uma letra minúscula é seguida de uma maiúscula, passe tudo para minúsculas e junte com sublinhados. Ferramentas automáticas fazem isso de forma confiável, menos com siglas: HTTPResponse não tem essa fronteira, então vira httpresponse em vez de http_response. Confira na mão qualquer nome que contenha uma sigla.

snake_case ou camelCase é mais legível?

Existe pesquisa sobre isso e ela não chega a uma resposta clara; os estudos são pequenos e os resultados se contradizem. Na prática a legibilidade vem da consistência dentro de um projeto e de nomes que descrevem a coisa, não do separador. Siga o que a linguagem e o código existente já usam.

Última atualização 19 de setembro de 2026