有限自動機(Finite Automata Machine)是計算機科學(xué)的重要基石,它在軟件開發(fā)領(lǐng)域內(nèi)通常被稱作有限狀態(tài)機(Finite State Machine),是一種應(yīng)用非常廣泛的軟件設(shè)計模式(Design Pattern)。本文介紹如何構(gòu)建基于狀態(tài)機的軟件系統(tǒng),以及如何利用Linux下的工具來自動生成實用的狀態(tài)機框架。
在描述有限狀態(tài)機時,狀態(tài)、事件、轉(zhuǎn)換和動作是經(jīng)常會碰到的幾個基本概念。
FSME是一個基于Qt的有限狀態(tài)機工具,它能夠讓用戶通過圖形化的方式來對程序中所需要的狀態(tài)機進行建模,并且還能夠自動生成用C++或者Python實現(xiàn)的狀態(tài)機框架代碼。下面就以圖1中城門的狀態(tài)機為例,來介紹如何利用FSME來自動生成程序中所需要的狀態(tài)機代碼。


在將狀態(tài)機模型保存為door.fsm文件之后,使用下面的命令可以生成包含有狀態(tài)機定義的頭文件:
當(dāng)所有的輸出都定義好之后,接下來就可以為狀態(tài)機中的每個狀態(tài)綁定相應(yīng)的輸出。首先在FSME界面左側(cè)的"States"項中選擇相應(yīng)的狀態(tài),然后從右下角的"Available"列表框中選擇與該狀態(tài)對應(yīng)的輸出,再單擊"<"按鈕將其添加到"In"列表中,如圖8所示。用同樣的辦法可以為狀態(tài)機中的所有狀態(tài)設(shè)置相應(yīng)的輸出,同一個狀態(tài)可以對應(yīng)有多個輸出,其中In列表中的輸出會在進入該狀態(tài)時被調(diào)用,而Out列表中的輸出則會在退出該狀態(tài)時被調(diào)用,輸出調(diào)用的順序是與其在In或者Out列表中的順序相一致的。下圖8:為狀態(tài)設(shè)置輸出。
由于對狀態(tài)機模型進行了修改,我們需要再次生成狀態(tài)機的框架代碼,不過這次不需要加上-d參數(shù):
1 什么是狀態(tài)機
有限狀態(tài)機是一種用來進行對象行為建模的工具,其作用主要是描述對象在它的生命周期內(nèi)所經(jīng)歷的狀態(tài)序列,以及如何響應(yīng)來自外界的各種事件。在面向?qū)ο蟮能浖到y(tǒng)中,一個對象無論多么簡單或者多么復(fù)雜,都必然會經(jīng)歷一個從開始創(chuàng)建到最終消亡的完整過程,這通常被稱為對象的生命周期。一般說來,對象在其生命期內(nèi)是不可能完全孤立的,它必須通過發(fā)送消息來影響其它對象,或者通過接受消息來改變自身。在大多數(shù)情況下,這些消息都只不過是些簡單的、同步的方法調(diào)用而已。例如,在銀行客戶管理系統(tǒng)中,客戶類(Customer)的實例在需要的時候,可能會調(diào)用帳戶(Account)類中定義的getBalance()方法。在這種簡單的情況下,類Customer并不需要一個有限狀態(tài)機來描述自己的行為,主要原因在于它當(dāng)前的行為并不依賴于過去的某個狀態(tài)。遺憾的是并不是所有情況都會如此簡單,事實上許多實用的軟件系統(tǒng)都必須維護一兩個非常關(guān)鍵的對象,它們通常具有非常復(fù)雜的狀態(tài)轉(zhuǎn)換關(guān)系,而且需要對來自外部的各種異步事件進行響應(yīng)。例如,在VoIP電話系統(tǒng)中,電話類(Telephone)的實例必須能夠響應(yīng)來自對方的隨機呼叫,來自用戶的按鍵事件,以及來自網(wǎng)絡(luò)的信令等。在處理這些消息時,類Telephone所要采取的行為完全依賴于它當(dāng)前所處的狀態(tài),因而此時使用狀態(tài)機就將是一個不錯的選擇。游戲引擎是有限狀態(tài)機最為成功的應(yīng)用領(lǐng)域之一,由于設(shè)計良好的狀態(tài)機能夠被用來取代部分的人工智能算法,因此游戲中的每個角色或者器件都有可能內(nèi)嵌一個狀態(tài)機。考慮RPG游戲中城門這樣一個簡單的對象,它具有打開(Opened)、關(guān)閉(Closed)、上鎖(Locked)、解鎖(Unlocked)四種狀態(tài),如圖1所示。當(dāng)玩家到達一個處于狀態(tài)Locked的門時,如果此時他已經(jīng)找到了用來開門的鑰匙,那么他就可以利用它將門的當(dāng)前狀態(tài)轉(zhuǎn)變?yōu)閁nlocked,進一步還可以通過旋轉(zhuǎn)門上的把手將其狀態(tài)轉(zhuǎn)變?yōu)镺pened,從而成功地進入城內(nèi)。下圖1:控制城門的狀態(tài)機。
- 狀態(tài)(State)指的是對象在其生命周期中的一種狀況,處于某個特定狀態(tài)中的對象必然會滿足某些條件、執(zhí)行某些動作或者是等待某些事件。
- 事件(Event)指的是在時間和空間上占有一定位置,并且對狀態(tài)機來講是有意義的那些事情。事件通常會引起狀態(tài)的變遷,促使?fàn)顟B(tài)機從一種狀態(tài)切換到另一種狀態(tài)。
- 轉(zhuǎn)換(Transition)指的是兩個狀態(tài)之間的一種關(guān)系,表明對象將在第一個狀態(tài)中執(zhí)行一定的動作,并將在某個事件發(fā)生- 同時某個特定條件滿足時進入第二個狀態(tài)。
- 動作(Action)指的是狀態(tài)機中可以執(zhí)行的那些原子操作,所謂原子操作指的是它們在運行的過程中不能被其他消息所中斷,必須一直執(zhí)行下去。
2 手工編寫狀態(tài)機
與其他常用的設(shè)計模式有所不同,程序員想要在自己的軟件系統(tǒng)中加入狀態(tài)機時,必須再額外編寫一部分用于邏輯控制的代碼,如果系統(tǒng)足夠復(fù)雜的話,這部分代碼實現(xiàn)和維護起來還是相當(dāng)困難的。在實現(xiàn)有限狀態(tài)機時,使用switch語句是最簡單也是最直接的一種方式,其基本思路是為狀態(tài)機中的每一種狀態(tài)都設(shè)置一個case分支,專門用于對該狀態(tài)進行控制。下面的代碼示范了如何運用switch語句,來實現(xiàn)圖1中所示的狀態(tài)機:
switch (state) {
// 處理狀態(tài)Opened的分支
case (Opened): {
// 執(zhí)行動作Open
open();
// 檢查是否有CloseDoor事件
if (closeDoor()) {
// 當(dāng)前狀態(tài)轉(zhuǎn)換為Closed
changeState(Closed)
}
break;
}
// 處理狀態(tài)Closed的分支
case (Closed): {
// 執(zhí)行動作Close
close();
// 檢查是否有OpenDoor事件
if (openDoor()) {
// 當(dāng)前狀態(tài)轉(zhuǎn)換為Opened
changeState(Opened);
}
// 檢查是否有LockDoor事件
if (lockDoor()) {
// 當(dāng)前狀態(tài)轉(zhuǎn)換為Locked
changeState(Locked);
}
break;
}
// 處理狀態(tài)Locked的分支
case (Locked): {
// 執(zhí)行動作Lock
lock();
// 檢查是否有UnlockDoor事件
if (unlockDoor()) {
// 當(dāng)前狀態(tài)轉(zhuǎn)換為Unlocked
changeState(Unlocked);
}
break;
}
// 處理狀態(tài)Unlocked的分支
case (Unlocked): {
// 執(zhí)行動作Unlock
unlock();
// 檢查是否有LockDoor事件
if (lockDoor()) {
// 當(dāng)前狀態(tài)轉(zhuǎn)換為Locked
changeState(Locked)
}
// 檢查是否有OpenDoor事件
if (openDoor()) {
// 當(dāng)前狀態(tài)轉(zhuǎn)換為Opened
changeSate(Opened);
}
break;
}
}
使用switch語句實現(xiàn)的有限狀態(tài)機的確能夠很好地工作,但代碼的可讀性并不十分理想,主要原因是在實現(xiàn)狀態(tài)之間的轉(zhuǎn)換時,檢查轉(zhuǎn)換條件和進行狀態(tài)轉(zhuǎn)換都是混雜在當(dāng)前狀態(tài)中來完成的。例如,當(dāng)城門處于Opened狀態(tài)時,需要在相應(yīng)的case中調(diào)用closeDoor()函數(shù)來檢查是否有必要進行狀態(tài)轉(zhuǎn)換,如果是的話則還需要調(diào)用changeState()函數(shù)將當(dāng)前狀態(tài)切換到Closed。顯然,如果在每種狀態(tài)下都需要分別檢查多個不同的轉(zhuǎn)換條件,并且需要根據(jù)檢查結(jié)果讓狀態(tài)機切換到不同的狀態(tài),那么這樣的代碼將是枯燥而難懂的。從代碼重構(gòu)的角度來講,此時更好的做法是引入checkStateChange()和performStateChange()兩個函數(shù),專門用來對轉(zhuǎn)換條件進行檢查,以及激活轉(zhuǎn)換時所需要執(zhí)行的各種動作。這樣一來,程序結(jié)構(gòu)將變得更加清晰:
switch (state) {
// 處理狀態(tài)Opened的分支
case (Opened): {
// 執(zhí)行動作Open
open();
// 檢查是否有激發(fā)狀態(tài)轉(zhuǎn)換的事件產(chǎn)生
if (checkStateChange()) {
// 對狀態(tài)機的狀態(tài)進行轉(zhuǎn)換
performStateChange();
}
break;
}
// 處理狀態(tài)Closed的分支
case (Closed): {
// 執(zhí)行動作Close
close();
// 檢查是否有激發(fā)狀態(tài)轉(zhuǎn)換的事件產(chǎn)生
if (checkStateChange()) {
// 對狀態(tài)機的狀態(tài)進行轉(zhuǎn)換
performStateChange();
}
break;
}
// 處理狀態(tài)Locked的分支
case (Locked): {
// 執(zhí)行動作Lock
lock();
// 檢查是否有激發(fā)狀態(tài)轉(zhuǎn)換的事件產(chǎn)生
if (checkStateChange()) {
// 對狀態(tài)機的狀態(tài)進行轉(zhuǎn)換
performStateChange();
}
break;
}
// 處理狀態(tài)Unlocked的分支
case (Unlocked): {
// 執(zhí)行動作Lock
unlock();
// 檢查是否有激發(fā)狀態(tài)轉(zhuǎn)換的事件產(chǎn)生
if (checkStateChange()) {
// 對狀態(tài)機的狀態(tài)進行轉(zhuǎn)換
performStateChange();
}
break;
}
}
但checkStateChange()和performStateChange()這兩個函數(shù)本身依然會在面對很復(fù)雜的狀態(tài)機時,內(nèi)部邏輯變得異常臃腫,甚至可能是難以實現(xiàn)。在很長一段時期內(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)機將是不可維護的。3 自動生成狀態(tài)機
為實用的軟件系統(tǒng)編寫狀態(tài)機并不是一件十分輕松的事情,特別是當(dāng)狀態(tài)機本身比較復(fù)雜的時候尤其如此,許多有過類似經(jīng)歷的程序員往往將其形容為"毫無創(chuàng)意"的過程,因為他們需要將大量的時間與精力傾注在如何管理好狀態(tài)機中的各種狀態(tài)上,而不是程序本身的運行邏輯。作為一種通用的軟件設(shè)計模式,各種軟件系統(tǒng)的狀態(tài)機之間肯定會或多或少地存在著一些共性,因此人們開始嘗試開發(fā)一些工具來自動生成有限狀態(tài)機的框架代碼,而在Linux下就有一個挺不錯的選擇──FSME(Finite State Machine Editor)。下圖2:可視化的FSME。
3.1 狀態(tài)機建模
首先運行fsme命令來啟動狀態(tài)機編輯器,然后單擊工具欄上的"New"按鈕來創(chuàng)建一個新的狀態(tài)機。FSME中用于構(gòu)建狀態(tài)機的基本元素一共有五種:事件(Event)、輸入(Input)、輸出(Output)、狀態(tài)(State)和轉(zhuǎn)換(Transition),在界面左邊的樹形列表中可以找到其中的四種。- 狀態(tài)建模

- 事件建模

- 轉(zhuǎn)換建模

3.2 生成狀態(tài)機框架
使用FSME不僅能夠進行可視化的狀態(tài)機建模,更重要的是它還可以根據(jù)得到的模型自動生成用C++或者Python實現(xiàn)的狀態(tài)機框架。首先在FSME界面左邊的樹形列表中選擇"Root"項,然后在右下角的"Name"文本框中輸入狀態(tài)機的名字"DoorFSM",再從"Initial State"下拉列表中選擇狀態(tài)"Opened"作為狀態(tài)機的初始化狀態(tài),如下圖6所示。下圖6:設(shè)置初始屬性。
[xiaowp@linuxgam code]$ fsmc door.fsm -d -o DoorFSM.h
進一步還可以生成包含有狀態(tài)機實現(xiàn)的框架代碼:
[xiaowp@linuxgamcode]$fsmcdoor.fsm-d-implDoorFSM.h-oDoorFSM.cpp
如果想對生成的狀態(tài)機進行驗證,只需要再手工編寫一段用于測試的代碼就可以了:
/*
* TestFSM.cpp
* 測試生成的狀態(tài)機框架
*/
int main()
{
DoorFSM door;
door.A(DoorFSM::Close);
door.A(DoorFSM::Lock);
door.A(DoorFSM::Unlock);
door.A(DoorFSM::Open);
}
有限狀態(tài)機是由事件來進行驅(qū)動的,在FSME生成的狀態(tài)機框架代碼中,方法A()可以被用來向狀態(tài)機發(fā)送相應(yīng)的事件,從而提供狀態(tài)機正常運轉(zhuǎn)所需要的"動力"。狀態(tài)機負責(zé)在其內(nèi)部維護一個事件隊列,所有到達的事件都會先被放到事件隊列中進行等候,從而能夠保證它們將按照到達的先后順序被依次處理。在處理每一個到達的事件時,狀態(tài)機都會根據(jù)自己當(dāng)前所處的狀態(tài),檢查與該狀態(tài)對應(yīng)的轉(zhuǎn)換條件是否已經(jīng)被滿足,如果滿足的話則激活相應(yīng)的狀態(tài)轉(zhuǎn)換過程。使用下面的命令能夠?qū)⑸傻臓顟B(tài)機框架和測試代碼編譯成一個可執(zhí)行文件:
[xiaowp@linuxgam code]$ g++ DoorFSM.cpp TestFSM.cpp -o fsm
由于之前在用fsmc命令生成狀態(tài)機代碼時使用了-d選項,生成的狀態(tài)機框架中會包含一定的調(diào)試信息,包括狀態(tài)機中每次狀態(tài)轉(zhuǎn)換時的激活事件、轉(zhuǎn)換前的狀態(tài)、所經(jīng)歷的轉(zhuǎn)換、轉(zhuǎn)換后的狀態(tài)等,如下所示:
[
]$ ./fsmDoorFSM:event:'Close'
DoorFSM'Opened'
DoorFSM'closeDoor'
DoorFSM:new state:'Closed'
DoorFSM:event:'Lock'
DoorFSM'Closed'
DoorFSM'lockDoor'
DoorFSM:new state:'Locked'
DoorFSM:event:'Unlock'
DoorFSM'Locked'
DoorFSM'unlockDoor'
DoorFSM:new state:'Unlocked'
DoorFSM:event:'Open'
DoorFSM'Unlocked'
DoorFSM'openDoor'
DoorFSM:new state:'Opened'
3.3 定制狀態(tài)機
目前得到的狀態(tài)機已經(jīng)能夠響應(yīng)來自外部的各種事件,并適當(dāng)?shù)卣{(diào)整自己當(dāng)前所處的狀態(tài),也就是說已經(jīng)實現(xiàn)了狀態(tài)機引擎的功能,接下來要做的就是根據(jù)應(yīng)用的具體需求來進行定制,為狀態(tài)機加入與軟件系統(tǒng)本身相關(guān)的那些處理邏輯。在FSME中,與具體應(yīng)用相關(guān)的操作稱為輸出(Output),它們實際上就是一些需要用戶給出具體實現(xiàn)的虛函數(shù),自動生成的狀態(tài)機引擎負責(zé)在進入或者退出某個狀態(tài)時調(diào)用它們。仍然以控制城門的那個狀態(tài)機為例,假設(shè)我們希望在進入每個狀態(tài)時都添加一部分處理邏輯。首在FSME界面左邊的樹形列表選擇"Outputs"項,然后按下鍵盤上的Insert鍵來添加一個新的輸出,接著在右下方的"Name"文本框中輸入相應(yīng)的名稱,再單擊"Apply"按鈕,一個新的輸出就創(chuàng)建好了,如圖7所示。用同樣的辦法可以添加狀態(tài)機所需要的所有輸出。下圖7:添加輸出。

[xiaowp@linuxgam code]$ fsmc door.fsm -o DoorFSM.h
[xiaowp@linuxgamcode]$fsmcdoor.fsm-d-implDoorFSM.h-oDoorFSM.cpp
我們在新的狀態(tài)機模型中添加了enterOpend、enterClosed、enterLocked和enterUnlocked四個輸出,因此生成的類DoorFSM中會包含如下幾個純虛函數(shù):
virtual void enterOpened() = 0;
virtual void enterLocked() = 0;
virtual void enterUnlocked() = 0;
virtual void enterClosed() = 0;
顯然,此時生成的狀態(tài)機框架不能夠再被直接編譯了,我們必須從類DoorFSM派生出一個子類,并提供對這幾個純虛函數(shù)的具體實現(xiàn):
/*
* DoorFSMLogic.h
* 狀態(tài)機控制邏輯的頭文件
*/
class DoorFSMLogic : public DoorFSM
{
protected:
virtual void enterOpened();
virtual void enterLocked();
virtual void enterUnlocked();
virtual void enterClosed();
};
正如前面所提到過的,這幾個函數(shù)實際上代表的正是應(yīng)用系統(tǒng)的處理邏輯,作為例子我們只是簡單地輸出一些提示信息:
/*
* DoorFSMLogic.cpp
* 狀態(tài)機控制邏輯的實現(xiàn)文件
*/
void DoorFSMLogic::enterOpened()
{
std::cout << "Enter Opened state." << std::endl;
}
void DoorFSMLogic::enterClosed()
{
std::cout << "Enter Closed state." << std::endl;
}
void DoorFSMLogic::enterLocked()
{
std::cout << "Enter Locked state." << std::endl;
}
void DoorFSMLogic::enterUnlocked()
{
std::cout << "Enter Unlocked state." << std::endl;
}
同樣,為了對生成的狀態(tài)機進行驗證,我們還需要手工編寫一段測試代碼:
/*
* TestFSM.cpp
* 測試狀態(tài)機邏輯
*/
int main()
{
DoorFSMLogic door;
door.A(DoorFSM::Close);
door.A(DoorFSM::Lock);
door.A(DoorFSM::Unlock);
door.A(DoorFSM::Open);
}
使用下面的命令能夠?qū)⑸傻臓顟B(tài)機框架和測試代碼編譯成一個可執(zhí)行文件:
[xiaowp@linuxgamcode]$g++DoorFSM.cppDoorFSMLogic.cppTestLogic.cpp-ologic
運行結(jié)果如下所示:
code]$ ./logic
Enter Closed state.
Enter Locked state.
Enter Unlocked state.
Enter Opened state.
本文涉及代碼下載:http://www.uml.org.cn/umlcode/code.zip4 小結(jié)
在面向?qū)ο蟮能浖到y(tǒng)中,有些對象具有非常復(fù)雜的生命周期模型,使用有限狀態(tài)機是描述這類對象最好的方法。作為一種軟件設(shè)計模式,有限狀態(tài)機的概念雖然不算復(fù)雜,實現(xiàn)起來也并不困難,但它的問題是當(dāng)狀態(tài)機的模型復(fù)雜到一定的程度之后,會帶來實現(xiàn)和維護上的困難。Linux下的FSME是一個可視化的有限狀態(tài)機建模工具,而且支持狀態(tài)機框架代碼的自動生成,借助它可以更加輕松地構(gòu)建基于有限狀態(tài)機的應(yīng)用系統(tǒng)。參考資料:
- 從Wiki百科全書 http://en.wikipedia.org/wiki/Finite_state_automaton開始,你可以了解到許多同狀態(tài)機相關(guān)的計算理論知識。
- 狀態(tài)機是UML的一個重要組成部分,Robert C. Martin在他的文章UML Tutorial: Finite State Machines中,介紹了如何使用UML語言來對狀態(tài)機進行建模,你可以通過網(wǎng)址 http://www.objectmentor.com/resources/articles/umlfsm.pdf可以找到這一文檔。
- FSME是Linux下一個基于Qt的狀態(tài)機建模工具,它能夠自動生成狀態(tài)機框架代碼,并且同時支持C++和Python語言,通過網(wǎng)站 http://fsme.sourceforge.net/你可以了解到有關(guān)FSME的更多信息,并能夠下載最新版本的FSME。
- Qfsm也是一個運行在Linux下的狀態(tài)機建模工具,它不僅提供了可視化的狀態(tài)機編輯器,而且還能夠?qū)ι傻臓顟B(tài)機進行實時模擬,通過網(wǎng)站 http://qfsm.sourceforge.net/可以了解到Qfsm的更多信息。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報投訴
-
代碼
+關(guān)注
關(guān)注
30文章
4886瀏覽量
70239 -
狀態(tài)機
+關(guān)注
關(guān)注
2文章
493瀏覽量
28063 -
軟件系統(tǒng)
+關(guān)注
關(guān)注
0文章
65瀏覽量
9613
發(fā)布評論請先 登錄
相關(guān)推薦
熱點推薦
如何設(shè)計自動駕駛系統(tǒng)的狀態(tài)機
狀態(tài)機模塊在自動駕駛系統(tǒng)中扮演著關(guān)鍵的角色,它負責(zé)管理和控制各個功能的狀態(tài)轉(zhuǎn)換和行為執(zhí)行。今天我們來聊聊如何設(shè)計自動駕駛系統(tǒng)的狀態(tài)機 。
發(fā)表于 09-19 15:07
?3325次閱讀

如何利用Linux下的工具來自動生成實用的狀態(tài)機框架?
(Finite State Machine),是一種應(yīng)用非常廣泛的軟件設(shè)計模式(Design Pattern)。本文介紹如何構(gòu)建基于狀態(tài)機的軟件系統(tǒng),以及如何利用Linux下的工具來自動生成實用的

Verilog狀態(tài)機+設(shè)計實例
在verilog中狀態(tài)機的一種很常用的邏輯結(jié)構(gòu),學(xué)習(xí)和理解狀態(tài)機的運行規(guī)律能夠幫助我們更好地書寫代碼,同時作為一種思想方法,在別的代碼設(shè)計中也會有所幫助。 一、簡介 在使用過程中我們常

使用ModelSim自動生成狀態(tài)機FSM的狀態(tài)轉(zhuǎn)換圖
HDL代碼設(shè)計中重要的內(nèi)容之一就是設(shè)計程序的狀態(tài)機FSM,狀態(tài)轉(zhuǎn)換控制著整個程序的流程,為了理解程序,我們經(jīng)常需要把狀態(tài)機的狀態(tài)轉(zhuǎn)換圖畫出來
發(fā)表于 02-10 15:39
?1.6w次閱讀

什么是狀態(tài)機?狀態(tài)機5要素
玩單片機還可以,各個外設(shè)也都會驅(qū)動,但是如果讓你完整的寫一套代碼時,卻無邏輯與框架可言。這說明編程還處于比較低的水平,你需要學(xué)會一種好的編程框架或者一種編程思想!比如模塊化編程、狀態(tài)機編程、分層思想

如何構(gòu)建基于狀態(tài)機的軟件系統(tǒng)
模式(Design Pattern)。本文介紹如何構(gòu)建基于狀態(tài)機的軟件系統(tǒng),以及如何利用Linux下的工具來自動生成實用的狀態(tài)機框架。
分享一款狀態(tài)機自動生成工具
為實用的軟件系統(tǒng)編寫狀態(tài)機并不是一件十分輕松的事情,特別是當(dāng)狀態(tài)機本身比較復(fù)雜的時候尤其如此,許多有過類似經(jīng)歷的程序員往往將其形容為"毫無創(chuàng)意"的過程,因為他們需要將大量的時間與精力傾注在如何管理好狀態(tài)機中的各種

狀態(tài)機自動生成工具FSME
好狀態(tài)機中的各種狀態(tài)上,而不是程序本身的運行邏輯。 作為一種通用的軟件設(shè)計模式,各種軟件系統(tǒng)的狀態(tài)機之間肯定會或多或少地存在著一些共性,因此人們開始嘗試開發(fā)一些工具來自動

自動生成程序狀態(tài)機代碼狀態(tài)機建模方法
首先運行fsme命令來啟動狀態(tài)機編輯器,然后單擊工具欄上的“New”按鈕來創(chuàng)建一個新的狀態(tài)機。FSME中用于構(gòu)建狀態(tài)機的基本元素一共有五種:事件(Event)、輸入(Input)、輸出(Output

如何生成狀態(tài)機框架
生成狀態(tài)機框架 使用FSME不僅能夠進行可視化的狀態(tài)機建模,更重要的是它還可以根據(jù)得到的模型自動生成用C++或者Python實現(xiàn)的

什么是狀態(tài)機?狀態(tài)機的種類與實現(xiàn)
狀態(tài)機,又稱有限狀態(tài)機(Finite State Machine,F(xiàn)SM)或米利狀態(tài)機(Mealy Machine),是一種描述系統(tǒng)狀態(tài)變化的模型。在芯片設(shè)計中,
評論