2010-11-29 41 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的实现。