@trauus

Как залезть на несколько уровней абстракции ниже, не плодя кривой код?

Есть приложение-прокси, которое запрашивает команды с сервера и отправляет их на нужные локальные адреса.
Прокси не знает и не заглядывает во внутренний формат команд, все они обрабатываются одинаково.

Возникла задача для двух определенных команд реализовать отдельную стратегию обработки с частичным разбором внутреннего формата.

На ум приходит некрасивое решение - непосредственно в общий код обработки команд добавить:

if(command_type == A)
{
	Xml.Parse(command_payload);
	if(Xml.ContainsKey("some_key")
	{
		DoSomething1();
	}
	else
	{
		DoSomething2();
	}
}
else
{
	ProcessGenericCommand();
}


Понимаю, что это плохое решение, но опыта не хватает понять, как сделать лучше.

Как правильно решаются такие задачи?
  • Вопрос задан
  • 411 просмотров
Пригласить эксперта
Ответы на вопрос 5
GavriKos
@GavriKos
Словарь, где ключ - тип команды, значение - обработчик.
Если тип команды в словаре не найден - скармливаем дефалтовому обработчику. Если найден - то скармливаем по значению.
Ответ написан
lxsmkv
@lxsmkv
Test automation engineer
может запрашивать только команды для определенного сервиса? при таком подходе можно выполнять обработку асинхронно. будет выигрыш в перформансе. (чем больше логики в передающем механизме тем больше он становится узким местом. парсинг xml вообще дело сравнительно медленное) тогда разбирать сваленные в кучу данные придется сервису подающему вам данные.
Ответ написан
Комментировать
ApeCoder
@ApeCoder
Варианты:
- событие которое разборщик вызывает после понимания команды. Если обработчик события не обработал, вызывается дефолтное.
- Паттерн стратегия
- То же самое, только DI контейнером или абстрактной фабрикой или еще какой штукой
Ответ написан
Комментировать
@zahardzhan
Такие задачи изящно решаются при помощи методов аспектно-ориентированного программирования, в качестве примера можно посмотреть на комбинаторы методов Common Lisp Object System.
Ответ написан
Комментировать
@ddd329
Вот самый подходящий паттерн Цепочка обязанностей
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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