2010-09-27 22 views
0

設計理念問題之間進行切換:模式的行爲的離散模式

  1. 假設我有繪製的對象的集合的特性的曲線圖的用戶控件。
  2. 該控件放置在具有長壽命控制器類的窗體上,該類暴露要繪製的對象集合。
  3. 該窗體還包含一個控件,可以在「模式」或不同的繪圖樣式之間切換。不同模式之間從使用中揭示其公共屬性的對象的邏輯是不同的,但控件並不關心這一點。
  4. 將數據初始緩存到對象實例相當費力,並導致顯示控件的某些功能出現性能問題。
  5. 儘管具有不同的邏輯,該對象實例表示同一組的建模變量/事物(但是你喜歡想象它們)之前和模式改變

問題的中點處的性質3表明,後所收集的實例應該被視爲抽象的基礎,並且存在具有不同內部邏輯的兩個不同的派生類。不幸的是,這表明應該在每個模式開關中完全重新生成整個對象集合,浪費時鐘週期。

有沒有人有任何一個簡單模式的基地不同實施之間傳輸緩存數據的例子?我認爲一個重載的構造函數需要一個基類的實例,但這聽起來非常可怕。也許人們不同意和喜歡這種風格,在這種情況下,我會考慮解決這個問題。

編輯#1:

一些澄清這個問題的具體情況;我猜想我的原始問題可能很模糊......

例如,讓控件附加的綁定屬性爲List<BaseClass> ControllerClass.Items

讓該控制詢問辦性質的工作是一些類似

double BaseClass.NumericProperty 
IEnumerable<Thing> BaseClass.AggregateProperty 

讓我們有(至少)的BaseClass兩個不同的子類稱爲DerivedClass1DerivedClass2。當控制切換模式時,意圖是ControllerClass.Items將表示執行適當的內部邏輯以公開這些屬性的項目的列表。

我建議在內部模式開關,即設定Controller.Mode = NewMode,控制器會通過執行類似_list_internal[i] = new DerivedClass2(_list_internal[i])目前在那裏_list_internal包含一組DerivedClass1 S創建一套新的DerivedClass2,然後引發一個事件(像INotifyPropertyChanged的或其他)通知控制。 DerivedClass1DerivedClass2的構造函數都以BaseClass作爲參數,將其細分爲檢索兩者共有的數據。

我的問題是,這是一個公認的模式;如果沒有,爲什麼不,以及有什麼替代方案,牢記效率和每次UI執行任何操作時不要丟棄數據的需要。

+0

我在跟着你,關於你的對象是如何構成的小麻煩。代碼示例可能有所幫助。 – mikemanne 2010-09-27 18:22:03

回答

2

我同意mikemanne這個問題有點模糊,但是從我的理解,以獲得最大性能模式切換的時候,你就不得不接受一個略高的啓動緊縮:

  • 控制器應與圖形用戶控件和模式切換器一起工作。基本上,它變成了頁面控制器而不是任務控制器。
  • 控制器應預先保溼並維護包含所有顯示模式基礎數據的對象集合。這些可以是來自域模型的實際對象,也可以是包含從域計算出的結果的輕量級DTO集合。
  • 當控制器被要求切換模式時,應該使用一個獨立的DrawHelper類將數據點轉換爲圖形。每個DrawHelper都適用於一種繪圖模式,並且它們都與控制器相同(它們從相同的基本類型或接口繼承)。這被稱爲戰略模式。

以下是無號:

  • 切勿將打開數據轉換成圖表點到你的域模型所需的邏輯。域模型不應該知道你打算如何使用它的數據,因爲如果它做了,並且發生了變化,當域(它的基本職責,它應該是它唯一的一個)沒有的時候,域對象會改變。
  • 不要每次都重新灌水數據。這就是你知道你試圖避免的,但要做到這一點,確保你的控制器實際上是「長壽」的。許多Web框架生命週期會摧毀請求之間在服務器端使用的所有內容,只會保留「會話」狀態包並要求您重新保存控制器。
  • 請勿將繪圖邏輯放入控制器中;它會變得巨大。你甚至不應該把DrawHelper選擇邏輯放在控制器中;相反,讓Controller知道一個「工廠」,可以根據當前模式爲其提供所需的DrawHelper。
+0

被接受爲答案,因爲** KeithS **所說的話促使我改變了一些策略。我正在嘗試使'BaseClass'成爲一個通用的,這需要我稱之爲'PluggableDTO'的東西。通過這種方式,功能邏輯可以與主控制器交換出來,因爲它們之間有一個額外的抽象層,也就是設計恰當的BaseClass。如果有人有興趣,我會在接近工作的地方發佈代碼示例。 – 2010-09-29 18:18:34