深入淺出理解有限狀態機

2021-08-10 16:41:48 字數 2835 閱讀 9106

有限狀態機

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

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

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

1、狀態機的要素

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

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

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

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

④次態:條件滿足後要遷往的新狀態。「次態」是相對於「現態」而言的,「次態」一旦被啟用,就轉變成新的「現態」了。

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

狀態表

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

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

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

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

2、狀態機在object-c的**實現。

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

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

巨集定義

這裡沒有啥特殊的,主要是借助巨集定義,比較巧妙的實現列舉值到字串的轉換,比如列舉值statea,能自動生成字串@「statea」,用於後面的狀態函式名拼接。這是乙個通用的列舉值自動轉字串的解決方案,參考的鏈結(

2、model類定義

ios開發都會採用mvc架構或者相關變種,但是狀態的維護都會實現在model中。這裡定義了乙個簡單的testmodel,它有乙個成員變數state,儲存著當前的狀態。

model定義

3、實現model類的乙個category,

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

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

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

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

狀態中判斷事件

一種是事件中判斷狀態:

事件中判斷狀態

思考與討論:

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

優化後的狀態變化函式**,如下圖。

優化後

歡迎**謝謝大家的寶貴時間。

1.

有限狀態機

有限狀態機 finite state machine,fsm 又稱有限狀態自動機,簡稱狀態機,是表示有限個狀態以及在這些狀態之間的轉移和動作等行為的數學模型。狀態儲存關於過去的資訊,就是說 它反映從系統開始到現在時刻的輸入變化。轉移指示狀態變更,並且用必須滿足來確使轉移發生的條件來描述它。動作是在給...

有限狀態機

以前,只碰到過 陣列中所有數字只出現2次,只有乙個出現1次,找這個數的問題 每次迴圈異或陣列中元素,最後的結果就是single one。這次換作出現3次就懵逼了,主要原因,沒有使用過有限狀態機,應該說是連概念都沒有,所以這次一定要好好記錄一下 關於這道題的解釋discussion中woshidais...

有限狀態機

需要掌握的名詞 數字系統有兩大類有限狀態機 finite state machine,fsm moore狀態機和mealy狀態機。狀態機名 次態輸出 moore摩爾 f 現狀,輸入 g 現狀 mealy公尺粒 f 現狀,輸入 g 現狀,輸入 mealy型狀態機 下一狀態不但與當前狀態有關,還與當前輸...