3

私の現在のシステムでは、後で現在のシステム全体で再利用できるように、いくつかの一般的な拡張メソッドを作成することにしました。

私はMicrosoft Code Contractsを使用しているので、最初にそれらを含めて と を検証することにしましsourcerange

1)

public static class MyExtensions {
    public static void RemoveRange<T>(this ObservableCollection<T> source, IEnumerable<T> range) where T : class {
        Contract.Requires(source != null);
        Contract.Requires(range != null);

        foreach (var element in range) {
            source.Remove(element);
        }
    }       
}

別の実装方法は、古典的な方法です。

2)

public static class MyExtensions {
    public static void RemoveRange<T>(this ObservableCollection<T> source, IEnumerable<T> range) where T : class {
        if (source == null) {
            throw new ArgumentNullException("source");
        }

        foreach (var element in range) {
            source.Remove(element);
        }
    }   
}

この瞬間まで、別のシステムで再利用できる方法でジェネリック クラスを設計する必要はありませんでした。

編集(開始)別のシステムとは、異なるアーキテクチャを持つ具体的に異なるシステムを意味します。例:現在のシステムは金融部門向けであり、コード契約を使用しています。しかし、他のシステムは軍事部門向けであり、コード契約を使用しません検証。) 編集 (終了)

別のシステムで拡張メソッドを使用してそのジェネリック クラスを再利用する方法について、同僚と話し合いました。

I)コード コントラクトを保持することは、現在のシステム全体における検証のルールであるためです。(最初の例のように)。

この方法の利点は、システム全体で 1 つの検証方法を維持できることです (コード コントラクト経由のみ)。欠点は、このTested Generic Class with Extension メソッドは、Contract を classic に置き換えないと、別のシステム (検証に Code Contracts を使用しない可能性がある) で再利用できないことIf/Throw Exceptionです。

II)もう 1 つの意見は、拡張メソッドを持つジェネリック クラスを別のシステムで再利用できるように設計することです。これまでそのような要件がなかったとしてもです。この意見では、 IFスロー例外(2 番目の例のように)を介した検証の古典的な実装が必要です。

この方法の利点は、拡張メソッドを持つテスト済みジェネリック クラスを変更せずに再利用できることです。しかし、欠点は、別のタイプの検証が行われることです。

どのアプローチを使用するかに関する提案/アドバイスは大歓迎です。

ご清聴ありがとうございました!

4

1 に答える 1

1

そのクラス ライブラリを使用する他のアセンブリのコード コントラクトへの依存関係を導入することなく、コード コントラクトをクラス ライブラリに追加できます。

コード コントラクトは、コード コントラクトを指定するコードを変更するリライターによって実装されます。コード コントラクトの残りのサポートは、.Net 4 以降に既に組み込まれているため、特別な手順を実行しなくても、コード コントラクトを使用するライブラリを他のコードから問題なく参照できます。

したがって、一部のアセンブリでは、それらのアセンブリを参照する他のものを気にせずにコード コントラクトを使用できます。

具体的には、次のステートメントは正しくありません。

欠点は、このテスト済みジェネリック クラスと拡張メソッドは、コントラクトを従来の If/Throw Exception に置き換えないと、別のシステム (検証にコード コントラクトを使用しない可能性がある) で再利用できないことです。

「他のシステム」で再利用できるためです(「他のシステム」とは、「コード契約を使用しないアセンブリ」を意味する場合)。

于 2013-06-26T08:20:12.720 に答える