コメント戦争

最近「『//コンストラクタ』というコメントは不要だ」という話を見かけたので、ちょっと書いてみました。


まずこのコードを読んでください。

class hoge {
public:
    //コンストラクタ
    hoge();
};

これを読んで、おそらく多くの人が「このコメントは必要ない」と言うでしょう。もし読んだときにそう思わなかった人であっても「このコメントは必要ですか?」と聞けばNoと答えるでしょう。
これがコンストラクタであることは、見れば分かります。なので C++ プログラマは『//コンストラクタ』なんてコメントを書く必要はありません。いえ、書いてはいけません。それはただの雑音でしかないのです。


それを踏まえて、次のコードを見てみましょう。

//CRTP
class hoge : public base<hoge> {
};

これが hoge 自身をベースクラスのテンプレート引数とする、CRTP と呼ばれるイディオムであることはすぐに分かるでしょう。
これが CRTP であることは、見れば分かります。なので C++ プログラマは『//CRTP』なんてコメントを書く必要はありません*1。いえ、書いてはいけません。それはただの雑音でしかないのです。


と、言いたいですが、多分後者の方はあまり納得してもらえないんじゃないかなと思います。
「『//コンストラクタ』は不要だ」と考えている人であっても CRTP について同じことを言ったりはしないでしょう(する人もいるでしょうが)。それは何故なんでしょう。
前者と後者は両方『分かっている人が見れば分かるコード』になっています。単に『分かっている人』の数が、前者は(多分)非常に多く、後者は(多分)そこまで多くないというだけの違いです。


では一般的に多ければコメントは必要ないのかというと、そうではありません。そこでコメントが必要かどうかは、環境によって変わります。
コンストラクタを理解していないような人がいるプロジェクトで(そんな人がいるプロジェクトなんて考えたくないですが)では、それは検索するための手がかりとなるので、書くことが有用であることもあるのです。
そのあたりの背景を考慮せず、単に自分が理解できるからといって「『//コンストラクタ』というコメントは不要だ」と言うのであれば、いざ自分が理解できない複雑で難しいコードに出会ったときにコメントが無かったとしても「何でこのコードにはコメントが無いんだ!」と嘆いてはいけません。それを書いた人/環境にはコメントなんて必要無かったのですから。

*1:「そもそも『//CRTP』なんてコメント書く前に Why を書けよ」とか思うかもしれないですけどそれは今回の話とはあまり関係無い(と思う)