產(chǎn)品經(jīng)理不得不知的——有限狀態(tài)機
編輯導(dǎo)讀:狀態(tài)機可以對業(yè)務(wù)狀態(tài)進行梳理,一目了然,之后可以根據(jù)業(yè)務(wù)場景不斷增加。它雖然不是做好一款產(chǎn)品的必備品,但是卻可以讓你在跟技術(shù)等人員溝通時效率更高。文章對有限狀態(tài)機進行了簡要的介紹,與大家分享。
一、地址的分析和識別
以前每次搬家,要重新寫收貨地址時,我都會特別小心,要去百度地圖上搜一下地址的完整寫法,生怕一不小心寫錯或?qū)懧┝司褪詹坏桨耍ㄎ婺槪?。直到某天我看到有限狀態(tài)機的原理,才知道我太天真了。
比如騰訊公司在深圳的地址,有如下的各種寫法:
- 廣東省深圳市騰訊大廈
- 廣東省518075深圳市南山區(qū)科技園騰訊大廈
- 深圳市510875科技園騰訊大廈
- 深圳市南山區(qū)科技園騰訊大廈
- 廣東省深圳市科技園中一路騰訊公司…
這些地址寫得都有點不清楚,那么程序是如何準確地識別這些信息呢?下圖所示的是一個識別中國地址有限狀態(tài)機的例子。
- 每一個有限狀態(tài)機都有一個開始狀態(tài)和一個終止?fàn)顟B(tài),以及若干中間狀態(tài)。
- 每一條弧上帶有從一個狀態(tài)進入下一個狀態(tài)的條件。
- 如果一個地址能從狀態(tài)機的開始狀態(tài)進過狀態(tài)機的若干中間狀態(tài),走到終止?fàn)顟B(tài),那么這條地址有效,否則無效。
比如“北京市雙清路83號”對于上面的狀態(tài)機有效,而“上海市遼寧省馬家莊”則無效。
二、什么是有限狀態(tài)機
有限狀態(tài)機(Finite-state machine)是一個非常有用的模型,可以模擬世界上大部分事物。
它有三個特征:
- 狀態(tài)總數(shù)(state)是有限的。
- 任一時刻,只處在一種狀態(tài)之中。
- 某種條件下,會從一種狀態(tài)轉(zhuǎn)變(transition)到另一種狀態(tài)。
現(xiàn)實世界中存在大量具有有限個狀態(tài)的系統(tǒng):鐘表系統(tǒng)、電梯系統(tǒng)、交通信號燈系統(tǒng)、通信協(xié)議系統(tǒng)、正則表達式、硬件電路系統(tǒng)設(shè)計、軟件工程,編譯器等,有限狀態(tài)機的概念就是來自于現(xiàn)實世界中的這些有限系統(tǒng)。
下面是一個可樂機的狀態(tài)圖。
從圖中就可以清楚地看到可樂機的運行過程,圖中直觀地表現(xiàn)了可樂機投入不同金額硬幣時的情況以及幾個處理步驟的各個狀態(tài)和它們之間的轉(zhuǎn)換關(guān)系,根據(jù)投入硬幣的不同面值,對總金額進行計算,并對各種操作進行響應(yīng)以完成一次購買。?狀態(tài)機的動態(tài)結(jié)構(gòu)使得其在通訊系統(tǒng),數(shù)字協(xié)議處理系統(tǒng),控制系統(tǒng),用戶界面等領(lǐng)域得到了廣泛地應(yīng)用。
上圖是非常有名的TCP協(xié)議狀態(tài)機。這個狀態(tài)機我沒看懂,放在這里拋磚引玉吧。
三、有限狀態(tài)機的應(yīng)用
有限狀態(tài)機有多種實現(xiàn)方式
1. switch-case或if-else
舉例來說,網(wǎng)頁上有一個菜單元素。鼠標懸停的時候,菜單顯示;鼠標移開的時候,菜單隱藏。如果使用有限狀態(tài)機描述,就是這個菜單只有兩種狀態(tài)(顯示和隱藏),鼠標會引發(fā)狀態(tài)轉(zhuǎn)變。
當(dāng)狀態(tài)量少并且各個狀態(tài)之間變化的邏輯比較簡單時,使用switch語句實現(xiàn)的有限狀態(tài)機的確能夠很好地工作,但代碼的可讀性并不十分理想。在很長一段時期內(nèi),使用switch語句一直是實現(xiàn)有限狀態(tài)機的唯一方法,甚至像編譯器這樣復(fù)雜的軟件系統(tǒng),大部分也都直接采用這種實現(xiàn)方式。
但之后隨著狀態(tài)機應(yīng)用的逐漸深入,構(gòu)造出來的狀態(tài)機越來越復(fù)雜,這種方法也開始面臨各種嚴峻的考驗,其中最令人頭痛的是如果狀態(tài)機中的狀態(tài)非常多,或者狀態(tài)之間的轉(zhuǎn)換關(guān)系異常復(fù)雜,那么簡單地使用switch語句構(gòu)造出來的狀態(tài)機將難以擴展和維護。
2. 狀態(tài)表
我們還可以用狀態(tài)表來表示狀態(tài)的轉(zhuǎn)化過程,以一個游戲中的簡單設(shè)定為例:
這段需求相信大家一眼就可以看明白,現(xiàn)在我們用狀態(tài)機來表示,大概是這樣:
看完這個圖,是不是有種似曾相識的感覺。產(chǎn)品經(jīng)理在做復(fù)雜的業(yè)務(wù)需求時,往往會遇到狀態(tài)的變更,一般我們會畫流程圖來表示(比如一個審核流程),偶爾也會用表格的形式來表示(比如內(nèi)容平臺的發(fā)布流程)。
但是我們在做的時候往往沒有考慮過有限狀態(tài)機的這種表述方式,或者說考慮得不夠全面,如果用有限狀態(tài)機的這種方式,那就是可以直接供測試人員使用的一個測試用例了,想想測試同學(xué)雀躍的心情吧。
四、總結(jié)
狀態(tài)機表示有限個狀態(tài)以及在這些狀態(tài)之間的轉(zhuǎn)移和動作等行為的數(shù)學(xué)模型。
通俗的描述狀態(tài)機就是定義了一套狀態(tài)変更的流程:狀態(tài)機包含一個狀態(tài)集合,定義當(dāng)狀態(tài)機處于某一個狀態(tài)的時候它所能接收的事件以及可執(zhí)行的行為,執(zhí)行完成后,狀態(tài)機所處的狀態(tài)。
狀態(tài)機主要的應(yīng)用場景就是流程控制。一個狀態(tài)機定義以后,在某個狀態(tài)下就只接收固定的Event,也就是執(zhí)行指定的操作,這樣流程就能按照預(yù)期定義的那樣流轉(zhuǎn),不會出現(xiàn)亂入的情況,執(zhí)行了一些在某狀態(tài)下不允許執(zhí)行的操作。
一個很典型的應(yīng)用就是工作流引擎:以工作流中典型的審批流程為例,審批流程按照預(yù)先定義的流程流轉(zhuǎn)的固定的某些人手里,只有這一批固定的人才能審批,當(dāng)審批后(可能是一個人審批,也可能是多個人審批)才會流轉(zhuǎn)到下個節(jié)點,由下個節(jié)點的審批人繼續(xù)審批,一直流轉(zhuǎn)到最后一個節(jié)點。
狀態(tài)機的流轉(zhuǎn)可以人工干預(yù),也可以自動流轉(zhuǎn)。定義為自動流轉(zhuǎn)后,把業(yè)務(wù)流程定義完成后,只要添加一個定時任務(wù),整個流程的運轉(zhuǎn)就都由狀態(tài)機來完成了。
寫到這,只想說一句話,無處不狀態(tài)機!
#專欄作家#
CARRIE,人人都是產(chǎn)品經(jīng)理專欄作家。關(guān)注新技術(shù)新服務(wù)。
本文原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載
題圖來自Unsplash,基于CC0協(xié)議
不錯
有干貨,信號不好,滑動式小表情被點到了,取消不掉呀……
嘿,計算機專業(yè)學(xué)過狀態(tài)機,沒想到在產(chǎn)品領(lǐng)域也看到了,很有意思
贊!感謝分享!
地址那個不是決策樹嗎 拿狀態(tài)機做類比?
這也不是一個東西啊
地址的那個例子是取自吳軍博士的《數(shù)學(xué)之美》— —“地址分析和有限狀態(tài)機”章節(jié)。
決策樹和狀態(tài)機我認為區(qū)別在于:決策樹是樹形結(jié)構(gòu),一組值經(jīng)過決策樹后會形成一條唯一路徑;而狀態(tài)機中間的多個狀態(tài)是可以循環(huán),甚至是可以自循環(huán)的。
認同你對這個區(qū)別的理解 只是個人覺得決策樹和狀態(tài)機用來做類比實屬有點牽強
嗯嗯 感謝建議~
好像講了很多,但是看不懂。。。
我反思一下,下次爭取更精煉~