深いネストは忌むべき

Zen of PythonPython以外の言語であっても私がコードを書くときの指針である。

その一つに、

Flat is better than nested.

という文句がある。深いネストはコードの可読性を著しく落とす。スクリーンの右のほうに文字が寄っているコードは大変読みづらい。特にJavaはネストが深くなりがちなので要注意だ。

public class Foo {
    static private class Bar {
        int var;
        void method_spam() {
            synchronized (this) {
block:          {
                    if (var > 0) {
                        try {
                            for (int i = 0; i < 10; i++) {
                                if (method_egg()) {
                                    break block;
                                }
                            }
                        } catch (Exception e) {
                        }
                    }
                }
            }
        }
    }
}

このような}が数多く並ぶようなコードは読みたくない。人間は深いネストを見て、何処のブロックにいるか把握できるほど賢くない。汚いコードをバグなく書ける人はいない。

上のコードを綺麗にするとしたら、以下のようにするだろう。

public class Foo {

}

class Bar {
    int var;
    synchronized void spam() {
        if (var <= 0) {
            return;
        }
        for (int i = 0; i < 10; i++) {
            boolean b = false;
            try {
                b = egg();
            } catch (Exception e) {
                return;
            }
        }
    }
}

内部クラスは使わない。パッケージプライベートで十分カプセル化できていると考える。

synchronizedメソッド全体に与える。もちろん部分的にsynchronizedにできるものをサボって大きいブロックにするのは禁止だ。synchronizedにしたいブロックが機能的に意味のある単位ならメソッドにして名前を与えたほうが良い。

if文の中で処理をするのは良くない。処理をしない場合を条件で弾く方が分かりやすい。

tryのブロックが大きいのも良くない。try-catchはできるだけ小さい単位で行うべきだ。

ラベル付きのbreakは多重ループを抜けるとき以外使わない。Javagotoがない意味を考えて欲しい。推奨されていないからだ。


読めるコードを書こう。読めないコードと読まない仕様書より、読めるコードの方が価値がある。そしてコードを読む人を増やそう。

パーフェクトPython

パーフェクトPython