Матричный полиморфизм? Коллеги, добрый день.
Возникла архитектурная задачка, которую сходу не осилил.
Итак, в приложении есть некий процессинг данных, зависящий от двух параметров(m, n). В зависимости от комбинации параметров могут выполнятся какие-то действия, иногда одинаковые, для разные параметров, иногда разные. Итого имеем матрицу MxN, где в каждой ячейке которой — некое действие A. Соотношение количества вариантов параметров и действий примерно следующее M~=N~=A/3.
Старая реализация сделана в виде гигантского switch по M c вложенными свитчами по N (всего 230 строк на Delphi).
Типичный кусок выглядит примерно так (в псевдокоде)case m_5:
{
switch(n)
case (n3,n5,n6,n18): {какой-то небольшой код}
case (n4,n6,n8,n9): {какой-то небольшой код}
default: {какой-то небольшой код}
}

Сейчас этот код переносится на С++ и захотелось сделать его красивым набором понятных классов. Сначала хотел сделать классы для каждого N с необходимыми виртуальными методами для М. Но тогда получается много дублирования кода, т.к. для заданного N действия для нескольких M обязательно совпадают. То же самое если поменять M на N. Если сделать набор классов для А, параметризовав фабрику значениями (m,n), то во-первых получается дофига классов А, а во-вторых сильно теряется читаемость.
Сейчас склоняюсь к тому чтобы повторить всё как есть, но буду рад если подскажете прорывную идею.

21 Авг 2019 в 07:10
157 +1
0
Ответы
1

Для решения данной задачи можно воспользоваться шаблоном "Стратегия" (Strategy).

Создайте интерфейс стратегии, который будет определять методы для выполнения действий в зависимости от параметров m и n.Реализуйте различные стратегии, соответствующие разным комбинациям параметров m и n. Каждая стратегия будет содержать реализацию методов интерфейса.Создайте класс-контекст, который будет содержать текущую стратегию и вызывать её методы для выполнения действий.При передаче значений m и n классу контекста, он будет выбирать соответствующую стратегию из заданного набора и выполнять необходимые действия.

Такой подход позволит избежать большого количества дублирования кода и сделает структуру более расширяемой и гибкой.

20 Апр в 13:06
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 83 913 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир