プログラミングで一番難しいのはXXXXX
今回はc++の機能紹介からは少し離れて、プログラミングの命名規則について書こうと思います。
高校の時のコンピューターサイエンスの教師は体育の担当もやっていて、プログラミングはまだ初心者だったせいで、彼の授業は正直あんまり参考にならなくて、内容は殆ど覚えていないのですが、今でも記憶に残っている彼の名言が1つだけあります。
それは
「プログラミングで一番難しいのはネーミング」。
まあ、マジレスすると、マルチスレッドプログラミングやメタプログラミングなど、もっと難しいことは沢山あるのですが、ネーミング、つまり適切な名前の付け方に真剣に取り組むと、その難しさに気づくと思います。
それで、私の個人的な意見を色々書こうと思います。
例えば、最近CheckAndSetParameters
という関数を作ったのですが、よくよく考えたらパラメータのチェックとセットを1つの関数でやっていたのは欲張りすぎていました。関数の名前が長くなったり、And
とか付け始めたら、大体関数に詰め込みすぎていることの表れだったりします。
後、ゲッター関数は全部get
から始まるという規則があると思いますが、本当は Java の命名規則で、C++ らしくないのです。標準ライブラリの関数を見ると、殆ど使われないです。値を返すだけの関数は、get
なしの名前になっています。例えば、大体のコンテナの場合は、以下のような関数があります。
bool empty() const;
size_type size() const;
T* data();
まれに使われる時は、単なる値を返すのではなく、std::unique_ptr
のget
のように内部のデータへのポインタを返したり、std::get
のようにはtuple
の中の値を取り出したり、std::getline
のように入力ストリームから文字を読み込み文字列に格納したりします。
get
はやはり何かを実際にゲットしている意味になるため、値をそのまま返すだけのゲッターの場合は使わないのです。
後、bool
を返す関数はis
から始まるという規則もありますが、臨機応変でいいと思います。 そもそもbool
を返している時点でis
はいらないと思いますが、そこは置いておきましょう。
bool areMultipleUsersLoggedIn() const; // 複数形
bool hasAccess() const; // 持っているかどうか
bool canLogout() const; // できるかどうか
bool wasExecuted() const; // 過去形
bool
を返す関数は大体質問形式になると思いますが、その戻り値を受ける変数は同じ名前にしているのをよく見ます。
const bool isCurrentUserAdmin(isCurrentUserAdmin());
const bool isCurrentUserLoggedIn(currentUser.isLoggedIn());
同じ名前の方が分かりやすいのは分かりますが、これだと質問のようになっていて、関数のように見えます。
関数が質問でしたら、その戻り値は答えなので、質問形式はおかしいと思います。
個人的に、if
文の条件として使う時に、一番違和感があります。
if (isCurrentUserAdmin && isCurrentUserLoggedIn)
答えのような名前にすれば、if
文で使う時にしっくりきます。
const bool currentUserIsAdmin(isCurrentUserAdmin());
const bool currentUserIsLoggedIn(currentUser.isLoggedIn());
if (currentUserIsAdmin && currentUserIsLoggedIn)
{
...
}
If current user is admin and current user is logged in
になるため、そのまま普通の英文になっていて、非常に分かりやすいと思います。
もちろんネーミングには正解がなく、様々なガイドラインがあり、人によって違うと思います。まあ、ここまでくると、もう何でもいいや!ってなるかもしれませんが、ネーミングについて真剣に考えると、やはりかなり難しいのです。一番難しい、は言い過ぎかもしれないですが。
Discussion