接口只有一个实现

Dav*_*ave 6 java oop interface

使用jmock时,如果设置类imposteriser,则可以模拟具体类.我注意到类imposterizer在遗留包中,所以我真的不想使用它(特别是因为在我的IDE中使用重构工具提取界面非常容易).我不喜欢具体类的实例变量.

然而,在提取界面时,我注意到我的代码库中出现了一种模式.很多时候接口只有一个实现具体类.我更喜欢尽可能使用接口,但拥有所有这些额外文件似乎非常冗长.此外,每次我想要向类中添加新方法时,更新界面并更新实现者都有点繁琐.

这只是你为正确的抽象付出的代价,还是有一种我没想过的更好的方法?即使接口中唯一的东西是getter/setter,所有类都应该实现接口吗?

Jon*_*eet 10

如果界面只是getter和setter,那听起来更像是数据而不是行为 - 并且听起来不像我会嘲笑的东西.我很乐意在其他类的测试中直接使用简单的生产代码.我只为提供服务的类注入依赖项.

我觉得你的痛苦,但我个人还是写的界面,即使是目前唯一一个生产实施.我常常会在嘲笑一段时间后发现我写了一个存根或伪造的实现.假货最终被相当容易使用(导致更清晰的测试),除非你在测试真正感兴趣的交互调用者和服务之间.

这也意味着,当有人想看看一个特定的依赖提供了方法,他们可以看到刚才的界面,没有参与实施.


Chr*_*est 5

我要点的一些一般观点:

  • 测试中的模拟替代实现.因此,即使您的产品代码中只有一个实现,代码库中也会有多个实现.
  • 首选构造函数注入getter和setter.这也将使不可变对象更自然.
  • 接口描述了一段行为的契约,并且这样做的方式是接口的用户不需要知道实现的细节.
  • 不要为那些与这些事情无关的事物建立接口:抽象出实现细节; 多种替代实施; mockability; 行为.
  • 更喜欢具有许多小组成部件的设计,而不是具有很少大型互连部件的设计.
  • 如果某些东西很难测试或模拟,那么尝试将它拆分成具有更简单API的较小部分,然后组合它们.
  • 给出精确的名称,并注意不仅在代码中,而且在结构和名称中的重复.
  • 避免实现继承 - 更喜欢组合.接口继承更难以滥用,并且在需要时经常会自然丢失.

这些要点有望帮助您制作更简单,更易测试和可维护的设计.至少经过一些尝试跟随他们的经验.

  • 大,大+1,尤其是第一点(嘲笑_are_替代实现).说得好! (2认同)