.NETで引数と値の事前条件と事後条件をアサートする最良の方法は?

StackOverflow https://stackoverflow.com/questions/155422

  •  03-07-2019
  •  | 
  •  

質問

最近、契約による設計について考えていましたが、.NETで値の事前条件と事後条件を主張する最良の方法は何だと人々は思うのでしょうか? つまり、メソッドの引数値を検証します。

Debug.Assertを推奨する人もいれば、ifステートメントの使用と例外のスローについて話す人もいます。それぞれの長所と短所は何ですか?

推奨されるフレームワークは何ですか?

役に立ちましたか?

解決

最終的には、.NET 4.0の出荷時にコードコントラクトを使用します。ただし、現在の本番コードでは、「ガード」で大きな成功を収めています。クラスと例外を生成する一般的な方法。

詳細については、これに関する投稿を参照してください。

他のヒント

別のオプションは、仕様番号です。

Spec#は、オブジェクト指向言語C#の拡張です。型システムを拡張して、null以外の型とチェック済み例外を含めます。メソッドのコントラクトを事前条件と事後条件、およびオブジェクト不変条件の形式で提供します。

アサーションよりも例外を好むのは、それがそのようになるはずであり、そうでない場合、私がそれを修正できるように知りたいので、デバッグモードで得られるカバレッジが実際の使用またはカバレッジにどこにも近くないためです、したがってDebug.Assertを使用するだけでは十分ではありません。

assertsを使用するということは、リリースコードに肥大化を加えないことを意味しますが、デバッグビルドでそれらをキャッチした場合、これらのコントラクトが壊れるタイミングと理由のみを確認できることを意味します。

例外を使用するということは、デバッグまたはリリースが発生するたびに契約が破られることを確認できることを意味しますが、リリースビルドにさらに多くのチェックとコードが含まれることも意味します。

中間アプローチを使用し、トレースを使用して、事前および事後条件を何らかの種類のアプリケーションログにトレースし、問題をデバッグすることができます。ただし、これらのログを収集して、ユーザーが直面している問題を把握する方法が必要です。また、これを例外と組み合わせて、より深刻な問題の例外を取得することもできます。

しかし、私が見る方法は、契約が強制する価値がある場合、それが壊れたときに例外を投げる価値があるということです。ただし、それは意見と対象アプリケーションに多少依存すると思います。例外をスローする場合、発生した例外が処理されないままになったときにクラッシュレポートを提供する何らかの形式のインシデントレポートシステムが必要になる可能性があります。

http://conditions.codeplex.com/ で流れるようなフレームワークを見ることができます。 そのオープンソースと無料。

Spec#はそれを行う方法で、C#のスーパーセットです。これで" コードコントラクト"ができました。これは、 Spec#に依存しないバージョンなので、たとえばVB.NETでコードコントラクトを使用できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top