13-コードレイアウトの重要性

プログラマが知るべき97のこと」の13個目のエピソードは、ソースコードの可読性に関する話です。

プログラマは仕事の時間を、実際にコードをタイプするよりも、コードを探すことと読むことに費やしている、そんな調査結果もあるようですー修正すべき箇所はないか、あるとすればどこか、それを確認する時間の方が長いということです。

プログラマは実に多くのコードを読みます。また、同じ量のコードを読むのであれば、読みやすいコードと読みにくいコードでは同じ能力のプログラマであっても生産性に違いが出ることは自明です。つまり、ソフトウェア開発の生産性や品質を高めるには可読性が最重要項目の1つです。
エピソードでは可読性を高くするために必要な3つの項目について述べられています。
1つめは「目立たない部分を作る」ことです。人間はパターンマッチングを得意とするため、似たようなコードは背景のように見えるようになり、結果として重要な部分が目立つということです。例えば、Javaではpublicメソッドの引数チェックは定型的なコードになるでしょう。自分は何時もこのように記述します。

public String format(String text) {
  if (text == null) throw new IllegalArgumentException("text == null");
  // ドメイン関連する処理
  return result;
}

すると同じようなコードを見ていくうちに、if - Illgal というイメージでそこは「偶発的複雑性」の部分、すなわち処理の重要な部分ではないような認識をすることになります。これは気がつかないうちにやっているものですね。このようにコーディング標準を作成し、コードを似たような形にすることは可読性には深い関わりがあります。自由に書く事が美徳になってしまうと個性は出ますが、トレードオフとして可読性は失われるでしょう。
2つ目として「レイアウトに語らせる」と述べられています。コードのレイアウト、例えば2次元配列を宣言する場合にコードフォーマッターを絶対視すると上手くレイアウトさせるのが難しい事があります。

int[][] matrix = new int[][] { { 1, 2, 3, 4, 5, 6 }, { 1, 2, 3, 4, 5, 6 }, { 1, 2, 3, 4, 5, 6 },
      { 1, 2, 3, 4, 5, 6 }, { 1, 2, 3, 4, 5, 6 }, { 1, 2, 3, 4, 5, 6 } };

次のようにフォーマットできればいいですが、全ての箇所に万能なフォーマットの設定は困難です。

int[][] matrix = new int[][] {
  { 1, 2, 3, 4, 5, 6 },
  { 1, 2, 3, 4, 5, 6 },
  { 1, 2, 3, 4, 5, 6 },
  { 1, 2, 3, 4, 5, 6 },
  { 1, 2, 3, 4, 5, 6 },
  { 1, 2, 3, 4, 5, 6 }
};

ならば手で調整すればいいのです。コードフォーマッタは便利ですが、束縛されては害になります。
3つ目としては「コンパクトにまとめる」ことです。IDE全盛の今ではスクロールしないでメソッドが見渡せるのがちょうど良いという話はよく耳にします。短すぎず適切な長さにすることで、よりコードが読みやすくなり、生産性も高まるのです。
可読性の高いコード、すなわち美しいコードというのは雄弁に語りかけてきます。今はオープンソースとしてたくさんのコードが公開されており、幾らでもタダで読むことができます。可読性の高いコードを多く読み、可読性の低いコードは何が原因かを考えていくことで、自分のコードの質を高めるべきです。
ちなみに、自分が一番おすすめするJavaの美しいコードはSlim3です。シンプルさを追求している点、機能も複雑ではないためコード量も多すぎない、GAEの勉強になると、最高の教材です。GAEに興味が無くとも、FrontControllerやHotDeployのコードはJavaエンジニアならば一読の価値があると思います。

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

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