こんにちは、高木です。

前々回前回と母国語を使ったプログラミング、具体的には識別子の命名について考えてきました。これまではどちらかというと一般論でしたので、今回は少し対象を絞って考えていくことにします。オブジェクト指向言語におけるクラスとそのメンバーの命名についてです。

クラス名

一般論として、クラス名を母国語で命名することは問題ありません。ただし、クラス名はプログラミング言語やフレームワークでルールが設けられていることも多いと思います。そういう場合は、無理矢理母国語で命名するより、「郷に入っては郷に従え」ということで英語で命名した方がいいでしょうね。

逆に、そのような縛りがないのであれば、母国語での命名を検討してみてもいいと思います。

メンバー名

メンバー名もクラス名と同じで、一般論として母国語で命名することは問題ありません。こちらもプログラミング言語やフレームワークによる縛りがあるなら、それに従っておいた方がいいでしょう。

母国語での命名をどうしても断念しないといけないケースとしては、英語で命名された基底クラスやインターフェースのメソッドやメンバー関数をオーバーライドが挙げられます。これは元と同じ名前を付けざるを得ませんので、避けることはできません。

オーバーライドほど厳しくはありませんが、たとえばC++では、コンテナの要件として、特定の名前のメンバー関数やクラス有効範囲で定義する型が規定されています。そうした要件を満たすためには英語で命名する以外にはありません。そのような場合も素直に従った方がいいでしょう。

同じクラスの中で、英語で命名したメンバーと母国語で命名したメンバーが混在することがあると思います。そのような運用を許容するかどうかは議論が分かれるところです。私は個人的にはありだと思っていますが、少なくとも美しくないことは間違いありません。どのような方針にするかは、よく考えて決めた方がいいでしょうね。

非公開メンバーの命名について

publicやprotectedなどを指定してクラス外に公開するメンバーの場合、いろいろなしがらみがあって英語で命名せざるを得ないケースが多いと思います。逆にいえば、クラス外に公開しないメンバー、つまりprivateなメンバーであれば、そうしたしがらみの影響を受けることがほとんどないため、自由に母国語で命名できるのではないでしょうか?

privateメンバーだけを母国語で命名するルールにしておけば、英語と母国語が混在することによる“美しくない”問題を最小限に抑えることができるでしょう。

仮引数やローカル変数

仮引数やローカル変数もしがらみの影響を受けることがあまりないと思います。むしろ、仮引数やローカル変数こそ、真っ先に母国語で命名すべき識別子なのかもしれません。

ここでいう仮引数とは、関数やメソッドの仮引数だけではなく、テンプレートやジェネリクスの仮引数も含んでいます。

コンセプト

C++のコンセプトも母国語で自由に命名して問題ないと思います。コンセプトは複雑な概念を表現しないといけないことが多いので、むしろ積極的に母国語を使った方がいいでしょうね。

ファイル名

ファイル名は直接クラスとは関係ありません。ただし、Javaのようにクラスメイト密接に関連しているプログラミング言語もありますし、それ以外でもクラス名とそれを定義するファイル名を同一にするケースが多いはずです。

プラットフォーム間の移植性やバージョン管理システムの制約などもあり、ファイル名にASCII以外を使うとトラブルの原因になることが多いようです。これも一種のしがらみですね。

クラス名とファイル名が密接に関連している場合は、クラス名もファイル名も英語で命名せざるを得ないと思います。Javaの場合、publicなクラス名だけではなく、アクセス修飾子がないクラス名やインナークラスも.classファイルが生成されますので、やはり英語で命名せざるを得ないでしょう。JVMを利用する他の言語も同様です。

クラス名とファイル名が直結しない場合には、クラス名とソースファイル名が一致しなくなる問題さえ許容できるのであれば、(他のしがらみがなければ)クラス名に母国語を付けることができるでしょう。ソースファイル名はASCIIの範囲で命名すべきです。