snake_case、camelCase、PascalCase、kebab-case:命名規則の使い分け

約7分

getUserNameget_user_nameGetUserNameget-user-name — どれも同じ「ユーザー名を取得する」を表しますが、コミュニティや言語によって慣習が違います。本記事では主要な命名規則とその使い分けを整理します。

主要な命名規則

名前別名
camelCasegetUserNamelowerCamelCase、dromedaryCase
PascalCaseGetUserNameUpperCamelCase
snake_caseget_user_nameunderscore_case
SCREAMING_SNAKE_CASEGET_USER_NAMEconstant_case
kebab-caseget-user-namedash-case、spinal-case
flatcasegetusernamelowercase
dot.caseget.user.name
Train-CaseGet-User-NameHTTP-Header-Case

言語ごとの慣習

言語・領域関数・変数クラス・型定数
JavaScript / TypeScriptcamelCasePascalCaseUPPER_SNAKE
Pythonsnake_casePascalCaseUPPER_SNAKE
Rubysnake_casePascalCaseUPPER_SNAKE
JavacamelCasePascalCaseUPPER_SNAKE
C#PascalCasePascalCasePascalCase
GocamelCase(非公開)/ PascalCase(公開)PascalCasePascalCase
Rustsnake_casePascalCaseUPPER_SNAKE
SwiftcamelCasePascalCasecamelCase
PHPcamelCasePascalCaseUPPER_SNAKE

C# は変数まで PascalCase、Go は関数の export 状態を大文字小文字で表す(Foo は public、foo は private)など、独特なルールを持つ言語もあります。

用途別の使い分け

URL(kebab-case)

/api/user-profiles/123
/products/red-running-shoes

理由:

  • 検索エンジンがハイフンを単語の区切りと認識する
  • アンダースコアは「単語の連結」と解釈されることがある(SEO 上不利)
  • 大文字を URL に入れるとケース sensitivity 問題が起きる

ファイル名(kebab-case または snake_case)

  • React コンポーネントは PascalCase(UserProfile.tsx
  • 一般的なファイルは kebab-case(user-profile.ts)または snake_case(user_profile.py
  • 言語のコミュニティ慣習に従うのが無難

CSS クラス(kebab-case)

.user-profile {
}
.btn-primary {
}

BEM 方式:

.block__element--modifier
.card__title--large

HTML 属性(kebab-case)

<div data-user-id="123" data-is-active="true"></div>

camelCase で書くと小文字に正規化されてしまうので NG。JavaScript からアクセスするときは dataset.userId のように camelCase に自動変換される。

HTTP ヘッダ(Train-Case)

Content-Type: application/json
X-Forwarded-For: 192.168.1.1

伝統的に各単語の頭文字大文字。仕様上は case-insensitive だが、慣習として Train-Case が使われる。

JSON のキー

明確な慣習なし。プロジェクトで統一する:

  • snake_case:Python・Ruby 系のバックエンド由来
  • camelCase:JavaScript フロントエンド由来

API レスポンスは「クライアントの言語慣習に合わせる」ケースが多い。フロントエンドが JS なら camelCase。

定数(SCREAMING_SNAKE_CASE)

const MAX_RETRY_COUNT = 3;
const API_BASE_URL = 'https://...';

ほぼすべての言語で「定数は大文字 + アンダースコア」が共通慣習。視覚的に「変更しない値」を示せる。

変換アルゴリズム

各形式間の変換:

// camelCase / PascalCase → words
function splitCamel(str) {
	return str
		.replace(/([a-z])([A-Z])/g, '$1 $2')
		.toLowerCase()
		.split(' ');
}

// snake_case / kebab-case → words
function splitDelimited(str) {
	return str.split(/[-_]/);
}

// words → camelCase
function toCamel(words) {
	return (
		words[0].toLowerCase() +
		words
			.slice(1)
			.map((w) => w[0].toUpperCase() + w.slice(1).toLowerCase())
			.join('')
	);
}

// words → snake_case
function toSnake(words) {
	return words.map((w) => w.toLowerCase()).join('_');
}

// words → kebab-case
function toKebab(words) {
	return words.map((w) => w.toLowerCase()).join('-');
}

連続大文字(HTTPRequestgetURL)の扱いは注意が必要:

  • HTTPRequest["HTTP", "Request"](理想)
  • HTTPRequest["H", "T", "T", "P", "Request"](簡易実装)

正確に分割するには [A-Z]+(?=[A-Z][a-z])|[A-Z][a-z]* のような正規表現を使います。

言語間の API 変換

データを言語間で受け渡すときに命名規則を変換するライブラリ:

  • JavaScriptcamelcase-keyssnakecase-keys
  • Ruby on Rails:自動でJSONを camelCase 化(最近のバージョン)
  • Django REST Frameworkdjangorestframework-camel-case ミドルウェア

サーバー(Python、snake_case)とクライアント(JS、camelCase)で命名規則が違う場合、API 境界で変換するのが定番。

まとめ

  • 言語ごとの慣習に従うのが基本
  • URL・ファイル名は kebab-case が定番
  • 定数は SCREAMING_SNAKE_CASE が共通慣習
  • API キーの規則はプロジェクトで統一する

文字列を camelCase / snake_case / kebab-case などに相互変換したいときは、本サイトのケース変換ツールが使えます。