Рефакторинг вызывает кучу конструкторов, которые все принимают одинаковые аргументы - PullRequest
1 голос
/ 29 февраля 2012

Как бы я рефакторинг это:

if (cond1) {
    return new Class1(arg1, arg2, arg3);
}
else if (cond2) {
    return new Class2(arg1, arg2, arg3);
}
else if (cond3) {
    return new Class3(arg1, arg2, arg3);
}
...

Мне особенно интересно избегать повторения arg1, arg2, arg3

Ответы [ 2 ]

1 голос
/ 29 февраля 2012

Использование Активатор .

Type t = cond1 ? typeof(Class1) : cond2 ? typeof(Class2) : cond3 ? typeof(Class3) : null;
Activator.CreateInstance(t, new object[] {arg1, arg2, arg3});
1 голос
/ 29 февраля 2012

Сделать заводскую функцию:

template<class Derived>
Base* instantiate(A arg1, B arg2, C arg3) {
    return new Derived(arg1, arg2, arg3);
}

Создайте карту, используя тип ключа, который имеет смысл:

std::map<int, Base(*)(A, B, C)> factory;

factory[0] = instantiate<Class1>;
factory[1] = instantiate<Class2>;
factory[2] = instantiate<Class3>;

Да, для int это может быть просто массив или std::vector, но я использую std::map выше, чтобы предложить общее решение. Затем вы можете получить экземпляры с завода очевидным способом. Для произвольных условий это должно быть что-то вроде этого:

int index = cond1 ? 0
    : cond2 ? 1
    : cond3 ? 2
    : throw std::runtime_error("Invalid index.");

return factory[index](arg1, arg2, arg3);

Но, возможно, есть более разумный способ сделать это, исходя из специфики вашей проблемы.

...