オブジェクト指向とnull
すでに散々書いてきたネタなんですが...
うーん、全く賛成できないな。ただでさえわかりにくいnullがさらにわかりにくくなるだけのような...
そもそもnullなんてものは手続き型の言語から間違って継承してしまった亡霊のようなものなので、かつてのメモリリークと同じで撲滅すべき存在です。
nullについて事実と言えるのは
- nullをインターフェース間でやりとりしなくてもシステムを実装できる。
- ↑を違う言い方をするとnullはオブジェクトの中に完全に隠蔽できる。
- nullに頼るとソースで説明するということが難しくなる。
- nullに頼るとコメントを書かないといけないので、ソース書く人間に負担がかかる。
- nullに頼られるとコメントを読んで覚えないといけないので、APIを使うほうにも負担がかかる。
- nullで何かを表現するとわかりにくい表現になる。→想像力が必要な分だけ頭に余計なコストがかかる。
- nullを受け取ったりreturnするコードは常にリファクタリングの「不吉な臭い」といえる。
なのでnullに対して正しい対処は
- nullをオブジェクトに渡してはいけない。
- nullをreturnしてはいけない。
ということで以前から薦めているようにnullに頼りさえしなければ比較的簡単により良いコードに近づくことができて自分も周りの人も幸せになれますよと。
そしてそれを実践している言語がすでにある。scalaだ。
scalaのAPIはnullに頼らないように設計されている。
例えばMapで値を取得するget()メソッドの戻り値はOption[B]となっていて、キーの値が存在すればSome[B]のインスタンスをキーが無ければNoneを戻すようになってる。SomeもNoneもOptionのサブクラス。
なのでscalaだと同じメソッド名でもOptionalかどうかをインターフェースを見て判断できる。コメントを読んでいちいち覚えないといけないとのとインターフェースで明示されているのではどちらが優れいるかなんて比べる必要もないでしょ?
scalaはjavaとの互換性を重視しているのでnullをインターフェース間でやりとりすることは可能だけど、オブジェクト指向言語の実装としてはインターフェースに渡した瞬間に実行時エラーにするのが正しいと思う。