Перебор списка типов - PullRequest
       5

Перебор списка типов

6 голосов
/ 04 марта 2010

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

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

Есть предложения?

Ответы [ 2 ]

2 голосов
/ 04 марта 2010

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

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

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

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

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

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

1 голос
/ 05 марта 2010

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...