日々常々

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

nullが嫌い

消したつももりだった下書きが残ってたっぽいので公開しちゃう。なお2015-05-10に書いたもののようです。当時のブログを見ると、Optionalでなんか盛り上がった頃みたい。

ということで以下は編集せずそのまま投稿ー。

前置き

nullを安易に使わない 派生のポエムです。

nullが嫌いってのは上記に限らずよく書いてる気がするけど、嫌いって感情だけでポエムったらこんなになってました。

なお、Javaの話です。

nullが嫌い

nullが嫌い。気軽に使われるnullが嫌い。思考停止で使われるnullが大嫌い。一時変数を宣言して初期化とか言って使われるnullが嫌い。まともに扱いきれないのに簡単に使えてしまうnullが大嫌い。

NullPointerExceptionが発生した時に「開発者の注意不足で発生した。しっかりチェックして再発防止に努める。」などと言わされたり(やりもしないのに)、責める要因に使われるのを見ると虫酸が走る。「nullの可能性に注意を払えなかったこと」を責めたててどうするのだろう。問題はそこじゃないよね。そりゃ気をつけてて、偶然気づければ防げるかもしれない。でも人間は注意し続けることはできない。チェックリストを作っても、チェックは漏れる。チェックすれば救われる教徒のチェックリストはおもしろい長さになるし、運用もザルになるものだ。「チェックOKが記入されているチェックリストをコピーして一部修正」なんてのも、よくある話。チェックリストが長すぎるのが悪い。チェック漏れが起こったらチェックリストのチェックリストを作りはじめる。冗談のように聞こえるけれど、稀によく見る。「気をつけます」なんてのは、「気をつけ損なったら仕方ない」の宣言に他ならない。なので、漏れる。気をつけたのに漏れた場合は、気をつけてなかった以外に理由は出てこない。気をつけ漏れないように気をつける、無限ループ。

確かに、注意でしか防げないことはある。あるだろうよ。そういうものはチェックを二重化、三重化して漏らす可能性を可能な限り減らす。それでも絶対はない。多重化されたチェック機構はコストに対する効果がどんどん薄れていくものである。そして「nullチェック」にそこまでのコストを割くことはできない。超軽く扱われてる。だったら漏らしていいってことだよね。ダメ?ダメだったら「注意」以外のアプローチが必要だろう。とは言え、今まで「注意する」でやってきたものがいきなり他のうまくいく方法を考え出せるでもないし、完全にうまくいく方法なんて存在するわけでもない。よく言われるように、銀の弾丸なんて無い。他の方法を考えた時に完全性とか言い始めると何もできない。シンプルにメリデメの天秤にかけるしかない。

……と言う話をしても「丁寧にnullチェックすれば良い」と主張されたりする。そうか、ならばNullPointerExceptionが起こりうるすべての場所でチェックする?できる?無理だよね。

nullに注意を払わなきゃいけない状況は、いままで安易にnullを使ってきたツケなんだ。安易にnullを返すメソッドが悪だし、安易にnullに逃げる文化が悪い。その負債の一部を払うのがnullチェック。一部しか払えず、nullチェックを行えば行うほどコードの量が増える。つまり負債が増える。負債を他所で借りてきたもので払うって自転車操業、全体でみると負債は増えてるんじゃないかな。

NullPointerExceptionに遭遇した際、最初にやることはおそらく「nullチェックを追加する」ではない。きっとnullを無視して動くようにすることでもない。これらは問題を先送りしているだけ。そこで例外が起こるということは、おそらく例外的事象なんだ。nullになるべきでない状況でnullになる現実、その根本を断ちに行かなくちゃ。でないと、いつまでたってもnullと戯れ続けることになる。そんなに暇じゃないはず。

勿論、nullチェックが必要な場面もある。一切合切のチェックを排除できるなんて言ってないし、Javaからnullを根絶できるとも言ってない。ここまで書いて、「私が嫌いなのはnullそのものじゃないんだなー」と気づいた。