產(chǎn)品經(jīng)理不得不知的——有限狀態(tài)機

10 評論 10662 瀏覽 32 收藏 9 分鐘

編輯導讀:狀態(tài)機可以對業(yè)務狀態(tài)進行梳理,一目了然,之后可以根據(jù)業(yè)務場景不斷增加。它雖然不是做好一款產(chǎn)品的必備品,但是卻可以讓你在跟技術等人員溝通時效率更高。文章對有限狀態(tài)機進行了簡要的介紹,與大家分享。

一、地址的分析和識別

以前每次搬家,要重新寫收貨地址時,我都會特別小心,要去百度地圖上搜一下地址的完整寫法,生怕一不小心寫錯或寫漏了就收不到包裹了(捂臉)。直到某天我看到有限狀態(tài)機的原理,才知道我太天真了。

比如騰訊公司在深圳的地址,有如下的各種寫法:

  • 廣東省深圳市騰訊大廈
  • 廣東省518075深圳市南山區(qū)科技園騰訊大廈
  • 深圳市510875科技園騰訊大廈
  • 深圳市南山區(qū)科技園騰訊大廈
  • 廣東省深圳市科技園中一路騰訊公司…

這些地址寫得都有點不清楚,那么程序是如何準確地識別這些信息呢?下圖所示的是一個識別中國地址有限狀態(tài)機的例子。

  1. 每一個有限狀態(tài)機都有一個開始狀態(tài)和一個終止狀態(tài),以及若干中間狀態(tài)。
  2. 每一條弧上帶有從一個狀態(tài)進入下一個狀態(tài)的條件。
  3. 如果一個地址能從狀態(tài)機的開始狀態(tài)進過狀態(tài)機的若干中間狀態(tài),走到終止狀態(tài),那么這條地址有效,否則無效。

比如“北京市雙清路83號”對于上面的狀態(tài)機有效,而“上海市遼寧省馬家莊”則無效。

二、什么是有限狀態(tài)機

有限狀態(tài)機(Finite-state machine)是一個非常有用的模型,可以模擬世界上大部分事物。

它有三個特征:

  • 狀態(tài)總數(shù)(state)是有限的。
  • 任一時刻,只處在一種狀態(tài)之中。
  • 某種條件下,會從一種狀態(tài)轉變(transition)到另一種狀態(tài)。

現(xiàn)實世界中存在大量具有有限個狀態(tài)的系統(tǒng):鐘表系統(tǒng)、電梯系統(tǒng)、交通信號燈系統(tǒng)、通信協(xié)議系統(tǒng)、正則表達式、硬件電路系統(tǒng)設計、軟件工程,編譯器等,有限狀態(tài)機的概念就是來自于現(xiàn)實世界中的這些有限系統(tǒng)。

下面是一個可樂機的狀態(tài)圖。

從圖中就可以清楚地看到可樂機的運行過程,圖中直觀地表現(xiàn)了可樂機投入不同金額硬幣時的情況以及幾個處理步驟的各個狀態(tài)和它們之間的轉換關系,根據(jù)投入硬幣的不同面值,對總金額進行計算,并對各種操作進行響應以完成一次購買。?狀態(tài)機的動態(tài)結構使得其在通訊系統(tǒng),數(shù)字協(xié)議處理系統(tǒng),控制系統(tǒng),用戶界面等領域得到了廣泛地應用。

上圖是非常有名的TCP協(xié)議狀態(tài)機。這個狀態(tài)機我沒看懂,放在這里拋磚引玉吧。

三、有限狀態(tài)機的應用

有限狀態(tài)機有多種實現(xiàn)方式

1. switch-case或if-else

舉例來說,網(wǎng)頁上有一個菜單元素。鼠標懸停的時候,菜單顯示;鼠標移開的時候,菜單隱藏。如果使用有限狀態(tài)機描述,就是這個菜單只有兩種狀態(tài)(顯示和隱藏),鼠標會引發(fā)狀態(tài)轉變。

當狀態(tài)量少并且各個狀態(tài)之間變化的邏輯比較簡單時,使用switch語句實現(xiàn)的有限狀態(tài)機的確能夠很好地工作,但代碼的可讀性并不十分理想。在很長一段時期內,使用switch語句一直是實現(xiàn)有限狀態(tài)機的唯一方法,甚至像編譯器這樣復雜的軟件系統(tǒng),大部分也都直接采用這種實現(xiàn)方式。

但之后隨著狀態(tài)機應用的逐漸深入,構造出來的狀態(tài)機越來越復雜,這種方法也開始面臨各種嚴峻的考驗,其中最令人頭痛的是如果狀態(tài)機中的狀態(tài)非常多,或者狀態(tài)之間的轉換關系異常復雜,那么簡單地使用switch語句構造出來的狀態(tài)機將難以擴展和維護。

2. 狀態(tài)表

我們還可以用狀態(tài)表來表示狀態(tài)的轉化過程,以一個游戲中的簡單設定為例:


這段需求相信大家一眼就可以看明白,現(xiàn)在我們用狀態(tài)機來表示,大概是這樣:

看完這個圖,是不是有種似曾相識的感覺。產(chǎn)品經(jīng)理在做復雜的業(yè)務需求時,往往會遇到狀態(tài)的變更,一般我們會畫流程圖來表示(比如一個審核流程),偶爾也會用表格的形式來表示(比如內容平臺的發(fā)布流程)。

但是我們在做的時候往往沒有考慮過有限狀態(tài)機的這種表述方式,或者說考慮得不夠全面,如果用有限狀態(tài)機的這種方式,那就是可以直接供測試人員使用的一個測試用例了,想想測試同學雀躍的心情吧。

四、總結

狀態(tài)機表示有限個狀態(tài)以及在這些狀態(tài)之間的轉移和動作等行為的數(shù)學模型。

通俗的描述狀態(tài)機就是定義了一套狀態(tài)変更的流程:狀態(tài)機包含一個狀態(tài)集合,定義當狀態(tài)機處于某一個狀態(tài)的時候它所能接收的事件以及可執(zhí)行的行為,執(zhí)行完成后,狀態(tài)機所處的狀態(tài)。

狀態(tài)機主要的應用場景就是流程控制。一個狀態(tài)機定義以后,在某個狀態(tài)下就只接收固定的Event,也就是執(zhí)行指定的操作,這樣流程就能按照預期定義的那樣流轉,不會出現(xiàn)亂入的情況,執(zhí)行了一些在某狀態(tài)下不允許執(zhí)行的操作。

一個很典型的應用就是工作流引擎:以工作流中典型的審批流程為例,審批流程按照預先定義的流程流轉的固定的某些人手里,只有這一批固定的人才能審批,當審批后(可能是一個人審批,也可能是多個人審批)才會流轉到下個節(jié)點,由下個節(jié)點的審批人繼續(xù)審批,一直流轉到最后一個節(jié)點。

狀態(tài)機的流轉可以人工干預,也可以自動流轉。定義為自動流轉后,把業(yè)務流程定義完成后,只要添加一個定時任務,整個流程的運轉就都由狀態(tài)機來完成了。

寫到這,只想說一句話,無處不狀態(tài)機!

#專欄作家#

CARRIE,人人都是產(chǎn)品經(jīng)理專欄作家。關注新技術新服務。

本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉載

題圖來自Unsplash,基于CC0協(xié)議

更多精彩內容,請關注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 不錯

    來自廣東 回復
  2. 有干貨,信號不好,滑動式小表情被點到了,取消不掉呀……

    來自上海 回復
  3. 嘿,計算機專業(yè)學過狀態(tài)機,沒想到在產(chǎn)品領域也看到了,很有意思

    來自廣東 回復
  4. 贊!感謝分享!

    來自上海 回復
  5. 地址那個不是決策樹嗎 拿狀態(tài)機做類比?
    這也不是一個東西啊

    來自北京 回復
    1. 地址的那個例子是取自吳軍博士的《數(shù)學之美》— —“地址分析和有限狀態(tài)機”章節(jié)。
      決策樹和狀態(tài)機我認為區(qū)別在于:決策樹是樹形結構,一組值經(jīng)過決策樹后會形成一條唯一路徑;而狀態(tài)機中間的多個狀態(tài)是可以循環(huán),甚至是可以自循環(huán)的。

      來自北京 回復
    2. 認同你對這個區(qū)別的理解 只是個人覺得決策樹和狀態(tài)機用來做類比實屬有點牽強

      來自北京 回復
    3. 嗯嗯 感謝建議~

      來自北京 回復
  6. 好像講了很多,但是看不懂。。。

    來自福建 回復
    1. 我反思一下,下次爭取更精煉~

      來自北京 回復