Rustのnewtypeで、誤った状態をコンパイル時に無償で表現不能にする
1フィールドのラッパー構造体が、1バイトのオーバーヘッドも増やさずに単位混在バグや型の混同を防ぐ。
のユーザIDを、注文IDを期待する関数に渡しても、Rustは文句を言わない。両方とも だ。コンパイラは同じ型を見ているので、助けてくれない。実行時に気づく。通常は本番環境で、通常は安全だと思っていたリファクタリングの後だ。 これこそが、newtypeが存在する理由、つまり排除すべきバグの類型だ。…
2 posts
1フィールドのラッパー構造体が、1バイトのオーバーヘッドも増やさずに単位混在バグや型の混同を防ぐ。
のユーザIDを、注文IDを期待する関数に渡しても、Rustは文句を言わない。両方とも だ。コンパイラは同じ型を見ているので、助けてくれない。実行時に気づく。通常は本番環境で、通常は安全だと思っていたリファクタリングの後だ。 これこそが、newtypeが存在する理由、つまり排除すべきバグの類型だ。…
ミリ秒を要求される場所に秒を渡すようなバグは、どんなテストも通り抜けてしまう。ここでは、単位を TypeScript の型システムに直接エンコードして、実行時コストゼロで混在をコンパイル時に検出する方法を解説する。
ある関数がタイムアウトをミリ秒で要求する。そこに を渡す。後で別の関数がタイムアウトを秒で要求する。そこに を渡す。その間のどこかで を呼び出すと、1時間23分間何も起こらない。 TypeScript はここでは助けにならない。 と のどちらも…