JavaScript有限状态机

作者: ferrint | 来源:发表于2017-03-02 10:49 被阅读17次

    关键词:有限状态机(Finite-state machine)

    特征:

    • 状态总数(state)是有限的。
    • 任一时刻,只处在一种状态之中。
    • 某种条件下,会从一种状态转变(transition)到另一种状态。

    JavaScript中很多对象可以写成有限状态机。

    比如,网页上有一个菜单元素。鼠标悬停的时候,菜单显示;鼠标移开的时候,菜单隐藏。如果使用有限状态机描述,就是这个菜单只有两种状态(显示和隐藏),鼠标会引发状态转变。

    用代码演示就是这样:

          
        // 当前状态
        currentState: 'hide',
      
        // 绑定事件
        initialize: function() {
          var self = this;
          self.on("hover", self.transition);
        },
      
        // 状态转换
        transition: function(event){
          switch(this.currentState) {
            case "hide":
              this.currentState = 'show';
              doSomething();
              break;
            case "show":
              this.currentState = 'hide';
              doSomething();
              break;
            default:
              console.log('Invalid State!');
              break;
          }
        }
      
      };
    

    可以看到,有限状态机的写法,逻辑清晰,表达力强,有利于封装事件。一个对象的状态越多、发生的事件越多,就越适合采用有限状态机的写法。

    另外,JavaScript语言是一种异步操作特别多的语言,常用的解决方法是指定回调函数,但这样会造成代码结构混乱、难以测试和除错等问题。有限状态机提供了更好的办法:把异步操作与对象的状态改变挂钩,当异步操作结束的时候,发生相应的状态改变,由此再触发其他操作。这要比回调函数、事件监听、发布/订阅等解决方案,在逻辑上更合理,更易于降低代码的复杂度。

    相关文章

      网友评论

        本文标题:JavaScript有限状态机

        本文链接:https://www.haomeiwen.com/subject/ltehgttx.html