質問: 例外や事前条件?の考え方についてわからないことがあります。言語はJavaScriptを使っています。 また、自分が調べた言葉や考え方に対する理解が大きく間違っている可能性があります。そこを教えていただきたいです。整理があまりできていないのか文章がおかしなところもあるかもしれませんがお願いします。 事前条件についてわからないこと --------------- 自分が調べたところ事前条件というのは関数が正しい処理を行うための前提となる条件だと感じました。 つまりこれは引数に正しい物が渡されているか?ということだと思ったのですが、もし関数内でグローバル変数を使ったり、そもそも関数がメソッドでプロパティを使う。という場合はこのグローバル変数やプロパティも事前条件というのでしょうか?これらのデータは何が責任を持つのでしょうか? 例外とチェックについてわからないこと ------------------ 例外についても疑問に思いました。例外を投げるかどうかの判断は処理の中で条件をチェックしているように思えます。 それとも例外を投げるかどうかのチェックは条件の確認ではなく、呼び出し側へ例外を投げることで呼び出し側の事前条件の責任を訪ねているということに興味があるということでしょうか? 処理の中にチェックを細かく入れていくのがいいことではないのはなんとなくわかります。 どこかが例外を投げてくれるまで間違った動きをし続けるのを防ぐために例外を自分で作って投げるのだと思っていますが、これを極端に増やすと例外を投げるかどうかのテストをする箇所が増えますし、極端な話NullPointerExceptionでいいはずのところが幾つかさかのぼった呼び出し側でthrow new Error('まだ○○が定義されていません。');に近い無駄なことをしてしまう可能性があるからチェックを細かくしすぎるのは良くないのだと思っています。
回答: 3つ目はちょっと質問内容が掴めなかったので、最初の2つだけ。 ### 事前条件について その関数が正しく動作するために、グローバル変数や別のプロパティの状態に制約があるのなら、それも事前条件に含まれます。 それらのデータの責任者は、データの持ち主です。 グローバル変数の持ち主はプログラム全体なので、全体で責任を持って管理しなければならず、プログラムの規模が大きくなるほど、これは困難になります。 JavaScriptはオブジェクト指向言語ですので、きちんとオブジェクトを分けて責任の範囲を狭く、明確にすることが望ましいです。 ### 例外とチェックについて 「どんな事態を避けたいのか」によります。 開発チーム内の共通ライブラリの作成担当であれば、公開APIでそれなりのチェック(これは仕様に明記すべきですが)をした方が良いでしょう。 でないと、これを使う同僚から「何か動かないんだけど」と問い合わせが来た時に、調査が難しくなります。 もちろん、チェックを細かくしすぎた場合の弊害は、懸念されている通りですので、常に「何のためにチェックするのか」「どんな事態を避けるためのチェックか」を考え、その目的のために支払うコストとして妥当かどうか、判断していく必要があると思います。 判断基準は、プログラムの規模や難易度、チームの規模や構成、同僚の技量などによります。