【问题标题】:how do you folks handle complex state situations where order of operations is important?你们如何处理操作顺序很重要的复杂状态情况?
【发布时间】:2009-02-23 20:34:39
【问题描述】:

我遇到了这样一种情况,即我有多个交互小部件(在 Web UI 上),所有这些小部件都可以处于多种不同的状态,并且它们的行为取决于其他人。我遇到的情况是,例如,一组数据被排序两次,或者数据在排序之前被显示,而不是相反。这是一个有点古怪的问题,我认为我已经简化了一些事情并让它工作,只是发现我在其他地方破坏了一些东西。

我的函数可以做以下事情:

widgetAFunction
  load data into widget B
  tell widget B to sort the data
  tell widget B to display the data

我对代码重用的热爱让我想做一些事情,比如在小部件 A 中编写一个 loadData 函数,如下所示:

widgetBLoadDataFunction
  update data
  sort the data
  refresh the view

因此,widgetA 所要做的就是在 widgetB 上调用一个函数。但是有些情况我只想对数据进行排序,而不更新数据,所以我写:

widgetBSortFunction
  sort the data
  refresh the view

然后也许我想要一个过滤功能

widgetBFilterFunction 过滤数据 刷新视图

也许我想更新数据但不排序,所以我有

widgetBNoSortLoadDataFunction
  update data
  refresh the view

它看起来并不复杂,但我最终得到了这些非常长、非常脆弱的函数调用链,或者一堆非常相似的调用。正如 Martin Fowler 所说,代码变得有点臭了。

那么,我还有什么其他选择?我在最近的一个项目中做了一些事情,我做了一个状态机之类的事情,我注册了一堆带有一组条件的函数,或者会触发它们执行的状态。这有点效果,我认为这种方法可能会很好地再次使用。

有谁知道我在说什么,甚至更好的是,谁能指出一些有助于我更好地理解这个问题的模式?

【问题讨论】:

    标签: javascript design-patterns architecture user-interface


    【解决方案1】:

    您需要的是finite state machine 实现。基本上每个有限状态机都需要:

    • 程序响应的事件
    • 程序在事件之间等待的状态
    • 响应事件的状态转换
    • 过渡期间采取的行动
    • 保存事件之间操作所需值的变量

    good article from IBM 教你一种通过 Javascript 实现它的方法。

    编辑Here is a FSM builder,因此您不必自己构建。

    【讨论】:

    • 谢谢费尔南多。您的回复证实了我一直在倾斜的方式。
    • 感谢 FSM 构建器。我希望我在开始时就意识到这个项目会变得多么复杂!我以为我可以把所有的东西都拍在一起,但现在,要做得对,我将不得不解开很多意大利面!
    • 很多时候,我们对一个项目感到过于乐观,直到自己在时间线上太远才意识到它变得多么庞大和复杂,因为我们通常倾向于开发过大和过于笼统的应用程序。这是像我这样的完美主义者倾向于犯的罪
    • 那不是我的特殊罪过。我对我的这个项目的代码特别可重用没有任何幻想。但我确实希望它是可维护的!
    【解决方案2】:

    Fernando 已经提到了 FSM,并提供了很好的信息和链接。 :)

    此外,我要补充一点,您的类应该已经包含足够的状态,这样您就不必担心排序两次等。即,widgetB.sort() 应该检查自上次更新以来它是否已排序并返回如果是这样的话。这样做几乎没有缺点,而且它可以提高性能(并保护一致性)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-13
      • 2012-02-08
      • 2010-09-13
      • 1970-01-01
      • 2015-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多