9

将来の開発のために新しい .NET 4 Code Contracts機能を使用するつもりです。Contract.Requires(...)これは、一連のメソッドで同等のステートメントを重複して指定する必要があるかどうか疑問に思いました。

コード例は千の言葉に値すると思います。

    public bool CrushGodzilla(string weapon, int velocity)
    {
        Contract.Requires(weapon != null);

        // long code

        return false;
    }

    public bool CrushGodzilla(string weapon)
    {
        Contract.Requires(weapon != null);   // specify contract requirement here
                                             // as well???

        return this.CrushGodzilla(weapon, int.MaxValue);
    }

実行時チェックの場合、最終的には常に要件チェックにヒットし、失敗するとエラーが発生するため、それほど重要ではありません。

しかし、ここで 2 番目のオーバーロードでコントラクト要件を再度指定しないと、悪い習慣と見なされますか?

また、コンパイル時チェックの機能があり、場合によってはコード コントラクトの設計時チェックも行われます。Visual Studio 2010 の C# ではまだ利用できないようですが、Spec# のように既に利用できる言語がいくつかあると思います。これらのエンジンは、そのようなメソッドを呼び出すコードを記述し、引数が現在null.

では、これらのエンジンは、現在満たされていないコントラクトを持つメソッドが見つかるまで、常にコール スタックを分析するのでしょうか?

さらに、ここでの違いについて学びましたContract.Requires(...)Contract.Assume(...)。その違いも、この質問の文脈で考慮すべきだと思いますか?

4

2 に答える 2

14

各パブリック メソッドですべてのコントラクトを指定するのがベスト プラクティスだと思います。コントラクトは単なる「チェック対象」以上のものです。事実上、ドキュメントでもあります。メソッドを呼び出しても、どのコントラクトが適用されているかがわからない場合、下の方でコントラクトの失敗が発生するのは奇妙です。これは、メソッドではなく、呼び出しているメソッドにバグがあることを示唆しています

プロジェクト全体で C# 4 を使用している場合は、オプションのパラメーターと名前付き引数を使用して、多数のオーバーロードを回避することを検討できます。もちろん、それらをサポートしていない言語からコードを呼び出す必要がある場合、これは役に立ちません。

「デフォルト」オーバーロードでコントラクトを指定しないと、静的チェッカー ( VS2010すべてのバージョンで使用できるようになりました) がコントラクトが失敗する可能性があると不平を言い、コントラクトを追加することを提案するのではないかと強く思います。

于 2010-03-29T16:37:23.180 に答える
4

また、 コンパイル時チェックの機能があり、場合によってはコード コントラクトの設計時チェックも行われます。Visual Studio 2010 の C# ではまだ利用できないようです...

利用可能ですが、動作させるには VS2010 Ultimateエディションを使用する必要があります。

警告: これは少し憶測ですが、私がそれを使用して学んだことからは正しいようです。

行ったように、メソッドを介して手動で制約を伝播する必要があります。

Code Contracts がメソッドの外側から見ることができる唯一の情報は、あなたがメソッドに伝えたことです。メソッド内の仮定とアサーションを調べることはできますが、この分析は伝播しません。つまり、CC はメソッドを「見抜く」ことができないため、null 以外であるCrushGodzilla(string)必要があることを自動的には認識しません。weapon

静的分析を使用している場合は、 に関する外部情報を使用してチェックインを実行し、 が null にならないことCrushGodzilla(string)を認識し、 null 以外の前提条件を追加することを提案します。(非伝播とは、この知識がプログラムの残りの部分の分析に使用されないという事実です。)weaponCrushGodzilla(string,int)Requires

調べたにもかかわらず、その静的アナライザーを非常によく文書化した場所は実際には見つかりませんでした。

于 2010-04-13T04:36:48.433 に答える