c#何时编程到接口?

c#何时编程到接口?,c#,interface,C#,Interface,好的,编程到接口的好处是,它允许您交换特定的类,只要新类实现了该接口中的所有内容 e、 我将数据源对象编程为一个接口,以便在xml读取器和sql数据库读取器之间进行更改 这是否意味着理想情况下每个类都应该编程为一个接口? 什么时候使用接口不是一个好主意?当YAGNI原则适用时 接口很好,但开发一个接口所需的额外时间何时会有回报取决于您。我已经使用了很多次接口,但是在很多情况下它们是完全不必要的。不是每个类都需要与其他类灵活地交换。您的系统设计应该确定模块可以互换的点,并相应地使用接口。如果每个类

好的,编程到接口的好处是,它允许您交换特定的类,只要新类实现了该接口中的所有内容

e、 我将数据源对象编程为一个接口,以便在xml读取器和sql数据库读取器之间进行更改

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

当YAGNI原则适用时


接口很好,但开发一个接口所需的额外时间何时会有回报取决于您。我已经使用了很多次接口,但是在很多情况下它们是完全不必要的。

不是每个类都需要与其他类灵活地交换。您的系统设计应该确定模块可以互换的点,并相应地使用接口。如果每个类都不可能成为某个函数组的一部分,那么将每个类与另一个接口文件配对将是愚蠢的


添加到项目中的每个接口都会增加代码库的复杂性。当你处理接口时,发现程序如何工作就更难了,因为当用户代码显式地处理接口时,并不总是清楚哪个IComponent在执行任务。

真正的问题是:你的类做什么?如果您正在编写一个类,该类实际上实现了.NET framework中的某个接口,请将其声明为这样!几乎所有简单的库类都符合这种描述

相反,如果您正在编写一个只在应用程序中使用的深奥类,并且不可能采用任何其他形式,那么谈论它实现了什么接口就没有意义了


从“我应该实现接口吗?”这个前提出发是有缺陷的。你既不应该也不应该。您只需编写所需的类,并声明它们在执行过程中的作用,包括它们实现的接口。

当您希望在同一上下文中使用不同的行为时,请使用接口。也就是说,如果您的系统需要一个定义良好的customer类,那么您可能不需要使用ICCustomer接口。但是,如果您希望一个类符合s.a.“可以保存对象”的特定行为,该行为适用于不同的对象类型,那么您应该让该类实现一个可编辑的接口

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


这也导致了“依赖注入”,这是一种进一步解耦类的技术,最好通过使用接口来实现。我更喜欢根据接口编写尽可能多的代码。我喜欢它,因为我可以使用StructureMap这样的工具说“嘿……给我一个IWidget实例”,它为我完成了这项工作。但通过使用这样的工具,我可以通过编程或配置指定检索哪个实例。这意味着,当我进行测试时,我可以加载一个符合接口的模拟对象,在我的开发环境中,我可以加载一个特殊的本地缓存,在生产中,我可以加载一个缓存场层,等等。针对接口编程比不针对接口编程提供了更多的功能。“有而无”比“有而无”更适用于这里。如果你喜欢实体编程,那么实现这些原则的最简单的方法就是从一个接口编程开始。

IMHO,你应该尝试大量使用接口。不使用接口比使用接口更容易出错

关于这一点,我的主要论点是,接口可以帮助您生成更易于测试的代码。如果类构造函数或方法有一个具体的类作为参数,那么就更难了(特别是在c#中,没有免费的模拟框架允许模拟具体类的非虚拟方法)使您的测试成为真正的单元测试

我相信,如果你有一个类似DTO的对象,那么使用一个接口就太过分了,一旦模仿它,可能比创建一个接口还要困难


如果你没有测试,使用依赖注入,控制反转;我希望永远不要做这些事情(请避免出现在那里,呵呵),然后我建议在您真正需要不同实现时使用接口,或者您希望限制一个类对另一个类的可见性时使用接口。

作为一般经验法则,我认为你最好是过度使用界面,而不是少用一点。界面使用方面的错误


否则,YAGNI将适用。

如果您使用的是Visual Studio,则使用类并提取接口(通过上下文菜单)大约需要两秒钟。然后,您可以编写该接口的代码,几乎不需要花费任何时间


如果你只是在做一个简单的项目,那么这可能会有点过头。但在中等规模以上的项目中,我尝试在整个项目中为接口编写代码,因为这将使未来的开发更容易。

建议在“具体”类上默认将方法设置为虚拟,这是一种最佳做法,这些类是完全可模拟的。@Steven none允许模拟非虚拟类methods@womp我从未听说过这个建议。你能给我一些推荐信吗?这是一个。mocking社区也倾向于支持这样的观点:.+1,使用重构工具从类中提取接口非常容易,因此没有理由提前这样做,除非您确实知道您需要一个接口。