Java中的接口命名
大多数OO语言都以大写字母I为前缀,Java为什么不这样做? 不遵循这个惯例的理由是什么?
为了演示我的意思,如果我想要一个用户界面和一个用户实现,我会在Java中有两个选择:
在大多数语言中:
Class = User,Interface = IUser
现在,你可能会争辩说,你总是可以为用户实现选择一个最具描述性的名称,问题就会消失,但是Java将POJO方法推向了事物,大多数IOC容器都广泛使用DynamicProxies。 这两件事合在一起意味着您将拥有大量的单个POJO实现的接口。
所以,我想我的问题归结为: “是否值得遵循更广泛的接口命名约定,特别是鉴于Java框架似乎在朝哪个方向发展?”
我不想在接口上使用前缀:
该前缀会伤害可读性。
在客户端使用接口是编程的标准最佳方式,因此接口名称应尽可能短而宜人。 实施班级应该更加丑陋,以阻止他们的使用。
当从抽象类更改为接口时,带有前缀I的编码约定意味着重命名该类的所有事件---不好!
真的有区别:
class User implements IUser
和
class UserImpl implements User
如果我们所谈论的是命名约定?
就我个人而言,我更喜欢不在与I
的接口之前,因为我想对接口进行编码,并且我认为在命名约定方面更重要。 如果您调用IUser
接口,则该类的每个消费者都需要知道其IUser
。 如果您调用UserImpl
类,那么只有班级和您的DI容器了解Impl
部分,而消费者只知道他们正在与User
一起工作。
再说一次,我被迫使用Impl
因为一个更好的名字本身并没有出现,因为这个实现是根据实现来命名的,因为这是重要的,例如
class DbBasedAccountDAO implements AccountDAO
class InMemoryAccountDAO implements AccountDAO
Java通常不会使用IUser约定可能有几个原因。
面向对象方法的一部分是,您不必知道客户端是使用接口还是实现类。 所以,即使List是一个接口,String也是一个实际的类,一个方法可能会被传递给它们两个 - 它在视觉上区分接口是没有意义的。
一般来说,我们实际上更喜欢在客户端代码中使用接口(比如喜欢List到ArrayList)。 所以将接口作为例外突出是没有意义的。
Java命名约定更喜欢较长的名称,其实际含义与匈牙利式前缀相同。 因此代码将尽可能可读:List代表一个列表,而User代表一个用户 - 而不是IUser。
下一篇: How do you find all subclasses of a given class in Java?