私はしばらくこの問題について考えていましたが、他の開発者から意見を聞きたいと思います。
私は非常に防御的なスタイルのプログラミングをする傾向があります。私の典型的なブロックまたはメソッドは次のようになります。
T foo(par1, par2, par3, ...)
{
// Check that all parameters are correct, return undefined (null)
// or throw exception if this is not the case.
// Compute and (possibly) return result.
}
また、計算中に、参照解除する前にすべてのポインターをチェックします。私の考えは、バグがあり、どこかにNULLポインターが表示される場合、私のプログラムはこれをうまく処理し、単純に計算の継続を拒否するということです。もちろん、ログまたはその他のメカニズムのエラーメッセージで問題を通知できます。
もっと抽象的に言えば、私のアプローチは
if all input is OK --> compute result
else --> do not compute result, notify problem
他の開発者、中でも私の同僚は、別の戦略を使用しています。たとえば、ポインタをチェックしません。彼らは、コードの一部に正しい入力が与えられるべきであり、入力が間違っている場合に何が起こるかについて責任を負うべきではないと想定しています。また、NULLポインター例外がプログラムをクラッシュさせた場合、テスト中にバグがより簡単に発見され、修正される可能性が高くなります。
これに対する私の答えは通常です。しかし、テスト中にバグが見つからず、製品が顧客によって既に使用されているときにバグが表示された場合はどうなりますか?バグが顕在化する好ましい方法は何ですか?特定のアクションを実行しないが、それでも動作を継続できるプログラム、またはクラッシュして再起動が必要なプログラムでしょうか?
要約する
間違った入力を処理する2つのアプローチのうち、どちらを勧めますか?
Inconsistent input --> no action + notification
または
Inconsistent input --> undefined behaviour or crash
編集
回答と提案をありがとう。私も契約によるデザインのファンです。しかし、メソッドを呼び出すコードを書いた人(おそらく自分自身)を信頼していても、バグが存在する可能性があり、誤った入力につながります。したがって、私のアプローチは、メソッドに正しい入力が渡されると決して想定しないことです。
また、メカニズムを使用して問題をキャッチし、それについて通知します。開発システムでは、たとえばダイアログを開いてユーザーに通知します。本番システムでは、ログに情報を書き込むだけです。余分なチェックがパフォーマンスの問題につながるとは思いません。実稼働システムでアサーションがオフになっている場合、アサーションが十分かどうかはわかりません。テスト中に発生しなかった状況が実稼働で発生する可能性があります。
とにかく、多くの人が反対のアプローチを取っていることに本当に驚きました。テスト中にバグを見つけやすくすることを維持しているため、アプリケーションを「意図的に」クラッシュさせます。