繁体   English   中英

我是否需要只有一个实现的接口?

[英]Do I need an interface that has only one implementation?

我有一个接口,只有一个实现。 以下对表示一个简单的java对象。 我想删除该接口并直接使用对象。 但是我想知道什么时候需要它以及它为什么以这种方式设计。 这绝对不是为了减轻单元测试覆盖率。 那么,为什么在我的项目中只有一个实现的接口呢? 谢谢。

当您可以扩展/更改项目时,界面很有用。 例如,如果通过将数据存储在文本文件中来启动项目,然后决定从数据库更改为执行此操作。 如果这两个都是相同接口的实现,那么将第一个接口换成第二个接口非常简单。 只是在使用它的类中交换具体实现的情况。 例如,简单地改变

IStorage storage = new FileStorage();

IStorage storage = new DBStorage();

虽然为单个实现提供接口似乎毫无意义,但它可能会为您节省大量的重构工作。

如果为实现定义接口并在程序中使用接口,则可以随意编写新实现并将其替换为旧实现,而无需更改使用它的类的代码。

最好的做法是使用接口而不是以这种方式实现更改要求的危害较小。

这取决于。 但这不是一个坏主意。

在C和许多版本的Pascal中,将接口与实现分离是熟悉的做法。 它有助于编译器避免在它们所依赖的实现发生更改时不必要地重新编译模块。

在Java中,编译器通常不是问题。 Java提供public,protected,private和package-private(隐式)访问类,这些类限制了其他类可以依赖于特定类的详细信息的程度。 Javadoc(默认情况下)提供了省略不需要和不需要的详细信息的文档。 我们也有广泛推广的YAGNI原则:如果“你不需要它”,不要设计它。

尽管如此,在Java中使用显式接口而不是直接使用实现提供了一个额外的机会,可以非常清楚特定类的用户应该依赖什么结构和行为。 实现多个接口的能力意味着特定类的用户甚至可以指定对实现的一个或多个特定方面的依赖性,例如其Serializable性质。

有时候你认为使用一个接口会很有用,结果你只有一个实现。 这并不总是坏事,但有时这只是浪费精力。

YAGNI的原则

当你真正需要它们时,总是要实现它们,永远不要只是预见到你需要它们。

如果您正在为代码进行单元测试(我希望您这样做),那么您很可能需要使用某些存根实现来模拟您的类的使用。 所以你至少需要接口才能进行单元测试。

PS我知道,像Mockito这样的现代模拟框架可以根据类进行模拟,所以从技术上讲,你可以在没有接口的情况下实现这一点。 但是(对我来说)感觉就像黑客一样,因为这正是应该使用界面的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM