たれぱんのびぼーろく

わたしの備忘録、生物学とプログラミングが多いかも

Null安全にかかわる私の指針

Null安全とは

実行時にNullを想定しない場所にNullが表れ問題を起こす、ことが起きないと保証された状態.
安全性という意味では、Nullに対する不正演算には例外を投げると言語仕様にある限り、いちおう安全ではあるはず.

基本的な考え

NullとNumber, NullとStringはかなり質が違う.
NullとNumberに共通しない演算はたくさんある.
なのでNullとプリミティブ等を同じset(集合)、プログラミングで言えば型(type)として扱うのに問題があるという立場.

解決指針

Nullと隔離されたプリミティブ型 (いわゆるnon-nullable) を基本とし、Nullable型と明確に区別する.
型システムによる支援でもってNullの紛れ込みを完全に排除できる.
これによりNullなんじゃないかという不安と完全におさらばできる.
Nullable型の実現は言語を取り巻く環境に合わせて柔軟に実現すればいいと考える.
T?のようなプリミティブに対応する各Nullable型を用意してもいいし、Union型とみたり、Option型やEither型のようなモナド型の文脈で扱ってもいい.
なんにせよ、明示しないとNullを扱えない、を基本方針とする.

各言語における方針

TypeScript

strictNullChecksオプションを有効にし、各型がNullを許容しないように強制する (Non-Nullable型を強制する).
Nullableを実現する手法は

  • (build-in) Union型で X | Null にする
  • (fp-ts) Option型 (Either型でも)、すなわちモナド型で処理する

がありうる。
Option型を基本とする方針.