軟體設計方法論:狀態機實作篇

這次來看計數器的一生

首圖

前言

在「軟體設計方法論:狀態機之生老病死」文章中,介紹了如何狀態機設計方法,其中使用人的一生作為命題,並找出事件:生、老、病、死、康復。如果只有這樣會容易以為只是方法論而已,跟實際案例銜接不上,因此拿程式教學中常見的案例做介紹:「簡易計數器」。

「題目回顧」

本章節中,將介紹簡易計數器題目,並配合狀態機設計方法,來找出該有的事件以及狀態,其中題目 credit 來自於:簡易計數器。更動部分內容,避免遺失教學焦點。

題目細節如下:

畫面必須顯示三個資訊:

  • 目前狀態:包含「開始計數」、「完成」和「錯誤」(包含錯誤訊息)。
  • 目前計數:當計數器建立後,顯示「計數」按鈕被點擊的次數。
  • 偶數計數:每當「目前計數」數值為偶數時,顯示這個偶數值。

畫面包含四個按鈕,功能如下:

  • 「開始新的計數器」按鈕:重新建立一個新的計數器;並在「目前狀態」資訊顯示「開始計數」。
  • 「計數」按鈕:當建立新的計數器後,每按下計數按鈕,顯示的計數值就加 1。
  • 「發生錯誤」按鈕:要求使用者輸入錯誤訊息,並將錯誤訊息顯示在「目前狀態」資訊內。
  • 「完成計數」按鈕:在「目前狀態」資訊顯示「完成」

其他要求:

  • 當按下「開始新的計數器」時,所有計數器歸 0。
  • 當按下「發生錯誤」或「完成計數」,除非按下「開始新的計數器」,否則其他按鈕按下不會有任何動作。

「狀態機器設計流程」

本章節中,將一步步帶領讀者使用狀態機設計流程來設計簡易計數器。

第一命題:定義命題

還記得狀態機設計流程嗎?定義命題、找出事件、找出狀態。第一步先給出命題,這邊先用計數器的一生。

第二步驟:找出事件

事件主要有三個來源:人、機器、時間,我們已知題目中,存在四個按鈕,也就是由人過來的,所以已經可以確立四個事件「開始新的計數器」、「計數」、「發生錯誤」、「完成計數」。

為了能夠減輕大腦工作,記得將事件編號化。

B第三步驟:找出狀態

一樣,把所有事件全部羅列出來,然後一步步把事件跟狀態找出來。

事件 1 是否有意義,有,保留。事件 2 是否有意義,沒有,因為連 instance 都不存在。事件 3 是否有意義,沒有。事件 4 是否有意義,沒有。

再來從狀態A繼續執行。

事件 1 是否有意義,無。事件 2 是否有意義,有,可以計數。事件 3 是否有意義,有,該命題下可以出現錯誤。事件 4 是否有意義,有,該命題下可以直接結束計數器。

讓我們從狀態 C 繼續執行。

事件 1是否有意義,無。事件 2 是否有意義,有,會回到自己身上。事件 3 是否有意義,有,落入在狀態 D 當中。事件 4 是否有意義,有,落入在狀態 E 當中。

接著從狀態 D 繼續執行

事件 1是否有意義,無。事件 2 是否有意義,無,已經出錯了,不覺得應該可以繼續正常工作。事件 3 是否有意義,有,一樣持續接受錯誤,然後回到自身狀態。事件 4 是否有意義,無,我覺得已經錯誤了。這時候發現,忘記考量到處理錯誤後的事件,也就是原本的康復,依照剛剛所說的三種事件來源,人、機器、時間。其實在題目中就有寫到「輸入錯誤訊息」所以這其實也是個事件,就剛好也發現到這個缺失,就把「輸入錯誤訊息」作為事件5吧。

接著從狀態 E 繼續執行

事件 1是否有意義,無。事件 2 是否有意義,無。事件 3 是否有意義,無。事件 4 是否有意義,無。這個可以視為 end point

「結語」

本篇是示範在常見教學程式中會遇上的問題,計數器,並且搭配狀態機設計方法來找出事件與狀態。由於這是靠人的智慧,並且需要討論的,讀者可能對於過程會有很多疑問,是正常的,因為每個人的想法不同,你可以說服自己,在說服別人的話,就是可用的。例如說:我同事就認為錯誤之後,就該直接結束計數器生命,免得繼續出包。通常這時候我們就會回到命題範圍審視是否符合 context。

希望本篇示範對讀者有所幫助。

--

--

許恆修 | Heng-Shiou Sheu
許恆修 | Heng-Shiou Sheu

Written by 許恆修 | Heng-Shiou Sheu

AI研究員 @喬泰科技,軟體工程師@微光國際,業界講師 @FCU 創能學院,Co-Founder @圖靈文本。專注將科技應用於改善生活中,持續性分享軟體架構設計、前沿人工智慧研究、公司治理等觀念。整合科技、人文思維於一體。聯絡 📪 hengshiousheu@gmail.com