2010-03-04 10 views
6

Me encuentro haciendo este tipo de cosas de vez en cuando, y me pregunto si es un olor de diseño, o si hay un mejor patrón de diseño que puedo usar.iterando sobre una lista de tipos

Hay un proceso con una serie de pasos conocidos en tiempo de compilación, pero es probable que cambien en el futuro. Capturo las características comunes en una clase de pasos abstracta, escribo un StepLister que devuelve una lista de pasos, uno para cada clase derivada de Step, y luego un StepsRunner que llama a StepLister, luego itera sobre la lista y ejecuta cada paso. A veces, un paso dependerá del resultado de un paso anterior, a veces no.

¿Alguna sugerencia?

Respuesta

2

Su enfoque me parece razonable (una combinación de iteradores/estrategias).

A veces, un paso dependerá del resultado de un paso anterior, a veces no.

Aunque este punto puede ser interesante. Como no sé qué se supone que debe hacer cada paso en particular, no puedo dar más que ideas muy generales.

Las dependencias entre todos los pasos se pueden modelar a través de un árbol de sintaxis interpreter-like en lugar de seguir pasos secuenciales. Por lo tanto, su StepRunner se descartará a favor de los métodos de contexto/interpretación.

Otra idea podría ser el uso de monads, que le permiten secuencialmente los pasos de pegamento juntos, pero no sé qué facilidad esto va a integrar su concepto orientado a objetos existentes (ya que las mónadas se suelen utilizar en la programación funcional )

Tal vez usted no necesita (sobre) complicar las cosas en absoluto;)

1

No estoy seguro de haber entendido la pregunta correcta, pero ya se está ejecutando pasos en secuencia, voy a suponer que no hay se mantiene cierta información contextual y, por lo tanto, está hablando de seleccionar el siguiente paso en función del resultado del actual.

Esto es, de hecho, de lo que se trata un autómata. Tienes varios estados unidos por transiciones.

Es bastante fácil pedir cada paso para devolver algo de tag, quizás simplemente una cadena o un tipo adecuadamente definido.

Luego, defina el autómata determinando el siguiente paso para cada una de las posibles salidas del paso actual.

Por ejemplo, de hecho utilizo un marco (en el trabajo) que toma esas transiciones como un archivo xml ... aunque no me agrada el hecho de que haya pocas comprobaciones hechas o no, las transiciones están definidas correctamente.

Tenga en cuenta que en C++ podría verificarse en tiempo de compilación (estoy pensando en usar Boost.Variant y algunos trucos de programación de metatemplate).

Cuestiones relacionadas