multiplus

気まぐれに書評とか。

『リーダブルコード』

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

プログラミングのお作法的な本。でも、「リファクタリング」とは違う。リファクタリングとは、要するに「同じ動作をさせたままでコードの構造を変えること」。しかし、リーダブルコードで扱われている話はちょっと違う。コードの構造を変えるというより、コードの与える可読性を高めるというのが本書の手法だと思う。

一度でもチームを組んで、何かプロジェクトを回したことのある人なら、「他人が読みやすいコードを書くこと」の重要性が痛いほどわかるはず。なぜなら、わかりにくいコードを他人に書かれ、その修正を依頼されたときの怒りたるや、とてつもないものがあるからです(笑)。残念ながら、私も何度かそのようなコードをレビューする機会があって、イライラで発狂しそうになりました。

これは、比較的ロジックが簡単なHTMLやCSSの領域でも起こる話ですから、CやJavaなど、より高度な技術を必要とする言語を扱う際には致命傷になりかねません。そのくらい、読みやすいコードを書くというのは大事な作業なのです。

可読性とは

具体的に可読性の高いコードと低いコードを読み比べれば分かる話です。まずは、CSSから。

body {margin:0;padding:0;background:#eee;}
p{margin-bottom:1.5em;padding:5px;}

これを見た瞬間、私なんかはとりあえず一言叫びます。「fxxxxxxk」!!!

とにかく、読みづらいんですね。読みづらさはどこにあるか。それは、いちいち目を横に動かさなくちゃいけないということ。コードは上から下へ読むものですから、速読の際もできるだけ横の無駄な動きをせずに読み取りたいわけですね。しかーし。このコードは横に読まなければならない。。。改善するなら次のとおりになるでしょう:

body {
        margin: 0;
        padding: 0;
        background: #eee;
}

p {
        margin-bottom: 1.5em;
        padding: 5px;
}

はい、これで横に目を動かすことなくコードを読めるようになったはずです。すなわち、コードの速読が可能になりました。

変数には意味をきちんともたせよ

ほかにも、こんな例がありえますね。大学のJavaの教科書を例にひとつ。

import java.io.*;

public class leapYear {
    public static void main(String[] args) throws IOException {
           int y;
           System.out.print("year = ");
           
           BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
           y = Integer.parseInt(br.readLine());

           if (((y % 4) == 0) && ((y % 100) != 0) || ((y % 400) == 0)) {
                System.out.println("a leap year");
            } else {
                System.out.println("not a leap year");
            }
    }
}

まあ、1つの要件を満たすだけのプログラムなので、この状態ならわからなくはないんですけど、何個も要件を満たす必要が出てくるとこれじゃわからなくなります。なぜか。「y」という変数の名前の付け方に問題があるからです。yieldの「y」なのか、はたまたyepの「y」なのか。普通に「year」と書くべきでしょうね。(あと、brってなんだよ、brって。改行のbr?)

こういう例って、初心者のうちは結構やりがちで、どうしても入力が面倒くさいから「year」と書かずに「y」と書いちゃうんですけど、プロジェクト単位でそれをやられちゃうともう、悲惨なことになります。

もっとも、これは大学の教科書の話で、しかも初心者向けの本なのでこう書かざるを得ないという事情もあるかと思いますが。

import java.io.*;

public class leapYear {
    public static void main(String[] args) throws IOException {
           int year;
           System.out.print("year = ");
           
           BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
           year = Integer.parseInt(input.readLine());

           if (((year % 4) == 0) && ((year % 100) != 0) || ((year % 400) == 0)) {
                System.out.println("a leap year");
            } else {
                System.out.println("not a leap year");
            }
    }
}

本書は、そういった悲惨な自体を起こさないために必要なことが大量に書かれた、「予防接種」のようなものでしょう。ぜひ、一読しておくべき本だと思います。