Коллеги, добрый день.
Возникла архитектурная задачка, которую сходу не осилил.
Итак, в приложении есть некий процессинг данных, зависящий от двух параметров(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), то во-первых получается дофига классов А, а во-вторых сильно теряется читаемость.
Сейчас склоняюсь к тому чтобы повторить всё как есть, но буду рад если подскажете прорывную идею.