沒有進攻但有幾個代碼的氣味在那裏:
this.Blah = this.Blah.Resolve(...);
這條線特別拉爾會讓我開始重新思考的過程。
我有問題的主要問題是對象返回類型和屬性,以通過調用該屬性的方法返回一個值的分配。這些都讓人覺得你在某個地方弄糟了繼承,最終導致了一個嚴重的狀態系統,這個系統既是一個測試者,也是一個需要維護的痛苦。
也許最好是重新思考,而不是試圖用黑客和技巧來回避這個問題:我通常會發現,如果我試圖用像宏一樣的功能來濫用語言,那麼我的設計需要工作!
編輯
好了,添加了信息也許這與其說是臭的,但我還是建議如下:
class ExampleExpr{
StatefulData data ... // some variables that contain the state data
BladhyBlah Blah { get; set; }
object Function(params) {
this.Blah = this.Blah.Resolve(params);
....
}
}
此代碼是令人擔憂的,因爲它迫使完全基於狀態的方法,產出取決於事先發生的情況,因此需要採取特定步驟進行復制。這是一個很難測試的問題。另外,如果你調用Function()兩次,不能保證Blah會發生什麼,而不知道它在什麼狀態。
class ExampleExpr{
StatefulData data ... // some variables that contain the state data
object Function(params) {
BlahdyBlah blah = BlahdyBlah.Resolve(params, statefulData);
}
}
如果我們使用後廠式的方法,而不是,返回與每當我們都帶有一組特定的參數的特定信息的新實例,我們已經消除了一個地方,使用狀態數據(即BladhyBlah實例現在每次調用時都會重新創建一個特定的參數集)。
這意味着我們可以在測試中複製任何功能,只需使用特定的Setup()函數調用Function(params)來創建statefulData和一組特定的參數。
從理論上講,這樣做效率不高(因爲每個工廠調用都會創建一個新的BlahdyBlah),但可以使用特定數據緩存BlahdyBlah的實例並在工廠調用之間共享它們(假設它們沒有其他影響他們的內部狀態)。但是,它更加易於維護,從測試的角度來看,它完全支持有狀態數據的流氓行爲。
這也有助於消除原來的問題,因爲當我們不依賴於內部實例變量我們都可以解決(參數,可以statefulData)從外部功能(PARAMS),根本不叫如果任一功能(PARAMS) blah == null或blah.SomeFlag == SomeFlag.Whatever。因此,通過將這種方法移到外面,我們不再需要擔心收益。
希望這是在正確的場地的某個地方,很難確切地知道推薦給出一個小例子的建議,正如通常在這裏的困難/抽象問題的情況。
這是混亂,討厭,和冗長,但這是我不得不去的。可能沒有更好的方法。 – zildjohn01 2010-07-05 12:10:52