🧊

プログラミングで一番難しいのはXXXXX

に公開

今回はc++の機能紹介からは少し離れて、プログラミングの命名規則について書こうと思います。
高校の時のコンピューターサイエンスの教師は体育の担当もやっていて、プログラミングはまだ初心者だったせいで、彼の授業は正直あんまり参考にならなくて、内容は殆ど覚えていないのですが、今でも記憶に残っている彼の名言が1つだけあります。
それは

「プログラミングで一番難しいのはネーミング」。

まあ、マジレスすると、マルチスレッドプログラミングやメタプログラミングなど、もっと難しいことは沢山あるのですが、ネーミング、つまり適切な名前の付け方に真剣に取り組むと、その難しさに気づくと思います。
それで、私の個人的な意見を色々書こうと思います。

例えば、最近CheckAndSetParametersという関数を作ったのですが、よくよく考えたらパラメータのチェックとセットを1つの関数でやっていたのは欲張りすぎていました。関数の名前が長くなったり、Andとか付け始めたら、大体関数に詰め込みすぎていることの表れだったりします。

後、ゲッター関数は全部getから始まるという規則があると思いますが、本当は Java の命名規則で、C++ らしくないのです。標準ライブラリの関数を見ると、殆ど使われないです。値を返すだけの関数は、getなしの名前になっています。例えば、大体のコンテナの場合は、以下のような関数があります。

bool empty() const;
size_type size() const;
T* data();

まれに使われる時は、単なる値を返すのではなく、std::unique_ptrgetのように内部のデータへのポインタを返したり、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になるため、そのまま普通の英文になっていて、非常に分かりやすいと思います。

もちろんネーミングには正解がなく、様々なガイドラインがあり、人によって違うと思います。まあ、ここまでくると、もう何でもいいや!ってなるかもしれませんが、ネーミングについて真剣に考えると、やはりかなり難しいのです。一番難しい、は言い過ぎかもしれないですが。


|cpp記事一覧へのリンク|

Discussion