2010-11-29 73 views
3

好吧,我決定開始在我的代碼庫中使用接口,這對於某些任務來說效果很好。例如,我有一個實現IUrlBuilder的URL構建器類,現在實現並不重要。輝煌但以此界面爲例。基於接口的編程,我做對了嗎?

namespace SproutMessagingFramework.Webtext.Interfaces 
{ 
using System.Net; 

public interface ICookieJar 
{ 
    CookieCollection Collection { get; set; } 
    CookieContainer Container { get; set; } 

    void AddResponse(HttpWebResponse Response); 
    void AddResponse(HttpWebResponse Response, string Path, string Domain); 
} 
} 

在我看來這個接口非常具體,這兩個方法不會比具體類已經做的更多。那麼,爲什麼我把它作爲一個接口?那麼我的想法是如果我需要改變AddResponse的實現?

這是正確的還是我只是膨脹的代碼庫?

+0

基於接口的編程是關於解耦的。你打算版本化還是有不同的實施......? – 2010-11-29 12:48:37

+0

我從不擔心太多意圖。只要擴展我的代碼庫的方法出現在適合我的代碼中。我不會竭盡全力去構建假設,但同時我也不會在腳下自殺。 – deanvmc 2010-11-29 12:59:11

回答

8

接口可以設計爲與特定類別1:1對應。這允許(除其他之外)與模擬框架集成,在此模式下,您可以用一個假裝的Cookie jar代替真實的cookie jar,同時在測試環境中驗證cookie怪物的行爲。

但是,更常見的是,接口定義類的功能子集,並且通常可以與類本身正交。正交接口的一個很好的例子是IDisposable。當類想要支持非託管資源(如套接字,文件描述符等)的清理回收時,類實現了IDisposable,儘管資源清除不是該類實際設計的目的。

另一個常見用途是提供統一的容器模型,如ICollection和IEnumerable。最後,類通常實現多個接口,通常對應於其能力的正交截面。

+0

謝謝,我想我只是確認我的實施。我總是擔心在我的代碼庫中添加「絨毛」。但是,自從使用接口以來,事實就被告知了,因爲實現並不重要,所以我可以通過概念化來加速。 – deanvmc 2010-11-29 13:00:50

2

即使只有一種方法可以自己實現AddResponse方法,我仍然可以想象0123,的實現在將調用轉發給接口的某個具體實例之前做了某些操作。

例如,添加診斷日誌記錄的實現,或者在存儲Cookie時透明地重命名cookie的實現。