使用界面总是有帮助的吗?

时间:2012-03-30 07:43:07

标签: c#

对不起,这是与建议有关的问题,而不是问题。

我想知道什么时候应该使用界面,什么时候不应该。

为了清楚说明我的问题,我将使用和不使用接口编写我当前的实现:

WITH INTERFACE

interface IObjectBuilder
{
   string Build();
}

class ObjectABuilder: IObjectBuilder
{
    ObjectABuilder(Object A){}

    public string Build();
}

class ObjectBBuilder: IObjectBuilder
{
    ObjectABuilder(Object B){}

    public string Build(){}
}

没有接口1:

class ObjectABuilder
{
    ObjectABuilder(Object A){}

    public string Build(){}
}

class ObjectBBuilder
{
    ObjectBBuilder(Object B){}

    public string Build(){}
}

没有界面2:

class ObjectABuilder
{   
    public string Build(Object A){}
}

class ObjectBBuilder
{

    public string Build(Object B){}
}

所以,我想知道,在这种情况下:

  1. 我应该使用有无界面,为什么?

  2. 对于没有接口的情况,你认为用objectA(b)构造类更好或者只是直接在方法中传递它?

  3. 提前致谢。

4 个答案:

答案 0 :(得分:3)

您并不总是需要interface。他们会达到你要做的一点,也许你想与另一个模块共享,你宁愿它只依赖于interface而不是具体的实现?也许您想测试单元测试的接口实现?我会说在没有界面的情况下开始,直到你能证明你需要它为止。

对于第二个问题,班级中的其他方法是否需要Object?如果是,那么我将在构造函数中传递它,以便这些方法可以共享Object。如果没有,那么我会保留它。

共同主题是DTSTTCPW

答案 1 :(得分:3)

总是没有答案对所有情况都有效:

您可以阅读MSDN“开发类库设计指南”中的Choosing Between Classes and Interfaces,以获得更多信息。

然而,这些指南针对的是类库,对于其他类型的项目,指南可能或多或少有所不同。 (IE:使用DI时,有利于在类上使用接口)

使用接口“是”最佳做法,但应考虑所有注意事项,版本控制,继承,向前和向后兼容性等。

答案 2 :(得分:2)

有几个论点可以发挥作用。

如果你看一下关于设计模式的经典着作,他们会说:

  

编程到接口,而不是实现

这意味着当使用另一个类时,您应该只查看接口而不考虑实现。例如:

  

我知道类Foo上的方法Bla取决于方法Boo,所以我应该   先打电话给Boo然后再打Bla

对接口进行编程可以减少代码耦合并提高testability。 在C#中,您具有语言中接口的明确概念。使用它可以帮助您设计良好的接口并根据需要交换实现。在测试和Dependency Injection之类的东西时,接口是必须的。

但是,你也有YAGNI原则(你不需要它)。如果您的软件并不复杂,那么为什么要引入接口并使您的代码(稍微)更难开发。

答案 3 :(得分:1)

不使用接口是一个选择问题。为类创建一个接口基本上只是创建了一个用于包含类的“指南”,以便您实现从继承类继承所必需的所有属性和方法。对于更简单的类,这个问题可能并不明显,但是当你转向具有多个不间断级别的非常复杂的类时,接口确实有助于控制你的理智。