変数名は「AIにレビューさせろ」Part1を公開したのですが、同時にAIから
「これは初心者向けの記事ではないのでは?」
と散々、指摘を受けたので初心者とスクールで教えようとしている方向けに補足を行います。どちらが最初でも構いませんが、初心者の方は本記事を最初に読んだ方がよいかもしれません。
初心者の方
例えばですが、Google C++ スタイルガイドや、Linux Kernel 2.6 Documentation- CodingStyle を参照してみてください。変数名の記載の項目になります。
何を言っているかわからないかと思います。それが答えです。
という、哲学的な問答はやめてストレートに言いますと、「まったくの初心者の方は、まずはプログラミングの書き方を学習するべきであり、コーディングスタイル(変数の命名だけでなく、あるべきコードの書き方の基準)は、後回しにしてもかまわない」ということになります。つまり今は考えなくてよい(もし気になるのならAIに聞け)ということになります。
それでも、気になる方はもう一度Google C++スタイルガイドの「命名規則」を読みましょう。引用しますと、
・命名に関するスタイルルールはかなり恣意的なものです
・あなたにとってわかりやすいと感じるかどうかに関わらず、「ルールはルール」と考えるようにしてください。
ということです。これの意味するところを大げさにかくと、「変数名は「AIにレビューさせろ」Part1」の記事になります。
加えて、日本人に対する補足を行います。(通訳案内士の観点になりますが)、日本人というのは「言われなくても規律を守る」民族のようで、一方で欧米(というか民主主義の国の人は)、「自由が基本、必要ならルールを作る」という文化的な違いがあります。主にアメリカからくるルールを日本人に当てはめると、必要以上に日本人が守りすぎるという傾向があるので注意しましょう。という話です。
初心者から脱しようという方
上記の2つのスタイルガイドをみて、「言っていることは解る」という人はもう、命名規則については卒業ということになります。
「これでは不安」だという方は、一つ卒業試験をしましょう。上記の2つのスタイルは真逆のことを言っている部分がありますがどれでしょうか?
私が見つけた正解の1つは、
Linux Kernel 2.6のコーディングスタイルは、変数名の省略を許容しており、Google C++の方は許容していないということがあります。
(もっともどちらのスタイルもループカウンタは i でよいとしています)。
私の観点(理解)になりますが、これらの違いを補足すると、カーネルは基盤ソフトウェアで、Googleが作ろうとしているものはアプリケーションということも言えます。
コーディングの文化というか、作成しているもののレイヤーが異なります。
例を挙げると、変数の値を交換する swap関数 というものがありますが、Linuxの方は、swap関数を作る方、Googleの方は、swap関数を使う方ということです。
swap関数を C言語風に 書くと
void swap( int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
となるかと思います。ここで、a,b,tと出ましたが、これに対して「変数名が、意味のない1文字だろ!」という人は(0ではないかと思うが)私の周りではいません。逆にここで変数名に対してとやかく言う人とは距離をとった方がよいです。(実は変数名以外には問題があります)。
一方で、Googleの方は、swap関数を使う側、例えば、
swap( oldMachineStatus, newMachineStatus);
と言ったコードにフォーカスを当てているということになるかと思います。
言っていることは解るが釈然としない(初心者の方)
コードコンプリートやリーダブルコードなど実績のある書籍を読むことをお勧めします。
「1文字変数はダメ。booleanは○○。」と言ったような断片的な情報ではなく、「なぜこのように命名すると良いのか?」についてできるだけ主観を抑える努力を用いて書かれているでしょう。
また、上記のようなスタイルガイドも併せて読むことを勧めします。書籍やガイドによって矛盾点が見つかります。それに対して『自分はどうするか?』と自問してみましょう。
2026年現在確認できる多くのコーディングスタイルでは、ループカウンタには i でよいとしていますが、意味のある名前にしましょうという書籍もあるようです。「○○にこう書いてある」ではなく、あなたの正解を見つけてみましょう。
「能書きはいいからお前はどうしているんだ?」という方
(Grokの指摘を受けての追記)私自身ですが、アマチュア時代を入れると40年以上プログラミングをやっており、使った言語も、BASIC、アセンブラからC/C++、Java、perl, php, Ruby、python, ADPと多岐にわたるので、「これ」と言った基準はないです。と言っても傾向はあるのでご紹介します。基本的にlinuxのコーディングガイドが近いかもしれませんが、業務アプリも作成するので混ざっています。下記を見てもらえますと私が「1文字変数はNG」、「booleanはis/has」と言われると反発する理由が良くわかるかと思います。
- 慣例、ルールがあればそれに従う。自分で作る場合は英語で名称を考える。
- 名前付けの優先順位
グローバル変数、メンバ変数、引数、ローカル変数の順で優先順位が下がる(適当な名前でよい)
グローバル関数名、クラス名、メンバ関数名の順で優先順位が下がる
※名前空間は今のところ使用していないが、徐々に意識するようにしたい。 - 変数名は名詞が基本、もちろん内容によって形容詞、動詞を使うこともある。
- 関数名、メソッド名は動詞が基本、以下同様
- クラス名は、名詞が基本、以下同様
- 1文字2文字変数については、ローカル変数で慣用的に使うことがある
a, b, c ・・・抽象的な値を表現するとき
v1, v2, v3 も同様に抽象的な値を表現するとき
c, cnt ・・・ ループカウンタ
f, flg フラグ
i, j, k, l, m ・・・ループインデックス
n ・・・ (next)の略
p, q ・・・ ポインタ
s ・・・ 合計
t ・・・ テンポラリ変数、時間(秒)
k / v ・・・ (マップの)key value
u ・・・ ユーザID
r ・・・ 戻り値
x, y, z ・・・ 座標 - 略称、非略称
DBのカラム名、グローバル変数、グローバル関数、クラス名のようにグローバル性が高い名称は非略称、その他は適宜略称を使う - 単語の区切り
複数の単語を区切るときの作法として、キャメルケースを使うか(区切りで大文字にする)、スネークケース(アンダーバー’_’で区切る)かがある。
モダンな言語(Java以降)はキャメルケース
アセンブラ,C,C++は、スネークケース
グローバル変数、グローバル関数、クラス名はキャメルケース、ローカル変数、メンバ変数はスネークケースと混ぜて使うこともある。
略称変数の場合、そのまま結合することやプレフィックス、ポストフィックスとして使うこともある。
nsatatus
namep - 業務アプリの例はPart2を見てもらえればと思います。
実践
さらに、実際のコードがどうなっているかを調べることも重要です。
以下、Linux kernel 6.18.3 で適当に選んだファイル(acct.c)からの変数名(と引数名)を出現順で10個を列挙します。
acct
sbuf
p
ns
res
pin
work
acct
file
name
私には大変馴染み深い名称ですが、皆様どうでしょうか?
これだけだと何なので、同プロジェクトから適当に選んだpythonのファイル(check-perf-trace.py)からの変数名(引数名)を10個ほど列挙します。
event_name
context
common_cpu
common_secs
common_nsecs
common_pid
common_comm
common_callchain
vec
call_site
理解できるかはともかく、分かりやすい名前になっているかと思います。