2012-03-20 83 views
2

我試圖設計一個類結構具有以下多個集合容器類:設計實踐與相互引用

  • 集裝箱類持有的所有項目。
  • 項目收集類,這是所述的容器,其中,每個項目都有一個唯一的ID和其他一些數據,包括一個ItemStyle基準內部。
  • ItemStyle集合類,這是集裝箱,其中每個ItemStyle代表項目的共同風格,也給其他款式的關係裏。

關係可以是「附加到」,其中樣式具有可以附加到的其他樣式的列表,而「附件」是與其相反的。如果一種風格可以「附加到」另一種風格,那麼其他風格應該能夠產生作爲其「附件」之一的第一種風格。

容器管理項目和ItemStyles。我爲所有內容使用唯一的ID,因爲我希望能夠序列化XML和XML。

但是我一直遇到邏輯問題,例如我試圖從XML反序列化一個ItemStyle,但它當然不能生成對它讀取的項目ID的引用,因爲只有容器本身可以訪問其他項目。

另一個問題是我希望這些類是獨立的,如果我有一個項目的引用,我可以調用一個兼容的項目列表,如調用「Item.Attachments」或「Item.AttachesTo」。這當然都需要由容器來計算,因爲它是唯一能夠訪問ItemStyles和Item集合的類。

於是我運行到我要去的地方有給每個項目和ItemStyle一個參照容器,使他們能夠執行自己的查詢,並確定其與其他項目的關係的解決方案。這看起來很糟糕的封裝和糟糕的面向對象操作,但我想不出其他任何方式。

我想我的代碼比較到ListView如何工作的一個例子。一個ListView有一個ListViewItemCollection和ListViewItems。在用戶代碼中,當您可以創建新的ListViewItem並將其添加到ListViewItemCollection時,它現在會自動引用其父級ListView。查看元數據時,它將ListView引用顯示爲只有一個getter。我可以假設它使用內部設置?

如果以下所有者/項目的關係的工作與我的課ListView的模式?

回答

2

綜觀所有參與類之間的緊密耦合,我不認爲有父(容器)的引用將是一個壞主意。有許多模型依賴於父引用(典型的原因可能是確保單個父代,但其他原因,如驗證等可能是一個原因) - 模型的一種方法是通過非公共構造函數和構造對象工廠方法。另一種建模方法是使用公共構造函數,但有內部設置器來設置父引用。每當孩子被添加到父母的收藏對象時,參考就會被設置。

我更喜歡後面的方法。但是,我會做的一件事是避免與Container直接耦合。相反,我會介紹​​界面,該界面會抽象齣兒童和兒童所需要的查詢(Item/ItemStyle)只會知道關於​​的界面。

另一個合理的設計是當他們想要查找時從孩子們那裏引發事件。這些將是內部事件,當孩子被添加到容器中時,這些內部事件將由容器處理。

另一種方法是製作一個寬鬆的模型。實質上,Item可以保留自己的ItemStyle參考。無論何時需要,Container都可以通過實現訪問者模式來構建ItemStyle集合。