大多数面向对象语言的接口名称都以大写的I开头,为什么Java不这样做呢?不遵循这一惯例的理由是什么?
为了证明我的意思,如果我想有一个用户界面和一个用户实现,我在Java中有两个选择:
类=用户,接口= UserInterface
类= UserImpl,接口=用户
在大多数语言中:
类=用户,接口= IUser
现在,您可能会争辩说,您总是可以为用户实现选择一个最具描述性的名称,这样问题就解决了,但Java正在推动POJO方法,大多数IOC容器广泛使用dynamicproxy。这两件事加在一起意味着您将使用单个POJO实现拥有许多接口。
所以,我想我的问题可以归结为:“是否值得遵循更广泛的接口命名约定,尤其是考虑到Java框架的发展方向?”
这两者真的有区别吗:
class User implements IUser
and
class UserImpl implements User
如果我们讨论的是命名惯例?
就我个人而言,我不喜欢在接口之前使用I,因为我想对接口进行编码,我认为这在命名约定方面更重要。如果调用接口IUser,那么该类的每个消费者都需要知道它是IUser。如果调用类UserImpl,那么只有类和DI容器知道Impl部分,而使用者只知道他们正在使用User。
然后,我被迫使用Impl的时候,因为一个更好的名字本身没有出现,因为实现是根据实现命名的,因为这是它的重要之处,例如。
class DbBasedAccountDAO implements AccountDAO
class InMemoryAccountDAO implements AccountDAO
正如另一位发帖者所说,通常更可取的做法是让接口定义功能,而不是类型。我倾向于不“实现”像“User”这样的东西,这就是为什么在这里描述的方式中“IUser”通常不是真正必要的。我经常把类看作名词,把接口看作形容词:
class Number implements Comparable{...}
class MyThread implements Runnable{...}
class SessionData implements Serializable{....}
有时形容词没有意义,但我仍然通常使用接口来建模行为、动作、功能、属性等等……没有类型。
另外,如果你只创建一个User,并将其命名为User,那么还有IUser接口的意义何在?如果您将有几个不同类型的用户需要实现一个公共接口,那么在选择实现名称时,在接口上附加一个“I”会为您节省什么呢?
我认为一个更现实的例子是,某些类型的用户需要能够登录到特定的API。我们可以定义一个Login接口,然后有一个带有SuperUser、DefaultUser、AdminUser、AdministrativeContact等子类的“User”父类,其中一些会或不会在必要时实现Login(可登录的?)接口。