2015-09-24 46 views
1

總的來說,我的問題是關於最佳實踐和效率。今天,我和老師就MVC Legacy的面向對象進行了討論。我們正在經歷我以前的一個項目,問題是「有什麼意義?」 我的項目(和我的所有項目)的結構方式,對我來說沒有意義。以下是我的代碼後面的示例。MVC Legacy中的Java OOP

控制器 - 從form/View獲取字符串值並將它們傳遞給Service類。單一職責將聲明這是它所負責的一切,而不是創建一個對象來傳遞,但創建一個< Map < String,Object >>完全可以理解。

服務等級 - 遵循最佳實踐/單一責任,除了調用請求的方法/密碼值之外,這些方法不應該做任何其他操作。

DAO - DAO應該負責將所有數據/對象轉換爲D.B存取器的可用形式並將其返回。

但爲什麼建立一個對象只是爲了把它撕下來?特別是當你可以傳遞一個值列表作爲一個Map < String,Object>所以所有的值和列匹配?

以下是代碼片段來幫助說明我的問題:

服務類:

public class ClientService { 

     private Client_SQL_DAO_Strategy dao; 

     public ClientService(Client_SQL_DAO_Strategy dao){ 
      setDaoStrategy(dao); 
     } 

     public void sendClientToStorage(Client client) throws SQLException, ClassNotFoundException{ 
     dao.sendClientToDatabase(client); 
     } 

     public void updateClient(List values) throws SQLException, ClassNotFoundException { 
     dao.updateClient(values); 
     } 
} 

DAO

public void saveClient(Client client) throws ClassNotFoundException, SQLException { 

    List columns = new ArrayList<>(); 
    columns.add("Last_Name"); 
    columns.add("First_Name"); 
    columns.add("Business_Name"); 
    columns.add("Phone"); 

    List<Object> values = new ArrayList<>(); 
    values.add(client.getClientLastName()); 
    values.add(client.getClientFirstName()); 
    values.add(client.getClientBusiness()); 
    values.add(client.getClientPhone()); 

    accessor.createRecord(TABLE_NAME, columns, values); 
} 

public void updateClient(List listOfValues) throws ClassNotFoundException, SQLException{ 

    List<Object> columns = new ArrayList<>(); 
    columns.add("Last_Name"); 
    columns.add("First_Name"); 
    columns.add("Business_Name"); 
    columns.add("Phone"); 

    int primaryKey = Integer.valueOf(listOfValues.get(0).toString()); 

     accessor.updateRecord(TABLE_NAME, columns, listOfValues, PK_COLUMN, primaryKey); 

} 

在DAO中提供的兩種方法比較了該方法更有意義?創建客戶端將其關閉或將相關的值和列傳遞給訪問者?此地圖<字符串,對象>似乎是兩種方法的理想選擇。

是的,我也知道更新的技術,但在當前的學期Legacy是本週的教訓。

+0

你能說清楚'傳統'是什麼意思嗎?你不是指使用ORM的遺產嗎? – jrahhali

+0

@jrahhali我可能使用了錯誤的術語,對ORM有一個非常寬泛的理解。我對Object Relational Mapping的理解是一種OOP技術,用於在兩個使用相似但又不同數據類型的系統之間轉換數據,例如java存儲日期的方式與數據庫存儲日期的方式。而且,由於這是一種比較古老的技術,我認爲「遺產」,就我使用它而言,意思是「老派編程技術」。 –

+0

問題不在於它是在比較我提供的DAO中的兩種方法。問題是,爲什麼建立一個對象只能在DAO中解析它? –

回答

1

Spring MVC實現了Model-View-Controller設計模式。

控制器的職責是獲取/創建/填充模型併爲視圖準備環境。

該視圖負責通常通過JSP在Spring MVC中顯示模型數據,但您也可以指定視圖類,例如渲染Excel或PDF等。

模型實現域邏輯。根據您的實施情況,這可能是僅包含前端邏輯的「視圖模型」,也可能包含真實的業務規則。它應該是一個真正的階級。請勿使用Map<String, Object>。這種使用地圖犧牲了類型安全性,而不是OOP。

Service類是像一個控制器類對外服務協調,比如堅毅,電子郵件,付款等

的DAO類僅僅是持久性的服務提供商。它將對象表示轉換爲數據庫操作。該圖層可以被ORM替換。不要傳遞Map<String, Object>

如果您的應用程序使用的唯一外部服務是持久性,則可以避免單獨的服務和DAO類,並推遲分離直到您需要更多服務。

有關此類對象建模的更多信息,請查看Domain Driven Design