2013-10-31 67 views
1

我正在寫,通過與N多的步驟的算法去一個控制檯應用程序。重要的是,步N執行步驟N+1之前,正確完成。否則,程序應該停止工作並顯示錯誤消息。設計模式爲多步算法

我可以用嵌套的if語句來做到這一點,並使用try-catch-finally(最後使用continue標誌來決定程序是否應該處理)。但我正在尋找一個更好的結構化設計模式或方法來做到這一點。任何建議?我喜歡

+0

工作流程是否改變? –

+1

你能提供關於你算法的更多信息嗎?這似乎可以使用While循環完成。 – Bas

+1

是遞歸可能嗎? – Jonesopolis

回答

2

我曾經創建的被控制自動化的過程,我使用的枚舉的所有步驟

enum AutomationStep{Requested, Started, Waiting, Processing, Terminating}; 

後來我創建了一個開關/情況來處理的每一步不同

switch (currentStep) 
{ 
    case AutomationStep.Requested : InitializeProcess(); currentstep = AutomationStep.Started; break; 
    case AutomationStep.Started : StartTheEngines(); currentstep = AutomationStep.Waiting; break; 
    case AutomationStep.Waiting : //etc 
    break; 
    default: 
} 

您稍後可能會使用一段時間運行每一步

0

一種模式是因爲它的進展從一個步驟到下一個,以指示它是在處理以更新該對象的狀態。

,而不是處理一個對象從開始到結束,我有算法的每一步選擇的所有對象在給定的狀態,對它們進行處理,並更新自己的狀態,以準備下一個步驟。

我做的過程中交易的每一個步驟,從而使物體已經要麼完全發展到下一個步驟,或回滾到以前的狀態,並準備再次經歷這一步。

這樣,如果您的程序在中間被中斷,您可以重新開始備份,所有對象都可以在過程中停止的地方繼續。

0

使用遞歸併返回或停止,當你打一個不正確的一步

public void Process(int n) 
{ 
if(n % 23 != 0)return; 
Process(n+1); 
} 

n將是你的工作數據集或當前設置項。決定使用哪種數據結構取決於您。此外,23的模數檢查是顯示何時從遞歸檢查中斷開。

+1

但它的步驟中的算法......即步驟1:確定參數是否均勻。步驟2:將參數乘以3.步驟3:添加參數...因此遞歸在這裏不起作用,因爲這是改變的步驟。 – neeKo

+0

@NikoDrašković - 一種方法是將步驟存儲在動作中,然後使用int動作字典。那將是「數據結構」方面。 –

+0

如果你有一個動作集合,你只需要做一個foreach。遞歸沒有意義。你寫的遞歸本質上是一個'for(int n = 0; n <23; n ++){..}',完全不必要的開銷。 – neeKo

4

流水線設計模式正是關於這一點:以嚴格的步驟順序執行復雜的過程。谷歌的「管道設計模式」,你會發現大量的資源。

This是一個面向程序設計的MSDN上的介紹性文章,this是一個比較理論化的文章。

4

責任鏈

http://www.codeproject.com/Articles/455228/Design-Patterns-3-of-3-Behavioral-Design-Patterns#Chain

或國家模式

http://www.codeproject.com/Articles/455228/Design-Patterns-3-of-3-Behavioral-Design-Patterns#State

可能是你的問題的解決方案。

對於責任鏈模式,當您檢測到錯誤時,您只需將「錯誤消息(處理)」過程設置爲鏈中的下一個過程。

對於狀態模式,遇到錯誤時需要將狀態更改爲「錯誤」,並處理錯誤狀態下的所有錯誤。

希望這會有所幫助。