2009-12-24 32 views
3

我有一個數據訪問層,將應用程序的其餘部分從持久性技術中抽象出來。現在的實現是SQL服務器,但可能會改變。無論如何,我發現這個主要的數據訪問類越來越大,隨着我的表增長(現在大約有40個表)。這個數據訪問層的界面,你可能想要得到是否需要重構大型數據訪問層

public interface IOrderRepository 
{ 
     Customer[] GetCustomerForOrder(int orderID); 
     Order[] GetCustomerOrders(int customerID); 
     Product[] GetProductList(int orderID); 
     Order[] GetallCustomersOrders(int customerID); 
     etc . . . 
} 

背後的實現數據的任何問題是運行適當的查詢並返回結果類型集合

這個意願基本的SQL存儲的特效保持增長和增長。它的維護性非常好,因爲沒有單一職責的真正突破,但是現在類已經超過2000行代碼。

所以問題是,由於肯定的班級規模(並且沒有真正的概念耦合),是否應該分解,如果是的話,取決於什麼維度或抽象層次。

回答

2

絕對重構。 2000線是巨大的。

我會首先按返回類型分解它。因此,您將獲得一個訪問產品的類別,一個用於訂單,一個用於客戶等等。

對於每個類,所選的列集應該可能相同,以便可以將SQL值提取到對象中時重構爲單個變量/方法。

此外,對存儲過程的實際調用(包括日誌記錄和異常處理)可能並應該進入單獨的類。

順便說一句,你確實違反了單一責任。根據你的描述你的類現在具有以下職責:

  • 創建SQL語句查詢表(約40倍)
  • 保溼調用的結果存儲過程
  • 調用存儲過程

而且我假設 - 登錄 - 異常處理

1

我認爲它應該因爲大小而被分解。總是有很多維度可以用來分解它。由於分解只是爲了使代碼更易於管理,因此不要選擇過於複雜的維度 - 保持簡單,以便輕鬆猜測給定函數將在哪個類/接口中找到。

1

這是一個難以解決的難題....首先將其分解成多個文件和類,然後從工藝對象中分割業務對象;您可以使用數據庫接口(您自己編寫)編寫業務對象。然後在未來如果您更改數據庫,您只需要替換該技術對象。可悲的是,你不能真正擺脫數據模式的增長,你會得到更多的存儲過程,更多的表和更多的業務對象。然而,試試你的水平最好改變而不是添加新表格。

我建議試圖形成一個工作流程,將它們作爲資源耦合在一起。通過這個,我的意思是不做物理依賴關係,但是可以讓你關聯數據層中所有三種類型的文檔的文檔 - 例如,你可以開始在業務對象的註釋中註釋註釋,以指定哪些存儲過程和表這取決於。即使在SQL Server的表中,您也可以爲存儲過程執行此操作(模式具有表的描述字段)。這些提示應該可以幫助您瞭解整體情況。

+2

請不要「嘗試[..]改變相當牛逼韓增加新表「。很多桌子都不是問題。如果你需要創建一個。 –

+0

我不是在暗示拋棄常識 - 考慮以下兩點:首先,標準化的討伐可能會很糟糕,無論是爲了數據模型的清晰度還是性能。其次,我看到許多程序員爲類型創建新表格,這些表格可以優雅地統一到單個數據結構(表格)中。 –

0

考慮一個通用的DAO,如果你的語言適應他們。您也可以考慮通過示例查詢來減少所需的呼叫次數。