我发现自己不时会做这种事情,我想知道这是否有设计气味,或者我是否有更好的设计模式。
有一个过程包含许多在编译时已知的步骤,但很可能会改变。我在抽象的Step类中捕获通用性,编写一个StepLister,它返回一个步骤列表,一个用于Step的每个派生类,然后是一个调用StepLister的StepsRunner,然后迭代列表并运行每个步骤。有时一步取决于前一步的结果,有时不取决于。
有什么建议吗?
答案 0 :(得分:2)
你的方法对我来说听起来很合理(迭代器/策略的组合)。
有时,一步将取决于上一步的结果,有时不会。
这一点可能很有趣。由于我不知道每个步骤应该特别做什么,我只能提供非常一般的想法。
所有步骤之间的依赖关系可以通过interpreter-like语法树而不是您采取的顺序步骤建模。因此,您的StepRunner
将被弃用,以支持上下文/解释方法。
另一个想法可能是monads的使用,它允许你顺序地将步骤粘合在一起,但我不知道这将如何容易地集成你现有的面向对象的概念(因为monad通常用于< em>功能性编程)。
也许你根本不需要(过度)使事情复杂化;)
答案 1 :(得分:1)
我不确定我是否正确理解了这个问题,但由于您按顺序运行步骤,我将假设存在一些上下文信息,因此您正在讨论根据当前结果选择下一步之一。
事实上,这就是自动机的意义所在。您可以通过转换将各种状态链接在一起。
要求每个步骤返回一些tag
,可能只是一个字符串或一个适当定义的类型,这很容易。
然后,通过确定当前步骤的每个可能输出的下一步来定义自动机。
例如,我实际上使用了一个框架(在工作中)将这些转换作为xml
文件... ...即使我非常不喜欢这样的事实,即在转移时是否进行了很少的检查正确定义。
请注意,在C ++中可以在编译时检查它(我正在考虑使用Boost.Variant
和一些metatemplate编程技巧)。