我正在开发一个简单的Java应用程序,通过RESTful API对数据库进行CRUD操作。它分为三个层次:控制器层,服务层和DAO层。
通常,我为每个领域对象创建一个服务接口。比如说,User
:
public interface UserService {
List<User> getAll();
User create(User entity);
void update(User entity) throws Exception;
void delete(Long id) throws Exception;
}
然后我在服务类中实现该接口:
public class UserServiceImpl implements UserService { ... }
我认为这种方法有几个缺点:
- 它强制我将具体类命名为除
UserService
之外的其他名称,尽管我只有一个具体实现 - 所有不同的服务都没有实现相同的接口
- 会有大量行为相同的接口出现
另一种方法
我会创建一个所有服务都会实现的接口:
public interface CrudService<T> {
List<T> getAll();
T create(T entity);
void update(T entity) throws Exception;
void delete(Long id) throws Exception;
}
因此,我选择了名称CrudService
来传达该接口提供的功能。然后,我有一个实现该接口的具体服务类,其类型参数为User
:
public class UserService implements CrudService<User> { ... }
这样我的服务名称就像UserService
,我认为更加清晰易读。
问题
- 命名服务类的惯例是什么?你通常会怎么做?
- 如果一个具体的类听起来像一个接口,我应该将其命名为
UserService
吗? Impl
后缀呢?它是否传达了关于实现的任何信息?