- 技術 💻
変数名・関数名の付け方|命名規則と言語別のルール
よい名前とは、「それが何なのか」「何をするのか」を、コードの他の部分を読まなくても伝えられる名前です。d や data、flag のような名前は書くときは楽ですが、読む人(半年後の自分を含む)は、その値が何なのかを毎回調べなければなりません。
名前の付け方には、言語ごとの記法のルールと、意味を伝えるための工夫の2つの側面があります。この記事では、記法の種類と言語別の命名規則を一覧で比較したうえで、実践的なルールを、直す前と後のコード例で解説します。
命名の記法(ケース)の種類
| 記法 | 書き方 | 例 |
|---|---|---|
| キャメルケース(lower camel case) | 最初は小文字、単語の区切りを大文字に | userName、calculateTotal |
| パスカルケース(upper camel case) | すべての単語の先頭を大文字に | UserName、OrderService |
| スネークケース | 小文字を _ でつなぐ |
user_name、calculate_total |
| 定数(スクリーミングスネークケース) | 大文字を _ でつなぐ |
MAX_RETRY_COUNT |
| ケバブケース | 小文字を - でつなぐ |
user-name、main-header |
言語別の命名規則
| 言語・対象 | 変数・関数 | クラス | 定数 | 主な規約 |
|---|---|---|---|---|
| Java | userName(キャメル) |
UserService(パスカル) |
MAX_SIZE |
Oracleのコード規約、Google Java Style |
| Python | user_name(スネーク) |
UserService(パスカル) |
MAX_SIZE |
PEP 8 |
| JavaScript・TypeScript | userName(キャメル) |
UserService(パスカル) |
MAX_SIZE |
各社のスタイルガイド |
| C# | userName(ローカル変数)、GetUser(メソッドはパスカル) |
UserService |
MaxSize |
Microsoftの規約 |
| Go | userName(非公開)、UserName(公開) |
UserService |
同左 | 先頭の大文字・小文字で公開範囲が決まる |
| Ruby | user_name(スネーク) |
UserService |
MAX_SIZE |
Ruby Style Guide |
| SQL(テーブル・列) | user_name(スネーク) |
― | ― | 大文字・小文字を区別しないDBが多いため、スネークが一般的 |
| CSS(クラス名) | main-header(ケバブ) |
― | ― | BEMなどの命名の方式 |
| URL | /order-history(ケバブ) |
― | ― | 小文字とハイフン |
言語の慣習に合わせることが第一です。JavaでスネークケースやPythonでキャメルケースを使うと、その言語に慣れた人ほど読みにくく感じます。チームの規約がある場合は、それに従います。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「変数名・関数名の付け方|命名規則と言語別のルール」
実践のルール
1. 中身がわかる、具体的な名前にする
# × 何のデータかわからない
data = get_data()
tmp = data["a"] * 1.1
flag = True
# ○ 中身がわかる
order = fetch_order(order_id)
total_with_tax = order["subtotal"] * 1.1
is_first_purchase = True
data・info・tmp・value・result のようなどんな値にも当てはまる名前は、なるべく避けます。
2. 真偽値は「はい・いいえ」で答えられる名前に
| 接頭辞 | 意味 | 例 |
|---|---|---|
is |
〜である | isActive、is_deleted |
has |
〜を持っている | hasPermission、has_coupon |
can |
〜できる | canEdit、can_cancel |
should |
〜すべき | shouldRetry |
// × 何がtrueなのかわからない
if (status) { ... }
if (check) { ... }
// ○ 条件文として自然に読める
if (isPaid) { ... }
if (hasStock) { ... }
否定の名前(isNotValid、noError)は避けます。if (!isNotValid) のような二重否定になり、読み間違いの原因になります。
3. 関数・メソッドは動詞から始める
| 動詞 | 使いどころ | 例 |
|---|---|---|
| get | 値を取り出す(手軽に) | getName() |
| fetch・load | 外部(DB・API)から取得する | fetchOrders() |
| find・search | 探す(見つからないこともある) | findUserByEmail() |
| create・build | 新しく作る | createOrder() |
| calculate・compute | 計算する | calculateTax() |
| is・has・can | 真偽値を返す | isExpired() |
| to・as | 変換する | toJson()、asList() |
| validate・check | 検証する | validateEmail() |
| update・save・delete | 変更・保存・削除する | updateAddress() |
get なのに、実はデータベースに書き込む、のように名前と動きが一致しないのは、最も避けたい状態です。副作用(データの変更や外部への送信)がある処理には、それがわかる動詞を使います。
4. 単位や形式を名前に含める
// × 秒なのかミリ秒なのかわからない
int timeout = 30;
int price = 1000; // 税込?税抜?
// ○ 単位や条件がわかる
int timeoutSeconds = 30;
int priceExcludingTax = 1000;
時間(秒・ミリ秒)、金額(税込・税抜、円・ドル)、長さ(文字数・バイト数)など、取り違えると不具合になる値には、単位を名前に含めます。
5. コレクションは複数形にする
user = users[0] # 1件
for order in orders: # 複数件
...
user_by_id = {1: user} # 辞書は「何から何を引くか」がわかる名前に
6. 省略しない
| 省略した名前 | 省略しない名前 |
|---|---|
usrNm |
userName |
calcTtl |
calculateTotal |
cnt |
count(何の数か:orderCount) |
mgr |
manager |
入力の手間は、エディタの補完で解消できます。読む回数は書く回数よりはるかに多いため、読みやすさを優先します。id・url・html のように、誰もが知っている略語は使って構いません。
7. ローマ字は避け、英語を使う
# × ローマ字は読みにくく、人によって表記が揺れる
uriage = 0 # 売上
shohin_mei = "" # 商品名(shouhin? syohin?)
# ○ 英語にする
sales = 0
product_name = ""
ローマ字は、「shohin」「shouhin」「syohin」のように表記が揺れるうえ、英語の単語と混ざると読みにくくなります。業務の用語をどの英語にするかは、チームの用語集で決めておくと統一できます。
| 業務の用語 | 英語の例 |
|---|---|
| 売上 | sales |
| 受注 | order |
| 請求 | billing、invoice |
| 締め日 | closing date |
| 与信 | credit |
| 取引先 | business partner、client |
8. スコープが広いほど、名前を詳しく
for (int i = 0; i < 10; i++) { ... } // ループの中だけで使う → 短くてよい
private static final int MAX_LOGIN_ATTEMPTS = 5; // あちこちから使う → 詳しく
数行の中だけで使う変数は短くてもわかりますが、クラス全体やプロジェクト全体から使われるものほど、名前だけで意味が伝わる必要があります。
直す前と後:まとめて見る
# 直す前
def proc(d, f):
r = []
for x in d:
if x["s"] == 1 and f:
r.append(x["p"] * 1.1)
return r
# 直した後
TAX_RATE = 0.1
def list_prices_with_tax(products, include_only_on_sale):
prices_with_tax = []
for product in products:
if product["status"] == STATUS_ON_SALE and include_only_on_sale:
prices_with_tax.append(product["price"] * (1 + TAX_RATE))
return prices_with_tax
処理の内容はまったく同じですが、直した後のコードは、コメントがなくても何をしているかがわかります。名前を工夫することは、最も手軽で効果の大きいリファクタリングです。
AIに名前を考えさせるコツ
AIのコーディング支援は、名前の候補を出すのが得意です。
- 処理の内容と、使われ方を伝える:「注文の一覧から、セール中の商品の税込価格を集める関数の名前の候補を5つ」
- チームの規約を伝える:「Javaのキャメルケースで」「業務の用語は、受注=order、請求=invoice」
- 候補の中から選ぶ:AIの候補を、チームの既存の名前と揃うかという観点で選ぶ
プロジェクトのルールファイル(CLAUDE.mdなど)に命名の規約と用語集を書いておくと、AIが生成するコードの名前も揃いやすくなります。
よくある質問
Q. 日本語の変数名は使ってもいいですか? A. 多くの言語で使えますが、入力のしにくさ、他のツールとの相性、海外のメンバーとの共同作業を考えると、英語が一般的です。テストのメソッド名のように、日本語の方が意図が伝わりやすい場面で使うチームもあります。
Q. 名前が長くなりすぎます。 A. 名前が長くなるのは、その変数や関数が多くの役割を持ちすぎているサインのことがあります。関数を分割したり、クラスにまとめたりすることで、短くても意味が伝わる名前にできる場合があります。
Q. 英語の名前がすぐに思いつきません。 A. 辞書やAIで候補を探し、既存のコードやライブラリで使われている言葉に合わせるのが近道です。チームで用語集を作っておくと、毎回悩む時間を減らせます。
Q. 命名規則を自動でチェックできますか? A. できます。JavaならCheckstyle、PythonならRuffやpylint、JavaScriptならESLintで、記法のルールを自動で検査できます。意味の良し悪しはレビューで確認します。
まとめ
- 名前は、他の部分を読まなくても、何なのか・何をするのかがわかるようにする
- 記法は言語の慣習に合わせる(Javaはキャメル、Pythonはスネーク、定数は大文字など)
- 真偽値は is・has・can、関数は動詞から始め、否定の名前は避ける
- 単位・税込税抜などを名前に含め、コレクションは複数形に
- 省略とローマ字は避け、業務の用語は用語集で英語を揃える
- 記法はツールで自動チェック、意味はレビューで確認する
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「変数名・関数名の付け方|命名規則と言語別のルール」
株式会社RJCでは、読みやすいコードを書くことを、チームで気持ちよく開発するための大切な技術だと考えています。こうした知識を仲間と共有しながら、一緒に成長を楽しんでいます。
株式会社RJC ― SI事業・SES事業・AI駆動開発。未経験からエンジニアに育てるのが得意な会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。