近日周立功教授公開了數(shù)年的心血之作《程序設(shè)計與數(shù)據(jù)結(jié)構(gòu)》,電子版已無償性分享到電子工程師與高校群體下載,經(jīng)周立功教授授權(quán),特對本書內(nèi)容進(jìn)行連載。
>>>1.1.1動作類
前面詳細(xì)介紹了State狀態(tài)模式的推導(dǎo)過程以及完整的實(shí)現(xiàn),采用了簡單的打印語句作為作為4個動作的實(shí)現(xiàn)示例。然而,實(shí)際動作是很有可能發(fā)生變化的,由于動作直接在事件處理方法中執(zhí)行。比如,LOCKED狀態(tài)的card事件處理方法定義為:
1 void locked_card(turnstile_t *p_turnstile)
2 {
3 turnstile_state_set(p_turnstile, &unlocked_state);
4 printf("unclock\n"); // 執(zhí)行unlock動作
5 }
由此可見,只要動作發(fā)生變化,都必須修改事件處理方法?;诖?,不妨將閘機(jī)動作單獨(dú)封裝在一個動作類中,詳見圖 4.12。
圖 4.12 狀態(tài)機(jī)類圖
如程序清單4.23和程序清單4.24所示為動作類的聲明和實(shí)現(xiàn),為何要為這么簡單的動作創(chuàng)建類呢?因?yàn)橹挥蓄A(yù)測變換和管理變化才能擁抱變化,只有這樣才能使軟件具有可擴(kuò)展性和可維護(hù)性。
程序清單4.23動作函數(shù)聲明(turnstile_action.h文件內(nèi)容)
1 #pragma once
2
3 void turnstile_action_lock(void);
4 void turnstile_action_unlock(void);
5 void turnstile_action_alarm(void);
6 void turnstile_action_thankyou(void);
程序清單4.24動作函數(shù)實(shí)現(xiàn)(turnstile_action.c文件內(nèi)容)
1 void turnstile_action_lock(void)
2 {
3 printf("clock\n");
4 }
5
6 void turnstile_action_unlock(void)
7 {
8 printf("unclock\n");
9 }
10
11 void turnstile_action_alarm(void)
12 {
13 printf("alarm\n");
14 }
15
16 void turnstile_action_thankyou(void)
17 {
18 printf("thank you\n");
19 }
程序中的alarm、unlock、thankyou和lock動作對應(yīng)的動作函數(shù)分別為: alarm()、unlock()、thankyou()和lock()。當(dāng)將4個動作分別由4個函數(shù)實(shí)現(xiàn)時,則具體動作從狀態(tài)機(jī)中分離出來了。比如,LOCKED狀態(tài)下的card事件處理方法定義為:
1 void locked_card(turnstile_t *p_turnstile)
2 {
3 turnstile_state_set(p_turnstile, &unlocked_state);
4 turnstile_action_unlock (); // 執(zhí)行unlock動作
5 }
這是一種良好的設(shè)計,因?yàn)閯幼?a target="_blank">接口優(yōu)雅地解除了FSM的狀態(tài)變換邏輯和它要執(zhí)行的動作之間的耦合。這樣一來就算另外一個具有完全不同邏輯的FSM,也可以在沒有任何影響的情況下使用這些動作接口。
由于在處理動作時,不需要任何數(shù)據(jù),它是一個只有方法,沒有屬性的動作類,因此沒有刻意使用結(jié)構(gòu)體為其定義專門的類型。而實(shí)際的動作類可能會包含一些數(shù)據(jù),其定義如下:
typedef struct _turnstile_action {
// some data
} turnstile_action_t;
此時,當(dāng)動作發(fā)生變化時,僅需修改動作類的函數(shù),無需修改狀態(tài)機(jī)的事件處理函數(shù)。
-
電子工程師
+關(guān)注
關(guān)注
253文章
785瀏覽量
96435 -
嵌入式
+關(guān)注
關(guān)注
5152文章
19675瀏覽量
317547 -
周立功
+關(guān)注
關(guān)注
38文章
130瀏覽量
38215
原文標(biāo)題:周立功:狀態(tài)機(jī)——動作類
文章出處:【微信號:Zlgmcu7890,微信公眾號:周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
在Compose中使用狀態(tài)(State)
狀態(tài)機(jī)編程實(shí)例-面向?qū)ο蟮?b class='flag-5'>狀態(tài)設(shè)計模式

玩轉(zhuǎn)Spring狀態(tài)機(jī)

誰有PMSM傳遞函數(shù)的推導(dǎo)過程的資料?
經(jīng)驗(yàn)分享:臨界模式下的PFC電感量推導(dǎo)過程
LLC增益曲線過程推導(dǎo)和參數(shù)如何計算
直線擬合求解的推導(dǎo)過程
State Machine Coding Styles for Synthesis

對象間交互推導(dǎo)過程及模式選擇
Logistic回歸數(shù)學(xué)推導(dǎo)以及python實(shí)現(xiàn)
反激詳細(xì)推導(dǎo)過程
電機(jī)控制---SVPWM扇區(qū)判斷的實(shí)現(xiàn)以及推導(dǎo)過程

UVM設(shè)計模式之狀態(tài)模式介紹

評論