0

これについてはあまり情報が見つからないようですので、ここで取り上げることにしました。私がよく遭遇する問題の 1 つは、リストの処理中に単一のオブジェクトを作成するユニット テストです。たとえば、 のようなメソッド シグネチャがありIEnumerable<Output> Process(IEnumerable<Input> inputs)ます。単一の入力を単体テストするときは、1 つの入力のリストを作成し、単純First()に結果を呼び出して、それが期待どおりであることを確認します。これにより、次のような結果が得られます。

public class BatchCreator
{
    public IEnumerable<Output> Create(IEnumerable<Input> inputs)
    {
        foreach (var input in inputs)
        {
            Console.WriteLine("Creating Output...");
            yield return new Output();
        }
    }
}

私の現在の考えでは、1 つのクラスがオブジェクトの作成を担当し、別のクラスが入力リストの調整を担当する必要があります。以下の例を参照してください。

public interface ICreator<in TInput, out TReturn>
{
    TReturn Create(TInput input);
}

public class SingleCreator : ICreator<Input, Output>
{
    public Output Create(Input input)
    {
        Console.WriteLine("Creating Output...");
        return new Output();
    }
}

public class CompositeCreator : ICreator<IEnumerable<Input>, IEnumerable<Output>>
{
    private readonly ICreator<Input, Output> _singleCreator;

    public CompositeCreator(ICreator<Input, Output> singleCreator)
    {
        _singleCreator = singleCreator;
    }

    public IEnumerable<Output> Create(IEnumerable<Input> inputs)
    {
        return inputs.Select(input => _singleCreator.Create(input));
    }
}

Output上に投稿された内容を使用して、指定された の1 つのインスタンスを作成できることを簡単にテストできますInputSingleCreatorfrom 以外のコード ベース内の他の場所を呼び出す必要がないことに注意してくださいCompositeCreator。作成ICreatorすると、現在のプロジェクトで現在2〜3回行っている同様のタスクを実行する必要がある他の時間に再利用するという利点も得られます

これについて何か光を当てることができる経験がある人はいますか? 私は単にこれを考えすぎていますか?提案は大歓迎です。

4

2 に答える 2

2

一般的に言えば、あなたの推論に本質的に問題はありません。多かれ少なかれ、それが問題を解決する方法です。

ただし、CompositeCreator正確に1つの「作成方法」を使用するため、実際には複合ではありません。

プロジェクトの内部構造がわからないため、これ以上のことは言えませんが、ユース ケースにうまく統合できれば問題ありません。私が試したいのは、コレクションを処理するICreator<Tin, Tout>ための拡張メソッドのみを使用することです。IEnumerable<Tout> CreateMany(this IEnumerable<Tin> c)両方を簡単に独立してテストできます(ICreator入力のコレクションが処理されているかどうかを偽って確認します)。ICreator<IEnumerable, ...>コレクション全体を操作することと、個々のアイテムを操作することはしばしばうまくいかないため、これは通常は良いことです。

于 2013-03-19T13:57:14.887 に答える
1

LINQによって解決される問題であるため、単なるコレクション以上のものでない限り、複合クリエーターであるIEnumerable入出力オプションが必要な理由は完全にはわかりません。次のようになります。

var singleCreator = new SingleCreator();
var outputs = InputEnumerable.Select(singleCreator.Create);

これは主観的なものであり、渡すクラスの複雑さに依存すると思います。IEnumerableだけではない場合は、クラスである必要がある場合とない場合がある、ある種の複数の作成者を持つ価値があります。

于 2013-03-19T14:00:54.697 に答える