17-コードに書けないことのみをコメントにする

プログラマが知るべき97のこと」の17個目のエピソードは、16-コメントに関するコメントに引き続きコメントに関する話題です。「読む人にとっって価値がある」コメントのみを書くべきだという点は16「コメントに関するコメント」と同様です。こちらのエピソードでは、コメントの重要性には言及しながら、さらに一歩踏み込んで「コード自身に語らせる」ようにすることが語られています。
16のエントリーでも書きましたが、コメントが怪しいコードの消臭剤として利用されるケースがあります。これはリファクタリングにおける「不吉な臭い」の1つとして「リファクタリング」で紹介されているアンチパターンです。リファクタリングは、長すぎるメソッド・深いネスト・解りにくい名前など美しくないコードを、様々な手法を使って改善する為の手法です。リファクタリングを実践する事で、適切な名前を付けたメソッドに分割することで、一見では解らないifの条件式を美しく抽出することができます。この時、コードの構造が変わるわけですが、同時にコメントの持つ意味が変化することに気付きます。
例えば次のようなコードがあったとします。

  {
    // 商品が欲しいものリストに含まれている場合、
    if (user.getWishList().contains(item)) {
      buy(item);
    }
  }

このコード自体は正しく動作すると思いますが、美しくはありません。メソッドの抽出のリファクタリングを適用します。

  {
    // 商品が欲しいものリストに含まれている場合、
    if (containsWishList(user, item)) {
      buy(item);
    }
  }
  
  private boolean containsWishList(User user, Item item) {
    return user.getWishList().contains(item));
  }

メソッドの抽出により、コメントはメソッド名「containsWishList」と同じ意味になります。つまり、次のような「ノイズ」コメントと変わりました。

// x に10を代入する
int x = 10;

このコメントはメソッドのAPIコメントとして残しても良いかもしれませんが、重複して同じ事を何度も言う必要もないでしょう*1。思い切って消すとこうなります。

  {
    if (containsWishList(user, item)) {
      buy(item);
    }
  }
  
  private boolean containsWishList(User user, Item item) {
    return user.getWishList().contains(item));
  }

コメントがなくなり随分とスッキリしました。このように美しいコードを書くためにはリファクタリングが必要不可欠なスキルです。リファクタリングは少しづつ簡単に学べるスキルです。
通常、コメントは複雑な部分や解りにくい部分に記述されます。つまり、リファクタリングできる箇所であるという事です。リファクタリングをして適切な責務のクラスやメソッドに分割していくことでコメントの量は自然に減ってきます。すると、コメントが少なくても読みやすいコードになっていくのです。コードは自然に語り出すことはありません。プログラマが愛情をこめて育てることで語り出すのです。

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

リファクタリング―プログラムの体質改善テクニック (Object Technology Series)

  • 作者: マーチンファウラー,Martin Fowler,児玉公信,平澤章,友野晶夫,梅沢真史
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2000/05
  • メディア: 単行本
  • 購入: 94人 クリック: 3,091回
  • この商品を含むブログ (312件) を見る
プログラマが知るべき97のこと

プログラマが知るべき97のこと

*1:日本語なので理解しやすいのかもしれませんが、メンテナンスするコストが発生しますのでトレードオフ