snake_case、camelCase、PascalCase、kebab-case:命名規則の使い分け
getUserName、get_user_name、GetUserName、get-user-name — どれも同じ「ユーザー名を取得する」を表しますが、コミュニティや言語によって慣習が違います。本記事では主要な命名規則とその使い分けを整理します。
主要な命名規則
| 名前 | 例 | 別名 |
|---|---|---|
| camelCase | getUserName | lowerCamelCase、dromedaryCase |
| PascalCase | GetUserName | UpperCamelCase |
| snake_case | get_user_name | underscore_case |
| SCREAMING_SNAKE_CASE | GET_USER_NAME | constant_case |
| kebab-case | get-user-name | dash-case、spinal-case |
| flatcase | getusername | lowercase |
| dot.case | get.user.name | — |
| Train-Case | Get-User-Name | HTTP-Header-Case |
言語ごとの慣習
| 言語・領域 | 関数・変数 | クラス・型 | 定数 |
|---|---|---|---|
| JavaScript / TypeScript | camelCase | PascalCase | UPPER_SNAKE |
| Python | snake_case | PascalCase | UPPER_SNAKE |
| Ruby | snake_case | PascalCase | UPPER_SNAKE |
| Java | camelCase | PascalCase | UPPER_SNAKE |
| C# | PascalCase | PascalCase | PascalCase |
| Go | camelCase(非公開)/ PascalCase(公開) | PascalCase | PascalCase |
| Rust | snake_case | PascalCase | UPPER_SNAKE |
| Swift | camelCase | PascalCase | camelCase |
| PHP | camelCase | PascalCase | UPPER_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('-');
} 連続大文字(HTTPRequest、getURL)の扱いは注意が必要:
HTTPRequest→["HTTP", "Request"](理想)HTTPRequest→["H", "T", "T", "P", "Request"](簡易実装)
正確に分割するには [A-Z]+(?=[A-Z][a-z])|[A-Z][a-z]* のような正規表現を使います。
言語間の API 変換
データを言語間で受け渡すときに命名規則を変換するライブラリ:
- JavaScript:
camelcase-keys、snakecase-keys - Ruby on Rails:自動でJSONを camelCase 化(最近のバージョン)
- Django REST Framework:
djangorestframework-camel-caseミドルウェア
サーバー(Python、snake_case)とクライアント(JS、camelCase)で命名規則が違う場合、API 境界で変換するのが定番。
まとめ
- 言語ごとの慣習に従うのが基本
- URL・ファイル名は kebab-case が定番
- 定数は SCREAMING_SNAKE_CASE が共通慣習
- API キーの規則はプロジェクトで統一する
文字列を camelCase / snake_case / kebab-case などに相互変換したいときは、本サイトのケース変換ツールが使えます。