2010-09-06 59 views
1

我正在構建硬件安裝(水循環系統)的控制系統。我設計了兩層:硬件描述層和控制層。層之間的逆向依賴問題

+----------------------------------------------+ 
| 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); 

的問題是,這使得低層(硬件層)意識到它上面的智能(它的控制器)。這不僅打破了層之間的單向依賴性規則,而且由於所有硬件描述類都應該是可序列化的,這使得代碼變得複雜,因爲所有對較高層的引用都需要是可選的,聲明爲瞬態等。

現在我試圖決定是否通過硬件描述層來提供控制是好的還是壞主意,或者是否有其他可行的方法。我只能想到一種涉及鏡像和委託幾乎所有硬件描述層的方法,這似乎是侵入性好的方法。

所以我的問題是,如果你們中的任何人都認識到這種情況,並有任何提示/經驗。它有名字嗎?是否有任何良好的模式/最佳實踐,是否還有其他知名的圖書館/框架,這些圖書館/框架也有這方面的工作和解決方案?

謝謝。

回答

0

您沒有向我們展示從硬件描述中分離控制器邏輯會帶來哪些好處。你確定這種分離是值得的嗎?

聽起來你正在建造一個Anemic Domain Model

+0

好東西。這是我一直在想的,它有點不正確。最大的問題是不能將數據與邏輯分開。在簡單的例子中,這可能是可能的,但硬件描述(需要採用容易序列化的格式)和邏輯之間確實存在很大差異。所以人們也可以爭辯(根據DDD)我有兩個應該有兩個不同模型的子域。 – 2010-09-06 18:10:03

+0

爲什麼很難?爲什麼不能簡單地將控制器的方法移動到可序列化(或其他持久化類)?沒有對象持久性框架,我知道是困擾,如果類有超越setter和getters的方法... ... – meriton 2010-09-06 18:18:49

+0

它通常比你描述它更復雜 - 首先你有我做的另一個模型參數,但對象序列化技術通常會提出相當高的要求在對象上,所有的屬性必須是可修改的(JAXB),初始化的順序沒有定義,構造函數不會被調用等等。它可能在傳統的JPA環境中工作,對於一般對象圖具有不平凡的相互依賴關係並且啓動順序很快就會失控。 – 2010-09-06 18:32:48

0

採取域驅動的方法。

如果您也垂直打破系統(域)。然後這些垂直組件可以通過控制器相互通話,而不是其他任何東西。保持每個域內的水平層,並且分層在域內垂直,並且每個域彼此隔離,因爲它們只能通過控制器進行通信。

+0

你能更具體一點嗎?如果我看看我的特殊情況,我想不出更多的顆粒狀區域,而不是「調節熱量」。你會如何命名域名和控制器? – 2010-09-06 13:28:46

+0

我會說每個設備通過控制器與另一個設備通信。 – 2010-09-06 14:17:28

+0

我很抱歉,但我不明白這是如何避免再次從硬件描述上升,你能否詳細說明一下? – 2010-09-06 14:19:36

0

不太清楚你的問題是什麼。如果你不想在你的硬件類getController()方法,你可以存儲硬件>控制器映射弱哈希映射

public class Controller 

    static WeakHashMap<Hardware,Controller> map = ... 

    static public Controller of(Hardware hw){ return map.get(hw); } 

    Controller(Hardware hw) 
    { 
     map.put(hw, this); 
    } 

很多時候,人們都喜歡加上「方便」的方法,具有依賴性

user.getThis() 
user.getThat() 
user.getTheOthers() 

User類是核心類無懼複雜的,它不應該有這種knowlege,這和其他人。現在一個代碼依賴於User類,而User類依賴於很多其他類。最終的結果是應用程序中的每個類都依賴於其他任何類,這是一大堆混亂。

+0

取點。但是,無論如何,如果我有這種關係,但間接地,如你所示,這樣更好嗎?也許我應該有這種關係。 – 2010-09-06 18:43:13

0

這是我想到的複雜解決方案。

                -+ 
+--------------------------+    +-----------------+ | 
| HeatExchangerController |    | PipeController |  > Controller Layer 
+--------------------------+    +-----------------+ | 
      ^1 controller      ^1 controller -+ 
      |          | 
      v 1 heatExchanger      v 1 pipe  -+ 
+---------------------------+ inputPipe 1 +------------------+ | 
| ControlAwareHeatExchanger |--------------| ControlAwarePipe | > Decorated HW Layer 
+---------------------------+ 1 otherSide +------------------+ | 
      |          |    -+ 
      v 1 realExchanger      v 1 realPipe -+ 
+---------------------------+ inputPipe 1 +------------+   | 
|  HeatExchanger  |--------------| Pipe  |   > HW Layer 
+---------------------------+ 1 otherSide +------------+   | 
                   -+ 

裝飾層將包含類似的代碼::

class ControlAwareHeatExchanger { 
    private final HeatExchanger realExchanger; 
    private final ControlAwarepipe inputPipe; 

    public ControlAwareHeatExchanger(HeatExchanger decoratee) { 
    realExchanger = decoratee; 
    inputPipe = new ControlAwarePipe(decoratee.getInputPipe()); 
    } 

    public ControlAwarePipe getInputPipe() { 
    return inputPipe; 
    } 

    ... 
}  

這樣,它在HW層,它增加了鏈接到控制層的每個HW對象的頂部增加了一個裝飾層你可以這樣做:

ControlAwareHeatExchanger controlHE = heatExchangerController.getHeatExchanger(); 
ControlAwarePipe controlInputPipe = controlHE.getInputPipe(); 
ControlAwareHeatExchanger otherHE = controlInputPipe.getOtherSide(); 
HeatExchangerController otherController = otherHE.getController(); 

所以,你可以去下到裝飾HW層,跳來跳去,然後返回到控制器層再次,所有沒有硬件層寂寂控制層。

但是正如你所看到的,你需要鏡像所有連接並裝飾整個硬件層以實現這個目標。很多代表團將參與其中。思考?