科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道为Linux应用构造有限状态机方法(上) (3)

为Linux应用构造有限状态机方法(上) (3)

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

在描述有限状态机时,状态、事件、转换和动作是经常会碰到的几个基本概念。

作者:shenhuo 来源:赛迪网技术社区 2007年10月20日

关键字: 操作系统 方法 状态机 Linux

  • 评论
  • 分享微博
  • 分享邮件

使用switch语句实现的有限状态机的确能够很好地工作,但代码的可读性并不十分理想,主要原因是在实现状态之间的转换时,检查转换条件和进行状态转换都是混杂在当前状态中来完成的。例如,当城门处于Opened状态时,需要在相应的case中调用closeDoor()函数来检查是否有必要进行状态转换,如果是的话则还需要调用changeState()函数将当前状态切换到Closed。显然,如果在每种状态下都需要分别检查多个不同的转换条件,并且需要根据检查结果让状态机切换到不同的状态,那么这样的代码将是枯燥而难懂的。从代码重构的角度来讲,此时更好的做法是引入checkStateChange()和performStateChange()两个函数,专门用来对转换条件进行检查,以及激活转换时所需要执行的各种动作。这样一来,程序结构将变得更加清晰:

  switch (state) {
  
   // 处理状态Opened的分支
   case (Opened): {
    // 执行动作Open
    open();
    // 检查是否有激发状态转换的事件产生
    if (checkStateChange()) {
     // 对状态机的状态进行转换
     performStateChange();
    }
    break;
   }
  
   // 处理状态Closed的分支
   case (Closed): {
    // 执行动作Close
    close();
    // 检查是否有激发状态转换的事件产生
    if (checkStateChange()) {
     // 对状态机的状态进行转换
     performStateChange();
    }
    break;
   }
  
   // 处理状态Locked的分支
   case (Locked): {
    // 执行动作Lock
    lock();
    // 检查是否有激发状态转换的事件产生
    if (checkStateChange()) {
     // 对状态机的状态进行转换
     performStateChange();
    }
    break;
   }
  
   // 处理状态Unlocked的分支
   case (Unlocked): {
    // 执行动作Lock
    unlock();
    // 检查是否有激发状态转换的事件产生
    if (checkStateChange()) {
     // 对状态机的状态进行转换
     performStateChange();
    }
    break;
   }
  
  }

但checkStateChange()和performStateChange()这两个函数本身依然会在面对很复杂的状态机时,内部逻辑变得异常臃肿,甚至可能是难以实现。

在很长一段时期内,使用switch语句一直是实现有限状态机的唯一方法,甚至像编译器这样复杂的软件系统,大部分也都直接采用这种实现方式。但之后随着状态机应用的逐渐深入,构造出来的状态机越来越复杂,这种方法也开始面临各种严峻的考验,其中最令人头痛的是如果状态机中的状态非常多,或者状态之间的转换关系异常复杂,那么简单地使用switch语句构造出来的状态机将是不可维护的。

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章