回答:
契約による設計と防御的プログラミングは、ある意味で互いに反対です。DbCでは、共同制作者間の契約を定義し、共同制作者が契約を尊重するという前提でプログラミングします。防衛的プログラミングでは、共同制作者が契約に違反するという前提でプログラミングします。
DbCスタイルで記述された実際の平方根ルーチンは、負の数を渡すことは許可されておらず、負の数に遭遇することは絶対にないと仮定するという契約で述べています。防御的に記述された実際の平方根ルーチンは、負の数が渡されると想定し、適切な予防措置を講じます。
注:もちろん、DbCでは他の誰かが契約を確認する可能性があります。たとえば、エッフェルでは、契約システムは実行時に負の数をチェックし、適切な例外をスローします。Spec#では、定理証明者は、ルーチンが負の数を渡されないことを証明できない場合、コンパイル時に負の数をチェックし、ビルドに失敗します。違いは、プログラマーがこのチェックを行わないことです。
契約による設計(DbC)は、防御的にプログラムする方法になりますか?
はい。
「ディフェンシブプログラミング」は、多くの場合、時間を無駄にする言い訳です。多くの場合、通常の例外の原因となるものをチェックする時間を無駄にします。例外の代わりに、例外処理句の代わりに追加のIFステートメントが記述されます。
契約を定義して完了します。
誰かが契約に違反すると、プログラムは、通常のイベントの過程で、通常処理できる通常の例外を破り、発生させます。
「防御的プログラミング」と「エラー防止」は、エラーを防止するのではなく、エラーを追加するために表示できます(エラー防止チェック自体がエラーであるため)。
例外処理は、「Defensive Programming」よりもはるかに優れた例外を沈黙させ、記録し、処理することができます。