你们如何处理操作顺序重要的复杂状态?

时间:2009-02-23 20:34:40

标签: javascript design-patterns architecture user-interface

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

我的功能包括:

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

我对代码重用的热爱让我想要做一些事情,比如在widget 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所说,代码变得有点臭。

那么,我还有其他选择吗?我在最近的一个项目中做了一些事情,我做了一个状态机的事情,在那里我注册了一系列具有一系列条件的函数,或者触发它们执行的状态。这工作得很好,我认为这种方法可能会再次使用。

有谁知道我在这里谈论的是什么,甚至更好,有人能指出我的某些模式会帮助我更好地理解这一点吗?

2 个答案:

答案 0 :(得分:4)

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

  
      
  • 程序响应的事件
  •   
  • 程序在事件之间等待的状态
  •   
  • 状态之间的转换以响应事件
  •   
  • 转换期间采取的措施
  •   
  • 包含事件之间操作所需值的变量
  •   

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

修改Here is a FSM builder,因此您无需自行构建。

答案 1 :(得分:0)

费尔南多已经提到过FSM,并提供了很好的信息和链接。 :)

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