assert(0 < age && age < 100);
😒...(assertコードってあまり見かけない?)
契約プログラミングしてみる
契約プログラミングは変数や関数の仕様をアサートコードで記述するプログラミングのことです。
例として、下記のソースコードの年齢を表す変数を用います。
let age: number = parseInt($('input#age')[0].text());
、この変数には以下の仕様があります。
- 1以上かつ100未満
この仕様について、コメントで追記してみましょう。
// 年齢は1以上100未満
let age: number = parseInt($('input#age')[0].text());
しかしコメントではageに9999の代入のような仕様から外れる値の代入を防ぐことができません。
この場合に辛いのが、後々にageに9999が代入されたことが遠因のエラーが発生しても、この行にスグにたどり着けないことです。
そこで、代入した後にassert関数
でageの値が仕様に反していないか確認してみましょう。
import {assert} from 'assert';
// 年齢は1以上100未満
let age: number = parseInt($('input#age')[0].text());
assert(0 < age && age < 100);
このコードならageに9999が代入されたとしてもassert関数の行でエラーが発生し、ageに仕様に反する値が入ったことに気付けます。
これが契約プログラミングです。
まとめ
契約プログラミングのメリット
- アサートコードがない場合と比べ、エラーが早い段階で見つかる
- アサートコードはドキュメントにもなる
今回説明しませんでしたが、契約プログラミングには事前条件・事後条件・責務明確化などの概念がありますので、興味ある方は調べてみてください。
ただ、この記事のような簡単なアサートコードでも契約プログラミングのメリットを享受することができるので、ぜひ試してみてください。