2
我有一個RuleTree數據結構,它表示用於處理傳入數據項的規則樹。在規則處理的API中包含可變狀態
- RuleTree是一個不可變的數據結構,它包含任意數量的(可能嵌套的)規則。
- 有多個線程將同時將相同的RuleTree應用於不同的輸入數據項
- RuleTree適用於輸入一個或多個階段的數據。由調用代碼決定應用哪個階段。
典型的控制流程是這樣的:
ruleTree.applyStage1(data);
..
// other stuff happens
..
ruleTree.applyStage2(data);
..
// other stuff happens
..
ruleTree.applyStage3(data);
這目前工作正常。但是,現在我需要在RuleTree處理期間計算一些額外的狀態信息(例如,計算樹中特定規則的匹配數量)。至於我可以看到它,我有幾個選擇:
- 充分利用RuleTree可變,使它能夠存儲以後可以回讀狀態信息。這會使併發更加棘手,但是由於不同的線程需要不同的RuleTree副本。
- 將線程本地狀態添加到RuleTrees - 以便狀態信息可以計算並存儲在RuleTree中,但不同線程不會踐踏彼此的狀態信息。但是這意味着所有階段都必須保證在同一個線程上運行。
- 爲狀態信息有一個單獨的對象,它可以作爲額外的參數傳遞給ruletree,
e.g. ruleTree.applyStage1(data, state)
。這使得RuleTree更好且不可變,但是使得它們更加複雜,因爲調用代碼現在必須單獨設置和管理狀態數據。
哪種方法可能是最好的,爲什麼?
感謝您的答案 - 我喜歡使用代理對象系統的想法! – mikera 2012-01-10 08:15:02
@mikera - 感謝您的有趣問題! – 2012-01-10 15:51:41