近日周立功教授公開了數(shù)年的心血之作《程序設(shè)計(jì)與數(shù)據(jù)結(jié)構(gòu)》,電子版已無償性分享到電子工程師與高校群體下載,經(jīng)周立功教授授權(quán),特對(duì)本書內(nèi)容進(jìn)行連載。
>>>1.1.1動(dòng)作類
前面詳細(xì)介紹了State狀態(tài)模式的推導(dǎo)過程以及完整的實(shí)現(xiàn),采用了簡(jiǎn)單的打印語句作為作為4個(gè)動(dòng)作的實(shí)現(xiàn)示例。然而,實(shí)際動(dòng)作是很有可能發(fā)生變化的,由于動(dòng)作直接在事件處理方法中執(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動(dòng)作
5 }
由此可見,只要?jiǎng)幼靼l(fā)生變化,都必須修改事件處理方法?;诖耍环翆㈤l機(jī)動(dòng)作單獨(dú)封裝在一個(gè)動(dòng)作類中,詳見圖 4.12。
圖 4.12 狀態(tài)機(jī)類圖
如程序清單4.23和程序清單4.24所示為動(dòng)作類的聲明和實(shí)現(xiàn),為何要為這么簡(jiǎn)單的動(dòng)作創(chuàng)建類呢?因?yàn)橹挥蓄A(yù)測(cè)變換和管理變化才能擁抱變化,只有這樣才能使軟件具有可擴(kuò)展性和可維護(hù)性。
程序清單4.23動(dòng)作函數(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動(dòng)作函數(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動(dòng)作對(duì)應(yīng)的動(dòng)作函數(shù)分別為: alarm()、unlock()、thankyou()和lock()。當(dāng)將4個(gè)動(dòng)作分別由4個(gè)函數(shù)實(shí)現(xiàn)時(shí),則具體動(dòng)作從狀態(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動(dòng)作
5 }
這是一種良好的設(shè)計(jì),因?yàn)閯?dòng)作接口優(yōu)雅地解除了FSM的狀態(tài)變換邏輯和它要執(zhí)行的動(dòng)作之間的耦合。這樣一來就算另外一個(gè)具有完全不同邏輯的FSM,也可以在沒有任何影響的情況下使用這些動(dòng)作接口。
由于在處理動(dòng)作時(shí),不需要任何數(shù)據(jù),它是一個(gè)只有方法,沒有屬性的動(dòng)作類,因此沒有刻意使用結(jié)構(gòu)體為其定義專門的類型。而實(shí)際的動(dòng)作類可能會(huì)包含一些數(shù)據(jù),其定義如下:
typedef struct _turnstile_action {
// some data
} turnstile_action_t;
此時(shí),當(dāng)動(dòng)作發(fā)生變化時(shí),僅需修改動(dòng)作類的函數(shù),無需修改狀態(tài)機(jī)的事件處理函數(shù)。
-
電子工程師
+關(guān)注
關(guān)注
252文章
767瀏覽量
95601 -
嵌入式
+關(guān)注
關(guān)注
5068文章
19019瀏覽量
303287 -
周立功
+關(guān)注
關(guān)注
38文章
130瀏覽量
37584
原文標(biāo)題:周立功:狀態(tài)機(jī)——?jiǎng)幼黝?/p>
文章出處:【微信號(hào):Zlgmcu7890,微信公眾號(hào):周立功單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論