2015-06-11 84 views
1

我使用狀態機爲我的C#的GUI應用程序時處理。有了這個,我有幾個狀態和一個叫做ErrorHappened的狀態。狀態機可以從每個狀態進入這些錯誤狀態。但是使用這種架構,我首先知道當狀態機進入ErrorHappened狀態時發生錯誤。錯誤使用狀態機

但我可以從一個狀態到狀態B的錯誤發生在過渡期間時怎麼辦?問題是狀態機從狀態A進入狀態B進入狀態ErrorHappened。通常我會在轉換到狀態B時完成一個動作。如果在轉換過程中出現錯誤,我不會執行此操作。當然,我可以引入一個像m_ErrorHappened這樣的bool變量,但在我看來,我有一個狀態機,所以我不必強制使用任何狀態變量。

我希望解釋是非常明顯的,以提供任何幫助。

示例代碼:

StateMachine sm; // initial state is state A 

void AtoB() // executed during transition from A to B 
{ 
    if(DoSomething()) 
    { 
    print("Error"); 
    // Event ErrorHappened, state machine goes into state Error 
    sm.GotoState(ErrorHappened); 
    } 
} 

void TransitionEnd(State NewState) 
{ 
    if(NewState==B) 
    { 
     GreenLight(); 
    } 

    if(NewState==Error) 
    { 
     RedLight(); 
    } 
} 

main() 
{ 
    sm.GotoState(B); 
} 

現在,當出現錯誤綠色,然後紅色的燈就亮了。因爲狀態機從狀態A轉到狀態B到錯誤狀態。有沒有辦法檢測到錯誤,只有紅燈亮起?

+0

示例代碼是值得1000個字。 – sstan

回答

1

您可能要更改狀態機設計,使遷移不能引發錯誤:一個轉變是保證設計無差錯。

與一個模型,它允許在過渡錯誤相比,你將不得不增加更多的狀態和轉換,但後來這就是你的錯誤檢測和錯誤處理會去。在這樣的設計中,你可以使用一般的轉換機制,任何自定義的處理程序都會與狀態相關聯,而你可能正在顯示的是與轉換相關的自定義處理程序(也可能是狀態的通用處理程序,我可以不要用提供的代碼說)。

例如,除了從A到B的轉換之外,您可能需要添加從A到某個錯誤狀態的轉換,並且選擇依賴於A的自定義處理程序。或者,您可能會在A和B決定是否有錯誤,如果不是,則進入B,否則進入錯誤狀態。