タグ付けされた質問 「code-contracts」

4
コードコントラクトを使用する理由
私は最近、Microsoftのコードコントラクトのフレームワークに出会いました。 私は少しのドキュメントを読んで、「静的分析を実行できないことが多いため、なぜこれを実行したいのか」と絶えず尋ねてきました。 今、私はすでに次のような例外を守って、ある種の防御的なプログラミングスタイルを持っています。 if(var == null) { throw new NullArgumentException(); } また、NullObject Pattern alotを使用していますが、問題はほとんどありません。ユニットテストを追加すれば、セットアップは完了です。 アサートを使用したことも、見逃したこともありません。まったく逆です。意味のない主張がたくさんあるコードは本当に嫌いです。これは、私にとってはノイズであり、本当に見たいものから気を散らすものです。コード契約、少なくともマイクロソフトのやり方はほとんど同じです-さらに悪いことです。それらはコードに多くのノイズと複雑さを追加します。とにかく、99%で例外がスローされます。そのため、それがアサート/コントラクトのどちらなのか、実際の問題なのかは気にしません。まさに、プログラムの状態が実際に破損するケースはほとんどありません。 率直に言って、コードコントラクトを使用する利点は何ですか?何かありますか?すでにユニットテストとコードを防御的に使用している場合、契約を導入することはコストの価値がなく、メンテナーがそのメソッドを更新するときに呪いをかけるコードにノイズを入れていると感じます。無駄なアサートのため。私はまだその代価を払う正当な理由を見ていません。

2
コンストラクターで[Pure]を使用する場合
.NETのコードコントラクトについて学び、純粋なコンストラクターの概念を理解しようとしています。コードの契約ドキュメントの状態: コントラクト内で呼び出されるすべてのメソッドは純粋でなければなりません。つまり、既存の状態を更新してはなりません。純粋メソッドでは、純粋メソッドへのエントリ後に作成されたオブジェクトを変更できます。 そして、PureAttributeドキュメントの状態: 型またはメソッドが純粋であること、つまり、目に見える状態の変更を行わないことを示します。 メソッドに関してはこれらのステートメントを理解していますが、コンストラクターはどうですか?次のようなクラスがあったとします: public class Foo { public int Value { get; set; } public Foo(int value) { this.Value = value; } } このコンストラクターは明らかに新しいFooオブジェクトの状態に影響しますが、他の副作用はありません(たとえば、パラメーターを操作したり、非純粋なメソッドを呼び出したりしません)。これは候補者[Pure]ですか?[Pure]コンストラクターに属性を配置することの意義は何ですか?また、自分のコードでこれをいつ行う必要がありますか?

6
契約ベースのプログラミングと単体テスト
私はやや防御的なプログラマーであり、Microsoft Code Contractsの大ファンです。 現在、私は常にC#を使用できるわけではなく、ほとんどの言語で私が持っている唯一のツールはアサーションです。だから私は通常、このようなコードになります: class { function() { checkInvariants(); assert(/* requirement */); try { /* implementation */ } catch(...) { assert(/* exceptional ensures */); } finally { assert(/* ensures */); checkInvariants(); } } void checkInvariants() { assert(/* invariant */); } } ただし、このパラダイム(または、あなたがそれを呼ぶものは何でも)は、多くのコードを乱雑にします。 私はそれが本当に努力の価値があるかどうか、そして適切な単体テストがすでにこれをカバーするかどうか疑問に思い始めました?

2
コードコントラクト/アサート:重複チェックとは?
私はアサート、コントラクト、または私が使用している言語で利用可能なあらゆる種類のチェックを書くことの大ファンです。少し気になることの1つは、重複チェックを処理するための一般的な方法が何なのかがわからないことです。 状況例:最初に次の関数を記述します void DoSomething( object obj ) { Contract.Requires<ArgumentNullException>( obj != null ); //code using obj } その後数時間後、最初の関数を呼び出す別の関数を記述します。すべてがまだメモリ内にあるのでDoSomething、nullオブジェクトを既にチェックしていることがわかっているので、コントラクトを複製しないことにします。 void DoSomethingElse( object obj ) { //no Requires here: DoSomething will do that already DoSomething( obj ); //code using obj } 明らかな問題:objがnullでないことを確認するためにDoSomethingElse依存しDoSomethingています。したがってDoSomething、これ以上チェックしないことを決定する必要があります。または、別の関数を使用する場合、objはもうチェックされない可能性があります。結局、私はこの実装を書くことにつながります: void DoSomethingElse( object obj ) { Contract.Requires<ArgumentNullException>( obj != null …

4
イベント駆動型マイクロサービスアーキテクチャでの変更の処理
イベント駆動型マイクロサービスアーキテクチャの変更を処理するためのオプションを調査している調査プロジェクトを行っています。 したがって、4つの異なるサービスを利用できるアプリケーションがあるとします。これらの各サービスには、ローカルデータを格納するための独自のデータベースがあります。 このセットアップでは、4つのサービスがイベントバスを使用して相互に通信します。したがって、サービスで何かが発生すると、イベントが発行されます。そのイベントに関心のある他のすべてのサービスは、独自の方法で処理します。 その場合、アーキテクチャー内のさまざまなサービスは、これらのイベントの内容(属性など)について「契約」を持つ必要があります。したがって、サービスはこれらのイベントに「疎結合の依存関係」を持っています 私の質問は次のとおり です。これらのイベントの変更をどのように処理できますか? それでは、サービスAがアプリケーションに新しいユーザーを登録するとします。したがって、 "" UserRegistered "イベントを送信します。サービスBがそのイベントを取得して処理します。ただし、サービスチームCの一部の開発者は、登録済みユーザーの性別も必要であると判断しました。そのため、イベントが変更され、属性gender 「UserRegistered」イベントに追加されます。 サービスBが再デプロイせずに、その追加属性を使用して同じイベントを引き続きピックアップできることをどのように確認できますか? そして、この問題に取り組み、これらのイベントをバージョン管理する他の方法はありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.