Как провести рефакторинг почти дублирующих методов с универсальными типами - PullRequest
2 голосов
/ 04 августа 2011

У меня есть несколько методов, которые практически одинаковы, за исключением того, что они имеют различное количество параметров универсального типа. Внутренний код очень и очень похож:

public Set[] CreateSet<TFirst, TSecond>(List<TFirst> first, List<TSecond> second)
{
    Set[] result = new Set[2];
    result[0] = CreateSet(first);
    result[1] = CreateSet(second);
    return result;
}

public Set[] CreateSet<TFirst, TSecond, TThird>(List<TFirst> first, List<TSecond> second, List<TThird> third)
{
    Set[] result = new Set[3];
    result[0] = CreateSet(first);
    result[1] = CreateSet(second);
    result[2] = CreateSet(third);
    return result;
}

...

И так далее. У меня есть эти методы до 7 параметров общего типа. Как вы можете видеть, они практически все одинаковы, за исключением того, что они создают наборы разных размеров.

Мне не нравится это дублирование кода, поэтому можно было бы реорганизовать этот код в один частный метод, который они будут вызывать внутри. Или я должен рассмотреть какой-либо другой способ сделать это? *

1 Ответ

1 голос
/ 04 августа 2011

Возможно, вы могли бы создать конструктор для набора наборов, например

public class SetCollectionBuilder
{
    private readonly List<Set> sets = new List<Set>();
    public SetCollectionBuilder Add<T>(List<T> list)
    {
        this.sets.Add(CreateSet(list));
        return this;
    }

    public Set[] Build()
    {
        return this.sets.ToArray();
    }
}

Тогда вы можете создать произвольную коллекцию, такую ​​как:

Set[] result = new SetCollectionBuilder()
    .Add(first)
    .Add(second)
    .Build();
...