私の現在のシステムでは、後で現在のシステム全体で再利用できるように、いくつかの一般的な拡張メソッドを作成することにしました。
私はMicrosoft Code Contractsを使用しているので、最初にそれらを含めて と を検証することにしましsource
たrange
。
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 番目の例のように)を介した検証の古典的な実装が必要です。
この方法の利点は、拡張メソッドを持つテスト済みジェネリック クラスを変更せずに再利用できることです。しかし、欠点は、別のタイプの検証が行われることです。
どのアプローチを使用するかに関する提案/アドバイスは大歓迎です。
ご清聴ありがとうございました!