大多数面向对象的语言都将其接口名称加上大写字母I,为什么Java不这样做呢?不遵守这一惯例的理由是什么?
为了证明我的意思,如果我想要一个用户界面和一个用户实现,我在Java中有两个选择:
- Class = User,Interface = UserInterface
- Class = UserImpl,Interface = User
在大多数语言中:
Class = User,Interface = IUser
现在,您可能会争辩说,您总是可以为用户实现选择一个最具描述性的名称,但问题就会消失,但Java正在推动POJO方法,而大多数IOC容器都广泛使用DynamicProxies.这两个因素共同意味着您将拥有许多具有单个POJO实现的接口.
所以,我想我的问题归结为:"是否值得遵循更广泛的接口命名约定,特别是考虑到Java框架似乎在哪里?"
这当然是一个主观的事情,但我没有看到任何正面的界面名称前缀为'I'.对我来说,Thing几乎总是比可读性更强IThing.
我的问题是,为什么这个惯例存在呢?当然,它可以更容易地告诉其他类型的接口.但是,这种说法不会延伸到保留现在受到广泛谴责的匈牙利符号吗?
对于那个尴尬的"我",你的论点是什么?或者,更重要的是,微软可能是什么?
我想了解一下 Bob 叔叔在Clean Code书中关于接口命名的内容:
这些有时是编码的特例。例如,假设您正在构建一个用于创建形状的抽象工厂。这个工厂将是一个接口,并由一个具体的类实现。你应该给它们起什么名字?IShapeFactory 和 ShapeFactory?我更喜欢让界面保持朴素。前面的 I,在今天的遗留文件中很常见,充其量是一种干扰,最坏的情况是信息过多。我不希望我的用户知道我正在给他们一个界面。我只是想让他们知道这是一个 ShapeFactory。因此,如果我必须对接口或实现进行编码,我会选择实现。称其为 ShapeFactoryImp,甚至是可怕的 CShapeFactory,都比对接口进行编码更可取。
他不以“I”开头的界面是什么想法,为什么他不希望用户知道他正在处理一个界面?