2

在 Web 开发中,以最小化(或消除)状态为目标,大量关注 REST 风格的架构。我见过的web框架都强调这种风格(Django、Rails、flask等)。

虽然我同意这总体上非常适合网络,但也有很多情况下这是不够的。特别是我正在考虑您希望用户遵循流程的情况,即您想要提供许多步骤并且这些步骤应该按特定顺序完成(可能带有可选步骤、偏离路径等)

一个很好的例子可能是购物车:首先你必须做出选择,然后输入你的地址,选择发货类型,输入你的付款细节,完成。您不希望用户跳过任何这些步骤,并且该过程可能会变得更加复杂。理想情况下,我希望在单独的位置定义此过程,以将此逻辑与实现的其余部分分开。

现在我的问题:

  1. 有限状态机是通往这里的路吗?如果这些过程变得复杂并且需要进行大量更改(例如,这一步应该在这里,这一步应该进入这个过程等等),它们是否仍然可以很好地工作?

  2. Web 框架提供了哪些选项(不是我对最佳解决方案特别感兴趣)?

  3. 什么是此类过程发生的有趣/好的例子?购物车是一个明显的例子,但我相信还有更多。

4

1 回答 1

2
  1. 是的,他们是。使用状态机(工作流)是您描述的问题的合适解决方案。如果设计得好,它可以让你的代码更干净,消除代码中的混乱。每个状态的逻辑和转换逻辑都封装在一个 State 类对象中,因此代码看起来更清晰、更易于维护。实现可能会有所不同(例如,您将转换逻辑保留在状态中或创建单独的转换管理器的位置)并且与离散数学中状态机的规范描述不匹配,因此您最好尝试更适合您的方法。

  2. 对于 Ruby,您可以检查工作流程:https ://github.com/geekq/workflow或 stonepath:https ://github.com/bokmann/stonepath 。状态机模式也可以在 javascript 框架 (SpoutCore) 中找到。实现自己的小型状态机引擎并不难。

  3. 有趣的例子?其中很多。处理订单、银行业务、游戏。我在创建包含生理测试、游戏、视频的行为校正模块时使用了状态机。从状态到状态的转换取决于测试是否正确回答,游戏是否成功等。

PS。我使用状态机和工作流的术语作为同义词,但它们并不相同;在这里讨论过:http: //jmettraux.wordpress.com/2009/07/03/state-machine-workflow-engine/。您还可以在那里找到一些 Ruby 代码和链接。

于 2012-07-04T11:29:02.957 回答