日本語コメントは平気で書くのに、日本語変数名は書かない — C# 命名規則の「当たり前」を疑ってみた
ある日、自分が書いたコードを読み返していて、妙なことに気づいた。コメントは全部日本語なのに、変数名だけ英語(かローマ字)になっている。「// 残業手当を計算する」と書いた次の行に decimal overtimeAllowance = ... と書いてある。この非対称さ、おかしくないか?
コメントと変数名、どっちが「説明」か
コメントは「コードに対する説明」で、変数名は「値に対する名前」だ。でも、役割を考えると両方とも「読む人に意味を伝えるもの」であることに変わりはない。
こんなコードを想像してほしい。
// 基本給を取得する
decimal basicSalary = GetBasicSalary();
// 残業時間を取得する
int overtimeHours = GetOvertimeHours();
// 残業係数(法定割増率: 1.25倍)
decimal overtimeRate = 1.25m;
// 残業手当を計算する(基本給 ÷ 月間所定労働時間 × 残業時間 × 残業係数)
decimal overtimeAllowance = basicSalary / 160m * overtimeHours * overtimeRate;
コメントがないと読めない。つまりこのコード、英語だけでは意味が伝わらない状態になっている。それなのに「コードは英語で書くもの」というルールだけは守られている。なんか変じゃないか、という話だ。
日本語変数名にしたらどうなるか
同じロジックを日本語変数名で書き直すとこうなる。
decimal 基本給 = GetBasicSalary();
int 残業時間 = GetOvertimeHours();
decimal 残業係数 = 1.25m;
decimal 残業手当 = 基本給 / 160m * 残業時間 * 残業係数;
コメントがなくても読める。計算式を見ればそのまま意味がわかる。コメント4行がなくなってコードが半分の行数になった。
「でもコメントがないのは怖い」という感覚、わかる。ただそれ、コメントへの依存心がそう言わせてるんじゃないかなと思う。コメントがないと読めないコードを書いてしまっているから、コメントが必要なんであって、コード自体が読めるなら最初からコメントはいらない。
「コードは英語」という思い込みの出どころ
プログラミング言語はほぼ全部英語ベースで設計されている。キーワード(if、while、class)は英語だし、標準ライブラリのメソッド名も英語だ。だから「コードを書く=英語を書く」という感覚が自然に身についてしまう。
でも、それはあくまで言語仕様の話であって、「自分が定義する識別子も英語でなければならない」というルールではない。C# の言語仕様は Unicode 識別子をサポートしており、漢字・ひらがな・カタカナの変数名・メソッド名は完全に合法だ。「コードは英語」は慣習であって、文法ではない。
慣習を守ることには意味がある。チームの共通言語を統一するとか、OSSとして公開するとか、英語圏の開発者と協働するとか。ただ、「なぜ英語にするのか」の理由を考えずに守り続けているなら、一度くらい疑ってみてもいいんじゃないかと思う。
コメントが多いコードは「英語だけでは読めない」証拠
ここで少し意地悪な見方をすると、日本語コメントをたくさん書いているコードはすでに「英語だけでは意味が通じないコード」になっている。コメントを抜いた状態で渡したら、日本語を知らない英語圏のエンジニアには読めない。それなのに「変数名だけは英語」という部分的なルールを守っているのは、半端な妥協に見えなくもない。
どうせ日本語チームの日本語プロダクトなら、いっそ変数名も日本語にして統一したほうが一貫性があるんじゃないか。そういう考え方だ。
じゃあ何を基準に使い分けるか
日本語変数名を「常に使え」と言いたいわけじゃない。使う・使わないの判断基準は「誰が読むコードか」と「どのドメインか」の掛け合わせだと思っている。
| 状況 | 変数名の推奨 | 理由 |
|---|---|---|
| 社内ツール・業務計算ロジック(日本語チーム) | 日本語でもOK | 仕様書との1対1対応が読みやすさに直結する |
| 汎用ライブラリ・OSS公開コード | 英語一択 | 国際的な読者を想定する必要がある |
| 英語圏のエンジニアと協働する開発 | 英語一択 | チームの共通言語が英語 |
| フレームワークの命名規則に従う必要がある箇所 | 英語 | 規約との一貫性を優先する |
ポイントは「日本語コメントをたくさん書かないと読めないコード」になっているなら、一度日本語変数名を試してみる価値があるということだ。コメントが減ってコードが短くなるなら、それは読みやすさが上がったサインかもしれない。
コメントの役割を考え直す
「コメントはWHYを書くもの、WHATは変数名が語るもの」という原則がある。「// 残業手当を計算する」というコメントはWHATを書いている。変数名が 残業手当 なら、そのコメントはいらなくなる。
コメントが残るべき場所は「なぜこの計算式なのか」「なぜ160で割るのか(月間所定労働時間の想定値だから)」という背景の説明だ。英語変数名 + 日本語コメントでWHATを説明しているより、日本語変数名でWHATを自明にしてコメントでWHYだけを書く構成のほうが、情報密度が高い。
decimal 基本給 = GetBasicSalary();
int 残業時間 = GetOvertimeHours();
decimal 残業係数 = 1.25m; // 労働基準法37条の法定割増率(月60時間以下の時間外労働)
decimal 残業手当 = 基本給 / 160m * 残業時間 * 残業係数;
このコードのコメントは1行だけど、その1行は「なぜ1.25なのか」という本当に必要な情報だけを語っている。
まとめ
- 「日本語コメントは書く、日本語変数名は書かない」という非対称さは、慣習の思い込みから来ている
- コメントをたくさん必要とする英語変数名より、コメント不要の日本語変数名のほうが情報密度が高い場合がある
- C# は Unicode 識別子をサポートしており、日本語変数名は言語仕様として合法
- 使い分けの基準は「誰が読むコードか」と「どのドメインか」
- コメントはWHYだけに絞り、WHATは変数名に語らせるのが理想
実際に C# の業務計算ツールで日本語変数名を試した体験についてはこちらの記事もあわせてどうぞ。