java-在Spring MVC应用程序中,服务层使用什么命名约定?

我一直在为Spring应用程序中的服务层找出一个好的命名约定。 对于服务层中的每个类,我首先编写它应实现的接口,然后再编写实际的类。 因此,例如,我有以下界面:

public interface UserAccountManager{
   public void registerUser(UserAccount newUserAccount);
   public void resetPassword(UserAccount userAccount);
...
}

然后是实现类...

这里让我感到困扰的是UserAccountManager是实现类的好名字,因此我被迫给它一个愚蠢的名字,例如SimpleUserAccountManager或UserAccountDbManager。到目前为止,您使用了哪些约定? 将实现类放在不同的包中并为它们提供与接口相同的名称是个好主意吗?另外,对于使用以Manager结尾的名称而不是以Service结尾的名称,您有何想法?

Vasil asked 2020-08-06T20:08:10Z
9个解决方案
56 votes

这是我们使用的:

  • XxxDAO(数据访问对象)-负责直接与EntityManager,JDBC DataSource,文件系统等进行交互。应仅包含持久性逻辑(例如SQL或JPA-QL),而不包含(或尽可能少地)业务逻辑。 只能从管理员访问。
  • XxxManager-在业务级别管理实体,通常执行CRUD操作,但添加所需的业务逻辑。
  • XxxService-业务逻辑所在的层。 应尽可能在简单的对象(例如字符串,整数等)中“讲话”。
  • XxxController-UI交互层。 应该只与服务通话。
  • XxxUtilities / XxxUtils-助手无状态方法,不应依赖于系统中的任何服务。 如果需要这种分隔,则可以将实用程序类转换为服务,或者将服务结果添加为参数。

对于实现,我们添加了Impl后缀(XxxServiceImpl),以使其与界面区分开,并且如果有多个实现,或者我们想添加其他信息,则将其添加为前缀(JdbcXxxDaoImpl,GoogleMapsGeocodingServiceImpl等)。 这样,类名会变得有点长,但是它们具有很强的描述性并且可以自我记录。

David Rabinowitz answered 2020-08-06T20:09:17Z
18 votes

Spring本身为接口提供通用名称,然后根据实现的细节为类命名。 这是一个想到的例子:

interface: Controller
abstract classes: AbstractController, AbstractCommandController, 
                  SimpleFormController, MultiActionController

我不认为像SimpleUserAccountManager或UserAccountDbManager这样的名称是愚蠢的,因为它们传达了有关管理器/服务实现的一些信息。

我发现愚蠢的是在实现类上添加“ Impl”后缀的通用约定:

my/package/UserAccountManager
my/package/impl/UserAccountManagerImpl

有些人喜欢这个。

kgiannakakis answered 2020-08-06T20:08:29Z
7 votes

对于您给出的示例,我将使用反映类如何执行操作的实现名称,例如HibernateUserAccountManager或JPAUserAccountManager或JDBCUserAccountManager等,或者仅是UserAccountManagerDAO。

skaffman answered 2020-08-06T20:09:37Z
4 votes

类名以Manager还是Service结尾本身本身并不重要。 一般来说,重要的是名称可以准确传达正在建模的内容。 这就是问题的症结所在:“服务”或“管理器”不是我们在软件对象中尝试建模的真实世界对象。 相反,在这些地方我们收集了很多方法,这些方法所执行的工作根本不符合我们需要/想要建模的任何对象的职责。

我个人更喜欢“服务”,但仅是因为“经理”似乎是人们可以实际建模的东西,即可能有我们的“-经理”对象代表的现实世界的经理。 但这一点完全是学术性的,我立即承认,这实际上没有任何区别。

真正重要的事情通常比这些要点要简单得多:建立一个模型,所有参与开发的人都应该很好地理解它。 如果我有什么经验需要,那就很少了。 因此,向那些询问“经理”或“服务”是正确的隐喻的人的提示是:掷硬币,确保每个人都了解公约,并花时间思考和讨论重要的事情!

The Dag answered 2020-08-06T20:10:07Z
3 votes

我觉得Service vs. Manager的命名后缀纯属偏爱。 “服务”对我们造成混乱的唯一时间是当我们还将Web服务置于服务层之上时。 在某些项目中,我们只是将Web服务类称为代理,因为它们所做的只是将Web服务调用转换或代理为对我们的服务层的调用。

我同意kgiannakakis的观点,在实现中添加“ Impl”后缀不是一个好方法。 我还遇到了编码最佳实践,提到不这样做。 在抽象之后给接口命名是公认的最佳实践。 正如kgiannakakis所建议的那样,在实现类后面用一些其目的或类型的指示器来命名实现类,这似乎是公认的方法。

当我们具有基于Web服务的DAO和基于ORM的DAO时,我们同时使用包和类名来区分实现类与它们的接口以及彼此之间的区别。 我认为将实现放在不同的程序包中取决于您在程序包中有多少个类,它们以不同的方式实现以及您希望拆分多少东西。

DavidValeri answered 2020-08-06T20:10:38Z
2 votes

您还可以命名接口IUserAccountManager(例如,在Eclipse RCP中使用此约定),然后将UserAccountManager用于默认实现。

Ilya Boyandin answered 2020-08-06T20:10:58Z
2 votes

对我来说,服务类与实现用例有关,因此我根据服务代表的用户类型来命名。 因此,如果我有一个具有不同角色的应用程序,例如客户,订单完成人员,数据输入人员和管理员,那么我可能会有一个CustomerService,OrderFulfillmentService,DataEntryService和AdminService。 我认为根据获取或扭曲的数据类型来命名服务是一种反模式。 因此,猜测UserAccount操作将是管理员的领域,我可能会称其为“ AdminService”。

Nathan Hughes answered 2020-08-06T20:11:19Z
1 votes

与经理和服务之间的差异有关: 我会说,尽可能长时间地将一层用于业务逻辑(服务层或管理器层)。

一旦该层变得复杂(假设您使用的是服务),就可以添加负责委派给一个或另一个服务的经理,但是将业务逻辑保留在服务中。

因此,我将使服务保持简单,使用管理器来管理服务,并将业务逻辑保留在服务内部。

我也同意避免为实现使用Impl后缀,并避免为接口使用I后缀。 例如,命名接口“ Controller”和命名实现“ SimpleController”或“ UserController”对我来说听起来更好。

Anghel Contiu answered 2020-08-06T20:11:52Z
1 votes

假设这些用于REST服务,我认为您的URI命名约定比基础实现服务的名称更重要,因为后者在很大程度上对客户端不可见。 当然,您希望在内部进行一致的命名,但这并不是至关重要的。

我们使用了一些REST准则:[http://soaprobe.blogspot.co.uk/2012/10/soa-rest-service-naming-guideline.html](我的博客)

Robert Morschel answered 2020-08-06T20:12:17Z
translate from https://stackoverflow.com:/questions/995473/what-naming-convention-do-you-use-for-the-service-layer-in-a-spring-mvc-applicat