您如何命名您创建的不同类/接口(interface)?
有时我没有要添加到实现名称的实现信息 - 例如接口(interface) FileHandler
和类 SqlFileHandler
。
发生这种情况时,我通常以“正常”名称命名接口(interface),例如 Truck
,并将实际类命名为 TruckClass
。
在这方面你如何命名接口(interface)和类?
最佳答案
为您的 Interface
命名这是什么。 Truck
.不是 ITruck
因为它不是 ITruck
它是 Truck
.
安Interface
在 Java 中是 Type .然后你有 DumpTruck
, TransferTruck
, WreckerTruck
, CementTruck
等 implements Truck
.
当您使用 Interface
时代替子类,您只需将其转换为 Truck
.如 List<Truck>
.把 I
前面只是Hungarian style符号 tautology这只会为您的代码添加更多内容。
所有现代 Java IDE 的标记接口(interface)和实现以及没有这个愚蠢的符号。不要叫它TruckClass
即 tautology和 IInterface
一样糟糕重言式。
如果它是一个实现,它就是一个类。这条规则唯一真正的异常(exception),并且总是有异常(exception),可能是 AbstractTruck
.因为只有子类会看到这个,所以你永远不应该转换为 Abstract
class 它确实添加了一些关于该类是抽象的信息以及应该如何使用它。你仍然可以想出一个比 AbstractTruck
更好的名字。并使用 BaseTruck
或 DefaultTruck
而是因为 abstract
在定义中。但是自从Abstract
类永远不应该是任何面向公众的接口(interface)的一部分我相信这是一个可以接受的规则异常(exception)。制作构造函数protected
跨越这个鸿沟还有很长的路要走。
还有 Impl
后缀也只是更多的噪音。更多的重言式。任何不是接口(interface)的东西都是实现,即使是部分实现的抽象类。你会这么傻吗Impl
每个 Class 的每个名称的后缀?
Interface
是关于公共(public)方法和属性必须支持的契约(Contract),它也是 Type信息也是如此。实现 Truck
的所有内容是 Type的 Truck
.
查看 Java 标准库本身。你看到了吗IList
, ArrayListImpl
, LinkedListImpl
?不,你看 List
和 ArrayList
, 和 LinkedList
.这是一个不错的article关于这个确切的问题。任何这些愚蠢的前缀/后缀命名约定都违反了 DRY原则也是。
另外,如果您发现自己添加了 DTO
, JDO
, BEAN
或其他愚蠢的重复后缀,那么它们可能属于 package而不是所有这些后缀。正确打包的命名空间是 self 记录的,并减少了这些构思拙劣的专有命名方案中的所有无用冗余信息,大多数地方甚至内部都没有以一致的方式遵守。
如果你能想出一切来制作你的Class
唯一名称以 Impl
为后缀,那么您需要重新考虑拥有 Interface
一点也不。因此,当您遇到 Interface
的情况时和一个 Implementation
不是从 Interface
中唯一专门化的您可能不需要 Interface
在大多数情况下。
但是,一般来说,为了可维护性、可测试性、模拟,最好的做法是提供接口(interface)。见 this answer for more details .
另请参阅 Martin Fowler 关于 InterfaceImplementationPair 主题的这篇有趣文章
关于Java 接口(interface)/实现命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2814805/