Java 服务s=新的ServiceImpl()-为什么要这样做?

Java 服务s=新的ServiceImpl()-为什么要这样做?,java,interface,Java,Interface,我刚读了这篇文章 我想知道你对此的看法。。不知道你会给它起什么名字,除了 impl?这是服务提供商的一种常见做法(可能是因为缺乏想象力)。它们为您提供服务接口及其实现。通过向您提供接口,它们仍然允许您创建自己的实现 关于“为什么名字是XyzImpl”,我将坚持缺乏想象力/努力。Impl后缀是一种命名。它表示开发人员没有努力以描述性的方式命名类。这也是IService接口命名的另一面。这两种做法都散发着懒惰或糟糕的设计选择的味道,或者两者兼而有之。这两种都是代码气味,应该提醒开发人员某些地方不对劲

我刚读了这篇文章

我想知道你对此的看法。。不知道你会给它起什么名字,除了 impl?

这是服务提供商的一种常见做法(可能是因为缺乏想象力)。它们为您提供服务接口及其实现。通过向您提供接口,它们仍然允许您创建自己的实现


关于“为什么名字是XyzImpl”,我将坚持缺乏想象力/努力。

Impl
后缀是一种命名。它表示开发人员没有努力以描述性的方式命名
。这也是
IService
接口命名的另一面。这两种做法都散发着懒惰或糟糕的设计选择的味道,或者两者兼而有之。这两种都是代码气味,应该提醒开发人员某些地方不对劲

代码中说的
接口服务
类MyService实现服务
应该就足够了,其他任何东西都是错误的。今天的高级JavaIDE更是如此

如果您有一个
服务
接口,请以描述性的方式命名实现<代码>服务是通用的,这对于接口是好的
HttpService
AuthenticationService
是特定的,对于类来说是好的。在这两种情况下,大部分情况下都是自我记录

如果不能为接口和类提供唯一的描述性名称,那么就错了


Mocking
参数中,假设实际类位于
com.company.app.service
中。Mock实现应该在自己的
com.company.app.service.Mock
包中,可能与测试类位于不同的目录结构中,如Maven,这将允许它们与非Mock类具有相同的名称,并且仍然记录它们只是用于测试的Mock,并且不会污染生产代码的名称空间,并且很容易在部署中不包含该代码。

更好的做法是让工厂根据某些配置实例化并返回实现(使用正常默认值)。比如说

Service s = ServiceFactory.getInstance().newService();

这允许您在运行时使用不同的实现。

在我看来,接口描述了功能,实现描述了如何实现该功能

一个典型的例子是集合库:

列表
即使对于非技术人员也可以理解
ArrayList
是一个用后备数组实现的
列表

LinkedList
是一个用链接节点实现的
列表

这个命名方案简单易懂

另一个例子是DAOs:

PersonDAO
是用于访问Person对象的DAO接口
JdbcPersonDAO
是使用JDBC实现的
PersonDAO
JpaPersonDAO
是使用JPA实现的
PersonDAO
等等

现在有了服务,情况略有不同。服务通常不知道下面的技术,因此通常没有任何东西能够唯一地描述一个实现


Service>serviceinpl
是解决此问题的一种方法,另一种方法是
IService>Service
,这同样可怕。一个改进是Maven代码库中的约定:
Service>DefaultService
,其中
DefaultService
显然是
Service
的默认实现。合理的命名方案如何?

我同意,如果您正在编写开放源代码API或未知开发人员将使用的API,这是一个很好的做法。。但在项目中,情况并非如此,特别是当其模块有限且未暴露在模块外时。。但是人们仍然认为这是最佳实践,并且提供了一个接口,即使是对于未公开的服务,您仍然必须命名具体的实现。问题在于Java社区中非常流行的重言式命名约定,而不是使用服务定位器DI@bart-基尔斯照样复制了博客标题。。感谢您的更正:)通常,如果系统中有用户(比如hibernate实体),则接口服务名称为UserService(提供合同保存、更新等)而实现是UserServiceImpl。@Premraj:我认为应该是
UserHibernateService
。或者更好的
HibernateService
,以符合
UserService
接口的命名约定<代码>Impl
总是一种代码气味和糟糕的形式。这取决于。我知道:
UserHibernateService扩展了HibernateService实现了UserService
@Sean Patrick Floyd-Hmm。这听起来不错。我认为
DAO
后缀也是错误的,应该有一个
DAO
包,所有的类都可以进入,这样你就不必反复重复
DAO
后缀重言。也就是说,除非
DAO
Person
实现或扩展的
接口