如何命名存储库和服务接口?

时间:2012-02-22 18:02:32

标签: java java-ee domain-driven-design naming-conventions

如何命名存储库和服务接口及其实现类?

例如,我有一个名为Question的模型。您将命名存储库(接口和实现)和服务(接口/实现)。

阅读这些帖子后: Java Interfaces/Implementation naming conventionInterface naming in Java我重新考虑了我已经做过的事情:)

2 个答案:

答案 0 :(得分:8)

我认为在DDD中命名大致有两种方法:

1)基于刻板印象。这是您在其名称中包含类构造型的位置。例如:

QuestionsRepository, TaxCalculatingService etc

2)基于域。在这种方法中,您只使用域语言,并省略类名中的任何构造型。例如:

Questions (or AllQuestions), TaxCalculator etc.

实施类的名称将为SqlQuestionsInMemoryQuestions

我试过了两个但我现在更喜欢第二个选项,因为它似乎更符合DDD心态。它似乎更具可读性,并具有更好的信噪比。以下是PhilCalçado对great article存储库的引用:

  

将Repository作为对象列表的概念并不难理解,但这些类通常最终会使用与列表无关的方法。

     

在指导许多团队采用无处不在的语言和相关模式之后,我发现让人们记住存储库不是类似DAO的类的最佳方式始于你如何命名它们。

     

多年前Rodrigo Yoshima在命名存储库时告诉我他的约定。而不是下面显示的更常见的命名样式:

class OrderRepository {
   List<Order> getOrdersFor(Account a){...}
}
  

他宣传:

class AllOrders {
   List<Order> belongingTo(Account a){...}
}
  

这看起来像是一个很小的变化,但它有很多帮助...

整篇文章非常值得阅读和书签。

答案 1 :(得分:2)

我个人使用FooServiceFooServiceImplFooRepositoryFooRepositoryImpl

您可能会认为Impl后缀是噪音,但

  • 通常只有一个实现,因此没有FirstFooServiceSecondFooService
  • 除了单元测试之外,代码中没有使用具体的FooXxxImpl类型:注入依赖项,它们的类型是接口