2015-10-20 52 views
2

我有一個場景,我想將對象轉換爲服務請求對象類型來調用服務。數據類中的適配器類vs toXXX()方法

我有一個數據對象是這樣的:

class Data { 
    int val; 
    ... 
} 

我想這個對象轉換爲服務請求對象可以說DataRequest。我正在考慮這兩個選項:

1.在Data類本身中有一個toDataRequest()方法。

class Data { 
    int val; 
    ... 

    public DataRequest toDataRequest() { 
    .. 
    } 
} 

2.有一個單獨的類DataAdapter,並具有適應於它的方法,它返回DataRequest對象。

class DataAdapter { 
    public DataRequest adapt(Data data) { 
    ... 
    } 
} 

我傾向於第一,因爲它有助於減少班級數量。我很想聽聽,這個用例的一般建議是什麼?

+2

或'DataRequest.create(Data)'? – ZhongYu

+0

如果您有權訪問服務圖層類「DataRequest」,這將起作用。但不幸的是,我沒有。 – Kevindra

+1

一個純粹主義者會對第一個選項皺眉,因爲較低層的類對高層類有依賴性。這可能會導致問題,但可能在您的應用程序中可以。這只是一個方便的方法,我們需要把*放在某處*;依賴是超表面的。 – ZhongYu

回答

1

這取決於你的架構。通常你有一個服務層和至少一個持久層。服務層位於持久層之上,通常架構只允許從較高層到較低層的訪問。例如。

+----------------------------+ 
|  service layer  | // request object is placed here 
+----------------------------+ 
       | depends on 
       V 
+----------------------------+ 
| persistence layer  | // Data object is placed here 
+----------------------------+ 

因此,當你Data對象具有public DataRequest toDataRequest()它具有一個依賴於DataRequest的方法,這意味着較低的層具有的依賴關係到一個更高的層。這通常不是你想要的。

因此,如果您使用您的DataAdapter(也稱爲DataMapper)並將其放置在服務層中,您將尊重上面顯示的體系結構。

您也可以在DataRequest中實現映射邏輯。

+0

感謝您澄清! – Kevindra

0

做第一個選項通常會更好。我們以String類爲例。如果班級的作者認爲它很有用,許多班級可以變成字符串。這個類的編寫者只需要在他們的類的最後添加一個toString方法。他們不必要求Oracle根據這些開發人員編寫的類爲Strings添加工廠方法。這不僅會讓甲骨文難以維持,而且還會讓人感到厭煩,因爲String對象的開銷會隨着所有工廠方法而急劇增加。