【发布时间】:2023-04-11 12:21:01
【问题描述】:
我正在开发一个 Java Web 应用程序,该应用程序使用 Spring 进行依赖注入,并使用 JMock 在我们的单元测试中模拟这些依赖项。
目前,我们的团队在如何命名我们使用的某些接口方面存在一些不同的意见。我们对域中具有多个实现的接口进行命名没有问题,这很简单。但是,当涉及到我们只有一个实现并且打算在未来只实现一个的接口时,我们遇到了障碍。
我们有这样的接口纯粹是为了模拟,例如,我们有我们在单元测试中模拟出来的服务和存储库,这些服务将被命名为“DocumentMappingService”或存储库“EmployeeRepository”。目前,有些人只是在关联的接口名称前加上“I”,即“IDocumentMappingService”和“IEmployeeRepository”。其他人像我上面那样命名接口,然后在实现类的接口名称后附加一个“Impl”。
第三个“派系”觉得这两个选项都很差。看看著名的“Growing object-oriented software,guided by testing”之类的文献会让人相信前面提到的两个选项都很糟糕,接口名称应该清楚地定义契约和实现类名称应明确说明该合同是如何实施的。不过,在我上面提到的情况下,我们发现这很难做到。
我希望那里有人以前遇到过类似的问题,并对哪个选项最好以及为什么有一些建议。另外,如果您认为“I”和“Impl”选项都很差,那么请提出一个具体的替代约定。
【问题讨论】:
-
这对程序员来说可能更好......但我对此表示怀疑。根本不可能有客观正确的答案。 SO 不是一个讨论论坛。
-
对“Impl”的普遍批评是,在所有课程上都使用相同的东西没有意义。实现类的名称应该反映实现。例如,
ArrayList中的“数组”以及LinkedList中的“链接”。我不认为“Impl”/“Default”会特别引起问题(直到第二次实现),但这不是最好的。 -
如果你的接口纯粹是为了模拟,也许使用更好的模拟框架?我猜你正在使用 JMock - 抛弃所有这些接口并尝试使用 Mockito 或 EasyMock 之类的替代方法?
-
尽管这个问题被关闭了,但我得到了我想要的答案,并且支持和收藏的数量表明至少有一些其他成员也认为这很有用。
标签: java interface naming-conventions