2012-12-18 35 views
0

當沒有任何實現細節可用於代碼的當前範圍時,應使用接口。爲什麼要抽象數據訪問層?

當您可以使用一些實現細節時,應該使用摘要。

查詢 - 爲什麼仍然需要這些條款?爲什麼Business對象不能直接與DataAccess.SqlServer Layer進行通信?

+3

更好的分層,更好的抽象,更鬆散的耦合 - 需要我繼續嗎? – duffymo

+2

對不起老兄...這太開放了...你可能會把這個問題關閉,因爲這個問題太開放了......但對於duffymo而言,鬆耦合是一個主要原因......如果你問這個問題,我懷疑你從來沒有經歷過大型項目重構的困境。 – Rikon

+2

我認爲你的問題會更適合http://programmers.stackexchange.com/ – Fabio

回答

6

當沒有任何實現細節是 可用於代碼的當前範圍時,應使用接口。

不是。你所指的是封裝。有「信息專家」的概念。只有知道如何做某事的班級應該是這樣做的班級。接口用於多態和解耦。當消費代碼想要以同樣的方式處理某些類型的對象時,該代碼可以以相同的方式將所有這些對象用作接口類型。

當一些執行細節 提供給您

我不知道你的意思在這裏文摘應該被使用。我覺得你很困惑,因爲這聽起來不對。抽象類的使用方式與接口相同,只是它們允許在其中實現。

查詢 - 爲什麼仍然需要這些條款?爲什麼業務對象 不能與DataAccess.SqlServer層直接通信?

它們可以但是以可維護性,靈活性和可測試性爲代價。如果要將數據層替換爲另一個數據層,則不能這樣做,因爲消費代碼對當前數據層有直接依賴關係。如果你想單元測試你的邏輯,你不能沒有擊中數據庫。如果您將數據庫類放在接口後面,則可以在單元測試中模擬數據層,並測試您的邏輯類而不碰到數據庫。

非常簡短的例子

public Foo FooLogic 
{ 
    IFooData fooData = DataAccessFactory.GetDataClass<IFooData>(); 
    return fooData.GetFoo(); 
} 

現在你的邏輯類不依賴於特定的數據類。工廠可以返回一個真正的FooData實現,或者它可以返回一個模擬數據對象,或者可以放置一個新的數據訪問層,而不會影響邏輯類中的代碼。

+0

+1。你能舉出最後一段的簡短例子嗎? – Pankaj

+0

@ytftyffty完成。希望能幫助到你。 –

+0

@abcdefghi這有幫助嗎? –