產(chǎn)品經(jīng)理不得不知的——有限狀態(tài)機
編輯導讀:狀態(tài)機可以對業(yè)務狀態(tài)進行梳理,一目了然,之后可以根據(jù)業(yè)務場景不斷增加。它雖然不是做好一款產(chǎn)品的必備品,但是卻可以讓你在跟技術等人員溝通時效率更高。文章對有限狀態(tài)機進行了簡要的介紹,與大家分享。
一、地址的分析和識別
以前每次搬家,要重新寫收貨地址時,我都會特別小心,要去百度地圖上搜一下地址的完整寫法,生怕一不小心寫錯或寫漏了就收不到包裹了(捂臉)。直到某天我看到有限狀態(tài)機的原理,才知道我太天真了。
比如騰訊公司在深圳的地址,有如下的各種寫法:
- 廣東省深圳市騰訊大廈
- 廣東省518075深圳市南山區(qū)科技園騰訊大廈
- 深圳市510875科技園騰訊大廈
- 深圳市南山區(qū)科技園騰訊大廈
- 廣東省深圳市科技園中一路騰訊公司…
這些地址寫得都有點不清楚,那么程序是如何準確地識別這些信息呢?下圖所示的是一個識別中國地址有限狀態(tài)機的例子。
- 每一個有限狀態(tài)機都有一個開始狀態(tài)和一個終止狀態(tài),以及若干中間狀態(tài)。
- 每一條弧上帶有從一個狀態(tài)進入下一個狀態(tài)的條件。
- 如果一個地址能從狀態(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é)議
不錯
有干貨,信號不好,滑動式小表情被點到了,取消不掉呀……
嘿,計算機專業(yè)學過狀態(tài)機,沒想到在產(chǎn)品領域也看到了,很有意思
贊!感謝分享!
地址那個不是決策樹嗎 拿狀態(tài)機做類比?
這也不是一個東西啊
地址的那個例子是取自吳軍博士的《數(shù)學之美》— —“地址分析和有限狀態(tài)機”章節(jié)。
決策樹和狀態(tài)機我認為區(qū)別在于:決策樹是樹形結構,一組值經(jīng)過決策樹后會形成一條唯一路徑;而狀態(tài)機中間的多個狀態(tài)是可以循環(huán),甚至是可以自循環(huán)的。
認同你對這個區(qū)別的理解 只是個人覺得決策樹和狀態(tài)機用來做類比實屬有點牽強
嗯嗯 感謝建議~
好像講了很多,但是看不懂。。。
我反思一下,下次爭取更精煉~