@crackpot
Скрещиваю ужей с ежами. Viva la robolution!

Как реализовать элегантный code flow?

Пишу для заказчика систему, в основной части которой - выполнение определенного сценария в зависимости от параметров.
Параметров всего два (привожу упрощенный код):
string paramA;
string paramB;


paramA может иметь 2 значения - in, out. paramB - 5 значений: one, two, three, four, five.
При наступлении каждой пары значений paramA-paramB последовательно выполняется несколько действий, причем действия для всех пар одинаковые, но в разном порядке стартуют.

Все действия - суть методы одного класса. Параметры глобальны.

Сейчас код выглядит примерно так (не стал заполнять все ветки, и так суть ясна, думаю):
Worker w = new Worker();

switch (paramA)
{
	case "in":
		switch (param2)
		{
			case "one":
				w.do1();
				w.do2();
				w.do3();
				break;
			case "two":
				w.do2();
				w.do4();
				break;
			case "three":
				w.do1();
				w.do5();
				w.do2();
				break;
			case "four":
				break;
			case "five":
				break;
		}
		break;
	case "out":
		break;
	default:
		break;
}


Методов всего 20. Получается ужасно огромный свитч, не говоря уже о том, что в кейсах очень много дублирующегося кода (т.к. вызываются одни и те же методы).

Подскажите, может быть есть какой-то способ это все упростить? Например, как-то собрать структуру типа такой:
in-one => { w.do1(); w.do2(); w.do3() }
in-two => { w.do2(); w.do4(); }

И выполнять нужный блок в зависимости от ключа?

Моего опыта в c# (две недели) не хватает, чтобы что-то нафантазировать.
  • Вопрос задан
  • 2570 просмотров
Решения вопроса 1
Создать список всех задач, и стратегию на исполнение.
var Actions = new Dictionary<String, Action> {
    {"foo", w.foo },
    {"bar", w.bar }
};

var Strategies = new Dictionary<String, List<String>>(){
    {"in one", new List<String> { "foo", "bar" } }
};


// run
var actions = Strategies["in one"];

actions.ForEach((action)=> Actions[action]());


Конечно же, можно `Actions` убрать и паковать методы сразу в стратегию, или использовать reflection для вызова методов. Делайте как больше нравится.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы