(Yegorから和訳と転載の許可は得た。以下はその全文の和訳だが、意訳超訳が混じっているので、もとのニュアンスを知りたければ元記事を読んでもいいし、読まなくてもいい。JavaでNULLを使う単純な例を以下に示す。オブジェクトの代わりにNULLを返す可能性がある、というのが間違っているところだ。NULLはオブジェクト指向パラダイムにおけるひどい慣習で、全力で避けるべきものだ。これについては多くの意見が既に発表されている。Thinkingの全体に渡って述べられている。ここで、その論拠のすべてをまとめ、NULLの使用を回避して適切なオブジェクト指向構造に置き換える方法の例を紹介したいと思う。基本的に、NULLの代わりになり得るものはふたつある。ひとつはNullオブジェクトデザインパターンだ。(それをひとつの不変オブジェクトにするのが最善。Employee(id);}もうひとつは、オブジェクトを返せないときに例外を投げてフェイルファストすることだ。Employee(id);}さて、NULLに反対する論拠を見てみよう。Westの著書に加えて、私はこの記事を書く前に以下の本や記事を読んだ。design?アドホック(場当たりな)エラー処理インプットとしてオブジェクトを受け取った場合は常に、それがNULLでないか、また有効なオブジェクト参照かどうかを確認しないといけない。(NPE)が実行時に処理を止めてしまう恐れがある。このため、ロジックが複数の確認処理やif/then/else分岐に汚染されてしまう。employee.transferTo(dept2);}これは、Cなどの命令文を並べる手続き型言語において、例外的な状況に対応する手法だ。OOPは、主にこういったアドホックエラー処理のブロックを排除する目的で、例外処理を導入した。OOPでは、例外処理をアプリケーションレベルのエラーハンドラにまかせることで、コードをかなりきれいで短いものにできる。dept.getByName("Jeffrey").transferTo(dept2);NULL参照は手続き型言語から受け継がれたものだと認識し、Nullオブジェクトか例外を変わりに使うべきだ。上記メソッドの目的を明確に伝えるためには、getByName()はgetByNameOrNullIfNotFound()という名前でなければいけない。これと同様の名前を、オブジェクトかNULLを返す全ての関数が持たなければいけない。なくば、だれかがあいまいなコードを読むはめになる。コードの意図を明確にするために、関数に長い名前をつけるべきだ。このあいまいさを排除するために、関数は、実オブジェクトを返すか、Nullオブジェクトを返すか、例外を投げる、しかしてはいけない。性能を考慮するとNULLを返さざるを得ない場合もあるだろうと主張する人がいるかもしれない。JavaのMapインターフェースのget()メソッドは、指定された要素がないときにNULLを返す。employee;このコードでは、MapがNULLを使っているおかげで、mapを一回しか検索しない。Mapのget()を、要素が見つからないときに例外を投げるように修正したら、以下のようなコードになる。search明らかに、この方法は最初のものより2倍遅い。する?Mapインターフェースは、(作者を攻めるわけではないが、)設計に問題がある。そのget()メソッドはIteratorを返すべきで、その場合以下のようなコードになる。found.next();因みに、C++の標準ライブラリのmap::find()はまさにこのように設計されている。null)という文は理解できる。君がオブジェクトになって考えたとすると、この文はかなり意味のないものになる。オブジェクト視点で上記コードは以下のように見える。Jeffreyと話したいのですが。