Hatena::ブログ(Diary)

土屋つかさのテクノロジーは今か無しか

2017-05-19

「正しく書かれたソースコードにコメントは必要ない」なんて幻想だという話

土屋はプログラマの中でもかなりコメントが多いタイプだと思っています。理想を言えばコード1行ごとにコメントを書きたいくらいです(本当は、識別子を全部日本語で書きたいと思っているのですが、これはまた別の話)。

 これは土屋がPDL(Program Design Language https://www.gamedev.net/resources/_/technical/general-progra... )開発スタイルの薫陶を受けているからなのですが、それとは別に「そもそも日本人には英語ベースのソースコードを高速に読解するのは無理がある」と考えているからです。

 また、より本質的な課題があると思っていて、プログラミング業界的には「コードがドキュメントであるべき(≒正しく実装されたコードであれば、コメントは最低限になる)」という風潮がありますが、土屋は、これはプログラマが夢見る幻想に過ぎず、「本質的に、コードはドキュメント足り得ない」と考えています。

 例えば以下のようなコードがあったとして、

if (alpha < 1.0f){
 //処理A
}

 処理Aが実行される条件が「alphaが1.0fより少ない場合」なのは自明です(なのでそれをコメントで書く必要はない)。
 けれど、「「alphaが1.0fより少ない」とはなんなのか」は、このコードには書いてありません。そのような、コードには現れない「意図」のコメントが必要だと考えています。

 例えば以下のようにコメントを書けば、条件判定の意図が明確化できます。

//フェードインが未完了の場合
if (alpha < 1.0f){
 //処理A
}

 上記は極端な例ですが、実際にコードを書く時にはこのようなプリミティブな処理を記述することが大変多く、3日前に書いた数式の意図を実装者が思い出す所からコーディングが始まる無限地獄を回避する為には、このようなコメントが必要なのです。

 逆に言えば、「正しいコメント」を書く技術というのがあり、その習得は難易度が高いと言えます(上の条件に「alphaが1.0fより少ない場合」とコメントしてあったら「それは見ればわかるだろ!」と叫びたくなる)。

fukkenfukken 2017/05/19 22:13 その場合、
var isFadeinCompleted = alpha >= 1.0f;
とするべきです(Fowler「説明用変数の導入」)。あるいはis...を関数としてもよい。
「alphaが1以上である」と「フェードインが完了している」は、同じ意味だとしても関心事の詳細度が異なります。
Fowlerが紹介したKent Beckによるテキストエディタのコード
function hilight( area ){
reverse( area );
}
が有名ですね。コンピュータにとっては完全に無意味なコードですが、「ハイライトする」ことと「領域を反転表示する」ことは別である(前者が意図であり、後者は実装詳細である。後者は呼び出し側から隠蔽されねばならない)という意図を持つコードです。
「コメントは不要である」という場合は、普通はこのような実装を行うことを前提としています。

fukkenfukken 2017/05/19 22:15 なお、「意図」を示すコードが時に必要になる、という点は否定しません。
「シンプルに書くと(a+b)/2に過ぎないけど、桁溢れ防止のためにややこしい書き方をしているよ」みたいなケースは多々あるからです。

fukkenfukken 2017/05/19 22:16 「意図」を示すコード > 「意図」を示すコメント、のミス。

t_tutiyat_tutiya 2017/05/19 22:25 >fukkenさん
コメントありがとうございます。実は下書きの段階では条件をメソッド化したパターンも書いていたのですが「自分ではここはメソッド化しないな」と思い削っていました。その理由はまだ言語化できないのですが、仮に

if(フェードインが完了している)

と、識別子をマルチバイトで書ける環境ではメソッド化するかもしれません(これはまた別の話ですが)。
ツイッター上でも同じ指摘を頂いたので、後日こちらについて補足記事を書こうと思います−。

katsukatsu 2017/05/21 15:00 ”「正しく書かれたソースコードにコメントは必要ない」なんて幻想だ”に激しく同意します。

プログラムに、ルールは記述されていません。
ルールはプログラムの外側にあり。
プログラムには、ルールに従った行動しか書かれていないからです。

心情が書かれていないシナリオに同じです。

 「こんにちは」

 怒りながら「こんにちは」

の違いです。

セリフを重ねれば、心情は表現できます。
ですが、読み解くには、時間が多く必要です。
一言、ト書きで心情が書かれていれば、時間は少しで済みます。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証