究竟什么是“基于接口的编程”?

时间:2009-12-04 17:25:45

标签: c# .net design-patterns interface

我经常听到/读到基于接口的编程,但我并不清楚这究竟意味着什么。基于接口的编程是一个真正独立的主题,实际上有关于它的书籍吗?如果是这样,有人可以推荐任何好的吗?

我遇到了基于界面的编程,因为我正在阅读有关如何设计好API以及想要了解更多信息的更多信息。现在我不清楚如何正确地设计围绕接口的API。

非常感谢任何信息。

8 个答案:

答案 0 :(得分:29)

这基本上是用接口而不是具体类(或者更糟的是静态方法)表达依赖的问题。因此,如果您的某个类需要执行身份验证,则应该提供IAuthenticator(或其他类)。

这意味着:

  • 您可以在实现真正的依赖项之前编写代码
  • 你可以很容易地通过模拟进行测试(无需模拟类,这会变得难看)
  • 很清楚你所依赖的API而不是实现(即你有更松散的耦合)

答案 1 :(得分:9)

"Practical API Design" by Jaroslav Tulach的第6章标题为“针对接口而非实现的代码”。它解释说,通过对接口而不是特定实现进行编码,您可以解耦系统中的模块(或组件),从而提高系统质量。

OOSC2中的Bertrand Meyer清楚地解释了为什么“关闭”系统并使其更加模块化会提高其质量。

答案 2 :(得分:8)

答案 3 :(得分:3)

如果您使用google接口,您会发现大量有关接口有用的信息。

概念是定义清晰的接口,各种组件/部件/类/模块将使用它们进行通信和交互。一旦定义了这些接口的输入/输出,您就可以让各个团队开发满足接口要求所需的一切,包括输入/​​输出测试......等等。

如果你遵循这种模式,各个团队可以开始发展他们的部分,而无需等待其他部分准备好。除此之外,您还可以使用单元测试(使用假对象来模拟您未开发的其他部分,并测试您的部件)。

这种方法非常适合任何新的编程项目,每个人都会认为这是理所当然的。

答案 4 :(得分:3)

您所称的“基于接口的编程”通常被称为对接口的编程。以下是一个例子。好处是隐藏了界面的实际实现,并允许您的代码在未来更灵活,更容易维护。

YourInterface foo = CreateYourInterface();
foo.DoWork();
foo.DoMoreWork();

CreateYourInterface()将返回YourInterface的具体实现。这允许您通过更改一行来更改应用程序的功能:

YourInterface foo = CreateYourInterface();

答案 5 :(得分:2)

我建议不要在C#开发中大量使用。

Interface-based programming基本上是编程接口。您开发了将要使用Contracts的接口,并且这些接口的实际实现隐藏在这些合同背后。

在.NET之前很常见,因为在Windows中获取可重用组件的最佳方法是通过COM,它通过各种接口工作。但是,鉴于.NET能够通过单个运行时(CLR)支持多种语言,并且与本机代码相比,它具有对版本控制的出色支持,当您使用C#进行编程时,基于接口的编程的实用性会大大降低(除非您尝试创建COM组件,在这种情况下,您仍将间接从C#类创建COM接口。)

答案 6 :(得分:1)

基于接口的编程可以被认为是解耦功能的实现以及如何访问功能。

您定义了一个界面
interface ICallSomeone { public bool DialNumber(string number); }

并且您编写了实施方案

public class callsomeone: ICallSomeone {
public bool DialNumber(string number) {
//dial number, return results }}

您可以使用界面而无需关心实施。如果你改变实现,没关系,因为它只是使用接口。

答案 7 :(得分:0)

从非常抽象的角度来看,基于界面的编程类似于管道工(管道接头和管道)使用的组件。

只要管道和接头是根据规定的界面(螺纹数量和间距等)制造的,各种制造商就可以为其他供应商可能制造的管道提供接头(但坚持上述联合/管道接口)。

因此,组件的互操作性和管道工可以自由选择各种供应商,价格范围等,以创建功能性管道系统。

用软件组件替换管道和接头,并且相似之处非常简单。