日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入浅出理解有限状态机

發布時間:2025/3/21 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入浅出理解有限状态机 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
有限狀態機

有限狀態機是一種用來進行對象行為建模的工具,其作用主要是描述對象在它的生命周期內所經歷的狀態序列,以及如何響應來自外界的各種事件。在計算機科學中,有限狀態機被廣泛用于建模應用行為、硬件電路系統設計、軟件工程,編譯器、網絡協議、和計算與語言的研究。比如下圖非常有名的TCP協議狀態機。

其實我們在編程時實現相關業務邏輯時經常需要處理各種事件和狀態切換,寫各種switch/case 和if/else ,所以我們其實可能一直都在跟有限狀態機打交道,只是可能沒有意識到。在處理一些業務邏輯比較復雜的需求時,可以先看看是否適合用一個有限狀態機來描述,如果可以把業務模型抽象成一個有限狀態機,那么代碼就會邏輯特別清晰,結構特別規整。

下面我們就來聊聊所謂的狀態機,以及它如何在代碼中實現。

1、狀態機的要素

狀態機可歸納為4個要素,即現態、條件、動作、次態。“現態”和“條件”是因,“動作”和“次態”是果。詳解如下:

①現態:是指當前所處的狀態。

②條件:又稱為“事件”。當一個條件被滿足,將會觸發一個動作,或者執行一次狀態的遷移。

③動作:條件滿足后執行的動作。動作執行完畢后,可以遷移到新的狀態,也可以仍舊保持原狀態。動作不是必需的,當條件滿足后,也可以不執行任何動作,直接遷移到新狀態。

④次態:條件滿足后要遷往的新狀態。“次態”是相對于“現態”而言的,“次態”一旦被激活,就轉變成新的“現態”了。

我們可以用狀態表了表示整個過程,如下圖所示。

狀態表

這里需要注意的兩個問題:

1、避免把某個“程序動作”當作是一種“狀態”來處理。那么如何區分“動作”和“狀態”?“動作”是不穩定的,即使沒有條件的觸發,“動作”一旦執行完畢就結束了;而“狀態”是相對穩定的,如果沒有外部條件的觸發,一個狀態會一直持續下去。

2、狀態劃分時漏掉一些狀態,導致跳轉邏輯不完整。

所以維護上述一張狀態表就非常必要,而且有意義了。從表中可以直觀看出那些狀態直接存在跳轉路徑,那些狀態直接不存在。如果不存在,就把對應的單元格置灰。 每次寫代碼之前先把表格填寫好,并且對置灰的部分重點review,看看是否有“漏態”,然后才是寫代碼。QA拿到這張表格之后,寫測試用例也是手到擒來。

2、狀態機在object-C的代碼實現。

我在開發百度地圖導航過程頁以及百度CarLife的反控手機識別中都用到了有些狀態機編程,下面我結合個人的經驗,給大家分享一個iOS程序中實現有限狀態機的寫法。

先回顧一下上面那個狀態表,其中狀態變遷時執行的動作,可能是由一系列的元動作組成,并且通常都是跟現態和次態強相關的,所以,我把狀態表做一個改進,如下所示:

其中:FSM_FUN(stateA,stateB) 就表示,從狀態stateA跳轉到stateB時要執行的所有元動作的有序集。

1、準備工作,狀態定義和事件定義

宏定義

這里沒有啥特殊的,主要是借助宏定義,比較巧妙的實現枚舉值到字符串的轉換,比如枚舉值stateA,能自動生成字符串@“stateA”,用于后面的狀態函數名拼接。這是一個通用的枚舉值自動轉字符串的解決方案,參考的鏈接( http://stackoverflow.com/a/202511)

2、Model類定義

iOS開發都會采用MVC架構或者相關變種,但是狀態的維護都會實現在Model中。這里定義了一個簡單的TestModel,它有一個成員變量state,保存著當前的狀態。

Model定義

3、實現Model類的一個category,

里面主要定義和實現了狀態跳轉時要執行的一些動作。

4、重新Model的setState方法,使得在設置狀態時能自動去執行狀態跳轉時需要執行的動作。

5、處理事件輸入,實現狀態跳轉邏輯。

這里有兩種寫法,一種是在狀態中判斷事件:

狀態中判斷事件

一種是事件中判斷狀態:

事件中判斷狀態

思考與討論:

狀態跳轉邏輯的兩種寫法,實現的功能和效果完全相同,孰優孰劣,歡迎留言探討。

本人觀點:一般業務場景來說,狀態的數量是確定的切數目較少,不同狀態下需要處理的事件也不一樣。而觸發的事件數量則比較多,采用上面第二種方式在事件中判斷狀態也有利于把里面一層的switch/case剝離出來當成單獨的函數,做一些代碼模塊結構的優化,故推薦使用第二種方式,事件中判斷狀態

優化后的狀態變化函數代碼,如下圖。

優化后

歡迎探討

本文主要介紹了一下什么是有限狀態機,然后通過一個具體的代碼示例介紹了一些本人在狀態機編程上的經驗和理解,歡迎各位進行交流指正。

謝謝大家的寶貴時間。

作者:我是云峰小羅 鏈接:http://www.jianshu.com/p/5eb45c64f3e3 來源:簡書 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。

總結

以上是生活随笔為你收集整理的深入浅出理解有限状态机的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 色噜噜成人 | 日韩国产亚洲欧美 | 成av人在线 | 91tv在线观看| 欧美日比视频 | 黄色av片三级三级三级免费看 | 国产寡妇亲子伦一区二区三区四区 | 国产视频首页 | 欧美巨大荫蒂茸毛毛人妖 | 国产成人无码av在线播放dvd | 少妇无码吹潮 | 国产精品5 | 漂亮人妻洗澡被公强 日日躁 | 国产美女菊爆在线播放APP | 免费在线黄色网 | 亚洲免费视频播放 | 日韩一级免费观看 | 亚洲精品9999 | 国产麻豆精品视频 | 国产成人精品一区二 | 深夜视频在线看 | 午夜你懂的 | 男人插女人的网站 | 亚洲美女性生活视频 | a级黄色一级片 | 蜜桃视频在线观看一区二区 | 中文字幕15页 | 在线观看黄色av网站 | 蜜桃精品成人影片 | 在线观看日韩 | 亚洲福利视频网站 | 欧美黑人又粗又大又爽免费 | 性色av一区二区三区 | 91免费在线观看网站 | www.偷拍.com | 国产精品波多野结衣 | 国产v片| 中国久久| 成人精品视频在线 | 亚洲国产欧美在线观看 | 中文字幕在线视频免费观看 | 一区二区三区四区在线免费观看 | 大象传媒成人在线观看 | 日本三级少妇 | 亚洲成人伊人 | 日本边添边摸边做边爱 | 天天爱天天爽 | 无码国内精品人妻少妇蜜桃视频 | 黄色成人在线免费观看 | 激情文学8888| 黄色资源网站 | 91九色蝌蚪91por成人 | 日本新japanese乱熟 | 欧美国产二区 | 久久精品欧美一区二区三区不卡 | 韩国一区二区三区四区 | 国产中文字幕免费 | 亚洲成av人片在线观看无 | 日本少妇在线 | 精品无码av一区二区三区 | 亚洲免费在线视频观看 | 天堂在线播放 | 少妇一级淫免费播放 | 好男人网站| 寂寞午夜影院 | 欧美综合第一页 | 亚洲天堂123 | 伊人三区 | 成人一级生活片 | 日韩欧美视频网站 | 日韩黄大片 | 精品一区视频 | 韩国中文三级hd字幕 | 91精品视频国产 | 免费黄色小视频在线观看 | xxxx日本少妇| 97久久人人超碰caoprom欧美 | 精品视频91| 黄页在线观看 | 女性裸体不遮胸图片 | 俄罗斯毛片基地 | 波多野结衣小视频 | 波多野结衣中文字幕在线 | 91免费在线观看网站 | 国产做爰免费视频观看 | www.97色| 男女猛烈无遮挡 | 国产欧美精品一区二区在线播放 | 国产精品人 | 国产日韩一级片 | 色欲久久久天天天精品综合网 | 日韩中文字幕一区二区三区 | 色婷婷18 | 蜜桃久久av一区 | 自拍视频在线观看 | wwww日本60 | 日本天堂免费a | 人妻无码久久一区二区三区免费 | 美女人人操 |