2010-03-04 10 views
6

Я время от времени занимаюсь этим, и мне кажется, что это дизайнерский запах, или если есть лучший дизайн, который я могу использовать.Итерация над списком типов

Существует процесс с несколькими шагами, который известен во время компиляции, но, скорее всего, изменится по дороге. Я фиксирую общность в абстрактном классе Step, пишу StepLister, который возвращает список шагов, по одному для каждого производного класса Step, а затем StepsRunner, который вызывает StepLister, затем выполняет итерации по списку и запускает каждый шаг. Иногда один шаг будет зависеть от результата предыдущего шага, иногда нет.

Любые предложения?

ответ

2

Ваш подход звучит разумно для меня (сочетание итераторов/стратегий).

Иногда один шаг будет зависеть от результата предыдущего шага, иногда нет.

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

Зависимости между всеми этапами могут быть смоделированы с помощью синтаксического дерева interpreter-like вместо последующих шагов. Поэтому ваш StepRunner будет отброшен в пользу методов контекста/интерпретации.

Другая идея может быть использованием monads, которые позволяют последовательно шаги склеить, но я не знаю, как легко это будет интегрировать существующие объектно-ориентированные концепции (с монадой, как правило, используется в функциональном программировании).

Может быть, вам не нужно (сверх-) усложнять на всех;)

1

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

Это, по сути, то, что касается автомата. У вас есть разные состояния, связанные между собой переходами.

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

Затем вы определяете автомат, определяя следующий шаг для каждого из возможных выходов текущего шага.

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

Обратите внимание, что в C++ он может быть проверен во время компиляции (я думаю об использовании Boost.Variant и некоторых трюков программирования метатемов).

Смежные вопросы