這些狀態有先後順序,甚至有不同的觸發關係。例如「待支付」與「待收貨」如果取消,都會變成「結束」。
這麼複雜的關係,應該如何表示才能一目了然呢?
答案是:使用有限狀態機 (FSM)。
二、有限狀態機簡介
「有限狀態機」的全名是 (Finite State Machine,中文翻譯為有限狀態機/狀態機,下均用狀態機)。
狀態機不是一台機器,而是一個數學模型,用來抽象化生活中事情的狀態。
狀態機經常被使用在「程式領域」,工程師在撰寫程式時,通常都會使用狀態機來釐清複雜的狀態變化。
除了寫程式,狀態機對產品經理、專案經理、或是任何想釐清複雜程序的人都非常有幫助。
你可能會問:「我看狀態機的圖片跟流程圖很相似,這兩者有什麼差異?」
簡單來說:
狀態機強調的是「狀態變化」,而流程圖則是強調「事件先後順序」。
雖然兩者使用的元素有重疊,但畫圖的重點不同,使用的時機也不同。
只要理解了概念,就連生活中的場景都可以使用狀態機釐清關係,文章最後面會有一道生活應用題。
三、有限狀態機元素組成
先來看一張簡單的狀態機:
這張圖描述了「門開著/門關著」兩個狀態(圓圈),並且定義了「開」跟「關」兩個動作(線上的文字)。
狀態中也標註了要變成這個狀態時,必須執行的動作(稱為進入動作)。例如「門關著」狀態的進入動作是「關門」,「門開著」狀態的進入動作是「開門」。
請注意 transition 指的是「狀態轉變」,transition condition/event 指的是「觸發狀態改變的條件」。
有限狀態機的 4 種元素
我們將上述的元素整理一下,得到了狀態機中 4 個重要元素:
- state 狀態:一個狀態機中至少要包含 2 個狀態,例如「門開著」與「門關著」。
- event 事件:用來觸發狀態變化的條件,有些文章也稱作 transition condition。例如「開門」與「關門」。
- action 動作:「事件發生後」要執行的動作,例如進入動作的「關門。其實動作可以細分成 4 種類型:
1. 進入動作:進入這個狀態時,會執行什麼工作?2. 離開動作:離開這個狀態時,會執行什麼工作?3. 輸入動作:處於某狀態時,收到事件會執行什麼動作?(即執行動作但不轉變狀態)4. 轉移動作:轉移狀態過程中,會執行什麼動作?
- transition 變換:一個狀態轉變為另一個狀態,例如「門開者」轉變成「門關著」。
Action 舉例
action 動作比較複雜,我們用「紅綠燈的燈號轉變」再舉一個例子。假設目前狀態為紅燈:
1. 進入動作:燈號顯示為紅色,並且播放紅色倒數計時2. 離開動作:紅燈倒數計時歸 03. 輸入動作:例如在紅燈狀態時收到「有人闖紅燈」事件,則發出警告:「現在是紅燈,禁止闖紅燈」4. 轉移動作:例如在紅燈轉變為綠燈過程中,發出提醒:「現在是綠燈啦,趕快走別滑手機」
四、實戰案例,畫一張自動販賣機的有限狀態機
了解了全盤概念,我們一起用狀態機的概念畫一張自動販賣機的狀態機。
假設自動販賣機只賣 2 種飲料,分別是 20 元 和 50 元。這台販賣機只接受 10 元或 50 元的硬幣。
我們可以將販賣機的狀態分成:
- default (初始狀態)
- not_enough (錢不夠)
- menu_20 (選單顯示可購買 20元 的飲料)
- menu_20_50 (選單顯示可購買 20/50元 的飲料)
這個狀態機的運作流程是:
- default : 初始狀態為 default
- not_enough
1. 投入 10 元時,狀態顯示為 not_enough。2. 再投入 10 元顯示 menu_20,此時可購買 20 元飲料、或繼續投幣直到累積超過 50 元可購買 50 元飲料。3. 投入 50 元顯示 menu_20_50,此時可購買 20 元或 50 元飲料。
- menu_20:此時可購買 20 元飲料、或投入累積超過 30 元可購買 50 元飲料。
- menu_20_50:此時可購買 20 元或 50 元飲料
購買完成回到 default 狀態時,要進行找零與彈出飲料。
參考資料
▶︎ 關於文章1/ 歡迎訂閱 我的電子報 獲得實用的生活與工作技巧,每週二中午 12:00 準時發刊2/ 想要掌握最新文章,可以點擊下方「Follow」我~3/ 如果你覺得文章寫的不錯,可以對文章拍手讓我知道 👏🏻▶ 關於我我是朱騏,一個組織能力超強的軟體產品經理,喜歡研究各種生產力工具、時間管理方法。1/ 我可以提供產品管理、時間管理、生產力工具的「個人問題諮詢」與「講座邀約」。2/ 若是個人諮詢,可以請我喝杯咖啡、吃頓晚餐,可透過 Email/ Facebook 跟我約時間,請參考「聯繫方式」。3/ 若是講座邀約,請直接使用 Email 聯繫。︎▶︎ 聯繫方式- 📪 Email:muhenry608@gmail.com- 💬 Facebook:請先加我個人好友並簡短說明想要諮詢的主題▶︎ 建立人脈歡迎使用 LinkedIn 與我交流,你可以「加我為好友」建立連結| LinkedIn @ Chi Chu 歡迎交流