编程到接口的好处在于,只要新类实现了该接口的所有内容,就可以将特定类互换使用。
例如,我将我的数据源对象编程到一个接口,这样我就可以在 XML 读取器和 SQL 数据库读取器之间进行更改。
这是否意味着理想情况下每个类都应该编程到接口? 什么时候不使用接口不是一个好主意?
当YAGNI原则适用时。
接口很好,但决定开发接口所需的额外时间是否值得取决于您。我已经多次使用过接口,但有很多情况下它们是完全不必要的。
在我看来,你应该尽量使用接口。不使用接口比使用接口更容易出错。
我的主要观点是,接口可以帮助您编写更易于测试的代码。如果一个类构造函数或方法有一个具体类作为参数,在进行真正的单元测试时,这会更困难(特别是在c#中,没有免费的模拟框架允许模拟具体类的非虚方法)。
我认为,如果您有一个类似DTO的对象,那么使用接口可能是过度设计,因为模拟它甚至可能比创建一个更加困难。
如果您不进行测试,并且不使用依赖注入、控制反转;并且希望永远都不会使用这些技术(请避免这种情况哈哈),那么我建议只在真正需要不同实现或想要限制一个类对另一个类的可见性时使用接口。
在同一上下文中需要使用不同行为时,请使用接口。例如,如果您的系统需要一个明确定义的客户类,则可能不需要使用ICustomer接口。但是,如果您希望一个类遵守某种行为(例如“对象可以保存”),并且适用于不同类型的对象,则应该让该类实现ISavable接口。
另一个使用接口的好处是,如果您期望有一种对象的不同实现方式。例如,如果您计划通过几个不同的第三方服务路由SMS的SMS网关,则您的类应该实现一个常见的接口,如ISmsGatewayAdapter,以便您的核心系统独立于您使用的特定实现。
这也导致了“依赖注入”,这是一种进一步解耦您的类的技术,最好通过使用接口来实现。
我更喜欢尽可能多地针对接口进行编码。我喜欢这样做,因为我可以使用像StructureMap这样的工具来说“嘿...给我一个IWidget的实例”,它会为我完成工作。但是通过使用这样的工具,我可以通过编程或配置指定要检索的实例。这意味着当我在测试时,我可以加载符合接口的模拟对象,在我的开发环境中,我可以加载特殊的本地缓存,当我处于生产状态时,我可以加载缓存农场层等。针对接口进行编程比不针对接口进行编程提供了更多的功能。在这里,拥有而不需要比需要而没有更好。如果您热衷于SOLID编程,那么实现许多原则的最简单方法就是从编程接口开始。
一般来说,我认为过度使用接口比稍微少用要好。在接口的使用方面要保守。
否则,YAGNI(你不需要它)原则适用。
如果您正在使用Visual Studio,只需大约两秒钟即可通过上下文菜单提取接口并将其应用于您的类。然后,您可以根据该接口编写代码,几乎不需要花费任何时间。
如果您只是在进行简单的项目,则可能过于复杂。但对于中型及以上规模的项目,我会尝试在整个项目中编写接口,因为这将使未来的开发更加容易。