编程流程图/向导问题的最可扩展方法?

时间:2013-03-12 18:20:08

标签: design-patterns wizard flowchart

我被要求更新现有的“向导”,向用户呈现一系列线性问题。我通过参考客户端提供的流程图来完成更新此向导的任务。该流程图显着偏离当前流程。鉴于目前所有内容都是用问题编号和有效答案进行硬编码,因此很难对所需的更改进行整理 这让我想知道人们将使用什么样的技术来建模问题和答案的流程图/向导。我已经看到了使用有限状态机的参考,但这似乎不太合适。我正在寻找一种技术,可以轻松移动,插入和删除现有问题,而无需对硬编码引用的集合进行排序。我已经考虑过使用一个可以通过CSV加载的数组,但不确定这会随着问题列表的增加而轻松维护。
请注意,待处理请求还允许在任何时候跳入和跳出向导,具体取决于对话的流程。 为了避免“问题太广泛”的反应,我正在寻找专门为此用途创建的特定模式或技术而不是可能性列表。 谢谢!

1 个答案:

答案 0 :(得分:2)

为什么有限状态机不适合?请参阅this wiki about finite-state machine中的旋转门示例。

查看他们所拥有的“状态转换表”,您可以轻松地将列标题视为IQuestion接口的属性:

  • 当前状态:当前IQuestion
  • 输入:IQuestion.Answer
  • 下一个状态:IQuestion.NextIQuestion
  • 输出:无论它对您的系统有什么影响。

你得到的是IQuestion s(可以是各种类型:MultipleChoiceQuestion,DateQuestion等)的图表,它们内置了路由逻辑。

您似乎担心重复/重新排序问题,您可以通过一些抽象来处理。也许make IQuestion不关心路由问题,只有QuestionTextPossibleAnswers等属性,然后有一个IQuestionNode可以存储实际的图表/路由问题。它可以处理评估IQuestion并根据固定序列或通过检查当前问题的选定答案提供指向下一个问题的指针。

然后您真正需要做的就是定义一个State / Event表(有关详细信息,请参阅wiki说明),您的系统可以将其转换为此图。

您可能还想看一下策略模式,根据不同的需求加载不同的问卷图表。