【问题标题】:Most extensible way to program a flowchart/wizard of questions?编程流程图/问题向导的最可扩展方式?
【发布时间】:2013-03-12 18:20:08
【问题描述】:

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

【问题讨论】:

    标签: design-patterns wizard flowchart


    【解决方案1】:

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

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

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

    你得到的是一个带有内置路由逻辑的IQuestions(可以是各种类型:MultipleChoiceQuestion、DateQuestion 等)的图表。

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

    那么您真正需要做的就是定义一个状态/事件表(有关更多信息,请参阅 wiki 说明),您的系统可以将其转换为该图表。

    您可能还想了解根据不同需求加载不同问卷图表的策略模式。

    【讨论】:

    • 感谢您的回答。这里有很多信息,所以即使我没有以这种方式实施它,我也很感激学习机会和你的回应时间。
    猜你喜欢
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2012-03-02
    • 2021-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多