使每个具体类继承接口是错误的吗?

Jac*_*ine 10 java oop spring naming-conventions guice

这是对Zed Shaw很久以前在博客中发表的一些评论的回应.

然后专家们会漫无目的地执行他们的Flaming Tower of Babel,没有任何评论,非常复杂的模拟测试,确保每个单一类都有一个接口,并以"Impl"结束每个班级,因为,这是最好的做法.

我以相同的方式使用Spring和Google Guice,我注意到这些框架确实使用了Impl后缀,但是很少.在我的代码中,我到处都使用接口,因为我被告知它使模拟更容易等.我对这个问题有天真的理解吗?(也许模拟框架可以使用抽象类或类,我不知道.我从未尝试过)对于我的具体实现,我选择了Spring的约定,在实现的名称前加上单词Default.

e.g. BottleOpener (interface) is implemented by DefaultBottleOpener (class)
Run Code Online (Sandbox Code Playgroud)

这个问题的最佳做法是什么?

UPDATE1我发现从方法返回一个接口很有用,因为我总是可以返回一个匿名类.

duf*_*ymo 17

这不仅仅是嘲笑.在Spring的情况下,它是关于动态代理和面向方面的编程.这就是Spring如何处理所有类型的事务,远程处理和方面.

我使用接口来存储库,服务等,但我没有将接口放在模型对象或其他任何实现不太可能改变的地方.

接口将API与它们的实现方式分开.如果您的实现没有改变,那么界面没有多大意义.

Zed Shaw是一位了不起的作家和开发人员,但他带着他的话说了几句.我认为他沉迷的一些夸张的夸张是娱乐价值.他有一个观点("不要做事只是因为有人自称是一个权威人士告诉你这是'最佳实践'"),但他所说的方式是部分剧院.

  • 一种更简单的思考方式可能是:逻辑接口,不需要数据接口 (10认同)

cle*_*tus 6

最佳做法是:

  • 选择一个约定并保持一致; 和
  • 不要过度使用一切实现接口.


Car*_*ter 6

该书接口为本的设计有考虑接口的一个有用的方式-它们属于客户端,而不是供应商.因此,不考虑给定类是否应该由接口表示,而是考虑给定类可能要与之交互的接口,然后查找或编写符合这些接口的类.与实现类中较长的公共特性列表相比,接口可能非常简化 - 当然,给定的类可以实现多个接口.寻找类和接口之间的一对一对应关系,甚至将接口视为完整类的表示,并不是一种考虑接口的有用方法.