2013-03-28 77 views
3

我對我正在開發的應用程序中過度使用接口有一些擔憂。這是一個報告應用程序,它只是執行SQL語句並分析一些存儲列屬性的XML。是否所有的對象都有一個接口?

我已經結束了爲每個類創建接口,所以我可以換出實現。我們都看到某種形式的以下內容:

interface IFoo 
{ 
    IBar GetBar(); 
} 

class FooA : IFoo 
{ 
    IBar GetBar() 
    { 
     return new BarA(); 
    } 
} 

class FooB : IFoo 
{ 
    IBar GetBar() 
    { 
     return new BarB(); 
    } 
} 

我理解的優勢,以發展這種方式包含具體的實施細則類,而應這種模式應遵循的在我的應用程序的每個類?

這裏是我的應用程序(簡體)例如:

interface IColumnDefinition 
{ 
    int Ordinal { get; } 
    string HeaderColor { get; } 
} 

class ColumnDefinition : IColumnDefinition 
{ 
    private readonly int _ordinal; 
    private readonly string _headerColor; 

    public int Ordinal { get { return _ordinal; } } 
    public string HeaderColor { get { return _headerColor; } } 

    public ColumnDefinition(int ordinal, string headerColor) 
    { 
     _ordinal = ordinal; 
     _headerColor = headerColor; 
    } 
} 

如果我只是分配一個以後可以使用只讀屬性值,什麼是真正創造這個單獨IColumnDefinition接口的地步?

微軟不在他們的System.Data.DataColumn或他們的System.Windows.Forms.DataGridViewColumn中使用接口,對我來說是否合理使用它,爲什麼? PS:請不要把我釘死在十字架上,因爲微軟不做任何事情,我也不應該 - 這些只是廣泛使用的類似對象的兩個例子,由知道更多的人創建關於編程比我

+2

請參閱[只是我或接口過度使用?](http://stackoverflow.com/questions/90851/is-it-just-me-or-are-interfaces-overused) – Romoku 2013-03-28 02:10:59

回答

3

提取接口從什麼是基本數據傳輸對象是在典型情況確實矯枉過正(所有的東西,有例外)。你想代碼到接口的表達邏輯類,你希望有靈活的替換原因或其他(例如,單元測試!)的邏輯。但是,如果您正在更換的類只保存數據,則只需使用該類。如果後來你發現你需要注入有意義的邏輯,那麼在這個時候繼續並提取接口,如果它可以幫助你的話。

要清楚,我不希望ColumnDefinition,因爲你已經定義它,實現一個接口,沒有比我更期待與接口,而不是stringint,或DateTime(*)的工作。代碼作用於ColumnDefinition的實例將是我可能期望找到接口實現的地方,特別是當我想要擺脫那個特定邏輯時(當我測試其他代碼依賴於它時,或者如果其他代碼應該可以擴展等)。


*我有時發現需要更換DateTIme.Now,但是,這並不需要在DateTime類型的接口明確。

0

對我來說,除非你打算在這種特殊情況下使用多態,否則沒有理由爲每個對象都有一個接口。

接口對於多態性有很大的用處,或者當你在團隊中有更多的開發人員時,所以你可以使用接口作爲開發人員之間的「契約」。

請注意,給定的考慮是隻爲你的具體情況(接口有比我指定的人更多用法)

6

快速的思想實驗:如果你的應用程序,它的整個生命週期過程中,將永遠不會有一個以上的執行界面(不包括單元測試代碼),那麼你浪費了你創建界面的時間。

訣竅是如何知道您的應用程序在其整個生命週期內永遠不會有多個接口的實現(不包括單元測試代碼)。

當然,如果你不能知道,那麼一個受過教育的猜測將不得不這樣做。


的選擇,當然,是在創建之前,要等到你需要接口。一般來說,我寧願等到我需要什麼東西才能創建它。

3

有人會爭辯所有對象有一個接口 - 無論它們是否使用可共享定義interface或不。一個類的非私有方法/屬性可以被認爲是它的「接口」。

原因之一(據推測)爲什麼DataColumn沒有定義interface是因爲它是爲一個目的而設計的 - 定義一個DataTable的列。 DataTable類的設計者可能沒有看到取消定義和允許使用多個實現的價值。

使用interface小號他們有意義 - 你希望能夠存根或模擬的單元測試,當一個類的多個實現將是有價值的任何時候(如IDataReader)等。如果有一個接口提供沒有價值,那麼不要打擾。像Resharper這樣的工具提供了一種簡單的機制,可以將類中的公共方法/屬性提取到接口中,稍後需要。

擁有每個班級的interface很可能矯枉過正。

相關問題