2010-03-04 71 views
6

我發現自己不時做這類事情,我不知道它是否是一種設計氣味,或者是否有更好的設計模式可供使用。在類型列表中迭代

在編譯時有一些已知的步驟,但很可能會改變。我在一個抽象的Step類中捕獲了通用性,編寫了一個StepLister,它返回一個Step的列表,Step的每個派生類都有一個,然後是一個調用StepLister的StepsRunner,然後迭代列表並運行每一步。有時一步將取決於前一步的結果,有時不會。

有什麼建議嗎?

回答

2

你的方法對我來說聽起來很合理(迭代器/策略的組合)。

有時候一個步驟將取決於上一步的結果,有時不會。

雖然這一點很有趣。由於我不知道每個步驟應該做什麼,我只能提供非常一般的想法。

所有步驟之間的依賴關係可以通過語法樹interpreter-like建模,而不是您採取的連續步驟。因此,您的StepRunner將因上下文/解釋方法而被丟棄。

另一個想法可能是使用monads,它允許您按順序膠水步驟在一起,但我不知道如何容易,這將整合現有的面向對象的概念(因爲單子在功能編程通常使用)。

也許你並不需要(過)在複雜的萬物;)

1

我不知道我理解的問題的權利,但因爲你正在運行的程序的步驟,我會假設有一些上下文信息被保留,因此您正在討論根據當前結果選擇下一步。

事實上,這是一個自動機。你有不同的狀態通過轉換鏈接在一起。

要求每個步驟返回一些tag,可能只是一個字符串或適當定義的類型是很容易的。

然後,通過爲當前步驟的每個可能輸出確定下一步來定義自動機。

例如,我實際上使用一個框架(在工作中)將這些轉換作爲xml文件...儘管我很不喜歡這樣的事實,即對其進行的檢查很少或沒有正確定義轉換。

請注意,在C++中它可以在編譯時檢查(我正在考慮使用Boost.Variant和一些metatemplate編程技巧)。