日々常々

ふつうのプログラマがあたりまえにしたいこと。

nullを安易に使わない

ツイートのままなんだけど。


メソッド呼んでリスト貰ってforでぐるぐる回す、なんてことはよくやります。全件処理するためにforループなんて何時代だ こほん……こんな感じ。

List list = hoge();

for (Object str : list) {
    // 何らかの処理
}

で、hogeを覗いてみたらこんな実装だったり。

List hoge() {
    List list = new ArrayList();

    // 何らかの処理

    if (list.size() > 0) {
        return list;
    } else {
        return null;
    }
}

これでめでたく、最初に書いたコードはNullPointerExceptionになるわけです。馬鹿じゃないの。


(なんか最近聞かない気もしますけど)防御的プログラミングってのがあります。例えばこんな風に、引数に変なものが来た時に即例外を投げるのとかがよくあります。

void method(Object arg) {
    if (arg == null) throw new IllegalArgumentException("引数が変");

    // 後は安心して引数を使う処理が書ける
}

目的は、変な動きをしそうな悪事の芽を早めに摘むこと。

冒頭の例は防御的プログラミングとして、hogeの戻り値に対してnullチェックを行うことも出来ます。それが常識だってところもあるかもしれません。個人的には無しです。安易にnullを使っちゃいけない。もし空になるのが異常ならhogeが例外を投げるべきかもしれないし、そうでないなら空リストを返して、呼び出し側に判断を委ねるべきじゃないかなと。

仲間内で過剰に防御し合う、誰も信じられないとでも言うような疑心暗鬼なコードを書いてどうするんだとか思ったりします。挙動がよくわからない外部のものを使うなら理解出来ますが、自分たちが制御できる範囲ならば余計な防御でコードの可読性を落とすべきじゃない。だってそれってノイズじゃないですか。