消したつももりだった下書きが残ってたっぽいので公開しちゃう。なお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
そのものじゃないんだなー」と気づいた。