San*_*box 11 abstraction design-patterns interface
最近,我一直在阅读有关接口是抽象的错误概念的帖子.其中一篇文章是http://blog.ploeh.dk/2010/12/02/InterfacesAreNotAbstractions.aspx
我有点困惑.如果我没有接口(接口/抽象类),那么我将如何注入我的依赖项并模拟它们?
另外,我听过人们谈论不使用只有一个实现者的接口.像这样的博客在这里- http://simpleprogrammer.com/2010/11/02/back-to-basics-what-is-an-interface/
现在所有这一切,它是否违反了原则 - 程序到接口而不是实现?
对接口而不是实现进行编程更多的是使用数据抽象和封装.
当我们在编程方面对接口说"接口"时.这种接口意味着类的外部方法和属性.它不必是语言级接口.(关键字界面.)
您应该努力确保您的代码不依赖于其他类的内部细节.
我会说我不同意链接文章中的许多要点:
接口是合同.合同有两部分 - 方法签名(纯语法)和文档.
接口是抽象的.我看不到LSP违规的例子.这个IRectangle例子根本不是一个好例子.可以说同样的事情Set extends Collection,不允许添加重复项.如果你被传递了,Collection你可能会感到惊讶它不允许重复.通过Collection接口,可以通过记录实现者可能添加限制来处理这些问题
漏洞抽象是不可避免的.但这完全取决于设计师.而btw"接口是漏洞抽象"意味着它们是抽象的.
这些家伙似乎错过了"曝光"单元测试.模拟实现是使用接口的一个很好的理由(尽管你也可以模拟具体的类).
我们当前项目的一个很好的例子 - 最初我们只有一个DAO实现 - 一个从数据库中获取东西.但后来我们将部分操作转换为专用搜索引擎.我们添加了DAO的另一个实现,然后我们去了.因此,拥有一个实现的接口最初得到了回报.
顺便说一句,最初SortedSet在JDK中只有一个实现 - TreeSet.现在它有两个.还有更多来自外部图书馆的人.
最后,接口(作为一种语言结构)是一种描述类功能的方法,具有不允许任何实现滑入的额外功能.也就是说 - 接口是一种难以滥用的提供抽象的方式.
总而言之,你不需要任何接口.但这取决于具体情况.例如,我不使用辅助类的接口.并且文章的有效点是"对界面的编程"不一定包括interface关键字.类的"公共接口"(理论上)是其公共方法的集合.