読者です 読者をやめる 読者になる 読者になる

Null参照エラーを撲滅するために

プログラミング全般

クイックソートの発明者として知られるアントニー・ホーアは同時に、 プログラマにとっては馴染み深い Null の生みの親でもあるが、 氏は次のような後悔を口にしておられる。

これ(Null)は、後に数え切れない過ち、脆弱性、システムクラッシュを引き起こし、 過去40年間で10億ドル相当の苦痛と損害を引き起こしたとみられる。

そうなのである。 多分、Null参照が原因のバグは全体の1割はある気がする(適当)。

そんなわけで、この忌まわしきNull参照を撲滅するための対策を考えみた。

その1 Nullを返さない

メソッドの戻り値としてNullを返さないようにする。 配列を返して、受け手側でループで処理しよう。 また、どうしても配列の先頭要素を取得してそれを返したい場合は、 Nullの時は空のインスタンスを返そう。 (NullObjectパタンを使ってもいいが全部のオブジェクトに対してこれを定義するのはしんどいので、重要なものだけにするのがよいと思う)

その2 Nullを代入しない

値の初期値にNullを代入しない。 stringの場合は空文字列、数値の場合は0、オブジェクトの場合は空のインスタンス(もしくはNullObject)を設定する。 「= nil」は絶対に認めない!

その3 Swiftを使う

人類は学んだ。Nullを代入できなければ、Null参照など発生しないことを。 Swiftはデフォルトの型でNullの代入ができない。 なので、以下のようなコードはエラーになりコンパイルできない。

var normalStr : String = null
=> エラー

Nullを代入するにはオプショナル型を使わなければならない。

var normalStr : String? = null

ビルド時にオプショナル型の使用を検知するような仕組みを作っておけば、 Null参照が起こる可能性を0にできる。