我正在構建硬件安裝(水循環系統)的控制系統。我設計了兩層:硬件描述層和控制層。層之間的逆向依賴問題
+----------------------------------------------+
| Control (enables manipulation of devices) |
+----------------------------------------------+
| uses (decorates)
v
+---------------------------------------+ (de)serialize +------------+
| HW Description |<--------------->| Files/DB |
| (stores physical layout, cabling etc) | +------------+
+---------------------------------------+
硬件描述層包含硬件映射,描述管道如何連接到熱交換器和其他設備。該層的數據可以在每次安裝時進行配置,並且可以在運行時讀入。因此,硬件描述層中的所有類都應該以某種方式進行序列化(通過Hibernate /序列化到XML等)。
控制層將用智能來裝飾硬件描述層類,因此熱交換器將例如得到與其關聯的HeatExchangerController。
在這個系統中,在控制層的實體可能需要通過硬件描述找出他們的neirest鄰居,所以熱交換控制器可以做類似
HeatExchangerController neighbour = this.getHeatExchanger().getInputPipe().getOtherSide().getHeatExchanger().getController();
neighbour.notify(highLoadAlert);
的問題是,這使得低層(硬件層)意識到它上面的智能(它的控制器)。這不僅打破了層之間的單向依賴性規則,而且由於所有硬件描述類都應該是可序列化的,這使得代碼變得複雜,因爲所有對較高層的引用都需要是可選的,聲明爲瞬態等。
現在我試圖決定是否通過硬件描述層來提供控制是好的還是壞主意,或者是否有其他可行的方法。我只能想到一種涉及鏡像和委託幾乎所有硬件描述層的方法,這似乎是侵入性好的方法。
所以我的問題是,如果你們中的任何人都認識到這種情況,並有任何提示/經驗。它有名字嗎?是否有任何良好的模式/最佳實踐,是否還有其他知名的圖書館/框架,這些圖書館/框架也有這方面的工作和解決方案?
謝謝。
好東西。這是我一直在想的,它有點不正確。最大的問題是不能將數據與邏輯分開。在簡單的例子中,這可能是可能的,但硬件描述(需要採用容易序列化的格式)和邏輯之間確實存在很大差異。所以人們也可以爭辯(根據DDD)我有兩個應該有兩個不同模型的子域。 – 2010-09-06 18:10:03
爲什麼很難?爲什麼不能簡單地將控制器的方法移動到可序列化(或其他持久化類)?沒有對象持久性框架,我知道是困擾,如果類有超越setter和getters的方法... ... – meriton 2010-09-06 18:18:49
它通常比你描述它更復雜 - 首先你有我做的另一個模型參數,但對象序列化技術通常會提出相當高的要求在對象上,所有的屬性必須是可修改的(JAXB),初始化的順序沒有定義,構造函數不會被調用等等。它可能在傳統的JPA環境中工作,對於一般對象圖具有不平凡的相互依賴關係並且啓動順序很快就會失控。 – 2010-09-06 18:32:48