迭代一个类型列表

时间:2010-03-04 14:15:07

标签: design-patterns oop

我发现自己不时会做这种事情,我想知道这是否有设计气味,或者我是否有更好的设计模式。

有一个过程包含许多在编译时已知的步骤,但很可能会改变。我在抽象的Step类中捕获通用性,编写一个StepLister,它返回一个步骤列表,一个用于Step的每个派生类,然后是一个调用StepLister的StepsRunner,然后迭代列表并运行每个步骤。有时一步取决于前一步的结果,有时不取决于。

有什么建议吗?

2 个答案:

答案 0 :(得分:2)

你的方法对我来说听起来很合理(迭代器/策略的组合)。

  

有时,一步将取决于上一步的结果,有时不会。

这一点可能很有趣。由于我不知道每个步骤应该特别做什么,我只能提供非常一般的想法。

所有步骤之间的依赖关系可以通过interpreter-like语法树而不是您采取的顺序步骤建模。因此,您的StepRunner将被弃用,以支持上下文/解释方法。

另一个想法可能是monads的使用,它允许你顺序地将步骤粘合在一起,但我不知道这将如何容易地集成你现有的面向对象的概念(因为monad通常用于< em>功能性编程)。

也许你根本不需要(过度)使事情复杂化;)

答案 1 :(得分:1)

我不确定我是否正确理解了这个问题,但由于您按顺序运行步骤,我将假设存在一些上下文信息,因此您正在讨论根据当前结果选择下一步之一。

事实上,这就是自动机的意义所在。您可以通过转换将各种状态链接在一起。

要求每个步骤返回一些tag,可能只是一个字符串或一个适当定义的类型,这很容易。

然后,通过确定当前步骤的每个可能输出的下一步来定义自动机。

例如,我实际上使用了一个框架(在工作中)将这些转换作为xml文件... ...即使我非常不喜欢这样的事实,即在转移时是否进行了很少的检查正确定义。

请注意,在C ++中可以在编译时检查它(我正在考虑使用Boost.Variant和一些metatemplate编程技巧)。