C#何时应该编程到接口?

5

编程到接口的好处在于,只要新类实现了该接口的所有内容,就可以将特定类互换使用。

例如,我将我的数据源对象编程到一个接口,这样我就可以在 XML 读取器和 SQL 数据库读取器之间进行更改。

这是否意味着理想情况下每个类都应该编程到接口? 什么时候不使用接口不是一个好主意?

8个回答

11

当YAGNI原则适用时。

接口很好,但决定开发接口所需的额外时间是否值得取决于您。我已经多次使用过接口,但有很多情况下它们是完全不必要的。


2
+1,使用重构工具从类中提取接口非常容易,因此除非您确定需要一个接口,否则没有必要提前这样做。 - Steven Sudit

4
并不是每个类都需要与其他类灵活交换。您的系统设计应该确定模块可能互换的点,并相应地使用接口。如果某个类永远不会成为某个功能组的一部分,那么为每个类配对一个额外的接口文件就显得很愚蠢了。
您在项目中添加的每个接口都会增加代码库的复杂性。当您处理接口时,程序如何工作的可发现性更难,因为当消费者代码明确处理接口时,不总是清楚哪个IComponent正在填补职位。

4

在我看来,你应该尽量使用接口。不使用接口比使用接口更容易出错。

我的主要观点是,接口可以帮助您编写更易于测试的代码。如果一个类构造函数或方法有一个具体类作为参数,在进行真正的单元测试时,这会更困难(特别是在c#中,没有免费的模拟框架允许模拟具体类的非虚方法)。

我认为,如果您有一个类似DTO的对象,那么使用接口可能是过度设计,因为模拟它甚至可能比创建一个更加困难。

如果您不进行测试,并且不使用依赖注入、控制反转;并且希望永远都不会使用这些技术(请避免这种情况哈哈),那么我建议只在真正需要不同实现或想要限制一个类对另一个类的可见性时使用接口。


建议在“具体”类上默认将方法设置为虚拟的,这是最佳实践,可以完全模拟。 - womp
@Steven 没有一种允许模拟非虚拟方法的方法。 - Samuel Carrijo
@womp,我从未听说过这个建议。你能给我一些参考资料吗? - Samuel Carrijo
其中一个是http://www.scribd.com/doc/10731655/IDesign-C-Coding-Standard-232。模拟社区也倾向于支持这种观点:https://dev59.com/0nVD5IYBdhLWcg3wAGeD。 - womp

1

在同一上下文中需要使用不同行为时,请使用接口。例如,如果您的系统需要一个明确定义的客户类,则可能不需要使用ICustomer接口。但是,如果您希望一个类遵守某种行为(例如“对象可以保存”),并且适用于不同类型的对象,则应该让该类实现ISavable接口。

另一个使用接口的好处是,如果您期望有一种对象的不同实现方式。例如,如果您计划通过几个不同的第三方服务路由SMS的SMS网关,则您的类应该实现一个常见的接口,如ISmsGatewayAdapter,以便您的核心系统独立于您使用的特定实现。

这也导致了“依赖注入”,这是一种进一步解耦您的类的技术,最好通过使用接口来实现。


0
真正的问题是:你的类做什么?如果你正在编写一个实际上在.NET框架中实现接口的类,那就声明它为这样的类!几乎所有简单的库类都符合这个描述。
相反,如果你正在编写一个只在你的应用程序中使用且不可能采取其他形式的奇特类,那么谈论它实现了哪些接口是没有意义的。
从“我是否应该实现一个接口?”的前提出发是有缺陷的。你既不应该也不应该。你只需要编写你需要的类,并在编写过程中声明它们的功能,包括它们实现了哪些接口。

0

我更喜欢尽可能多地针对接口进行编码。我喜欢这样做,因为我可以使用像StructureMap这样的工具来说“嘿...给我一个IWidget的实例”,它会为我完成工作。但是通过使用这样的工具,我可以通过编程或配置指定要检索的实例。这意味着当我在测试时,我可以加载符合接口的模拟对象,在我的开发环境中,我可以加载特殊的本地缓存,当我处于生产状态时,我可以加载缓存农场层等。针对接口进行编程比不针对接口进行编程提供了更多的功能。在这里,拥有而不需要比需要而没有更好。如果您热衷于SOLID编程,那么实现许多原则的最简单方法就是从编程接口开始。


0

一般来说,我认为过度使用接口比稍微少用要好。在接口的使用方面要保守。

否则,YAGNI(你不需要它)原则适用。


0

如果您正在使用Visual Studio,只需大约两秒钟即可通过上下文菜单提取接口并将其应用于您的类。然后,您可以根据该接口编写代码,几乎不需要花费任何时间。

如果您只是在进行简单的项目,则可能过于复杂。但对于中型及以上规模的项目,我会尝试在整个项目中编写接口,因为这将使未来的开发更加容易。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接