Java 接口(interface)/实现命名约定

标签 java naming-conventions

您如何命名您创建的不同类/接口(interface)? 有时我没有要添加到实现名称的实现信息 - 例如接口(interface) FileHandler 和类 SqlFileHandler

发生这种情况时,我通常以“正常”名称命名接口(interface),例如 Truck,并将实际类命名为 TruckClass

在这方面你如何命名接口(interface)和类?

最佳答案

为您的 Interface 命名这是什么。 Truck .不是 ITruck因为它不是 ITruck它是 Truck .

Interface在 Java 中是 Type .然后你有 DumpTruck , TransferTruck , WreckerTruck , CementTruckimplements Truck .

当您使用 Interface 时代替子类,您只需将其转换为 Truck .如 List<Truck> .把 I前面只是Hungarian style符号 tautology这只会为您的代码添加更多内容。

所有现代 Java IDE 的标记接口(interface)和实现以及没有这个愚蠢的符号。不要叫它TruckClasstautologyIInterface 一样糟糕重言式。

如果它是一个实现,它就是一个类。这条规则唯一真正的异常(exception),并且总是有异常(exception),可能是 AbstractTruck .因为只有子类会看到这个,所以你永远不应该转换为 Abstract class 它确实添加了一些关于该类是抽象的信息以及应该如何使用它。你仍然可以想出一个比 AbstractTruck 更好的名字。并使用 BaseTruckDefaultTruck而是因为 abstract在定义中。但是自从Abstract类永远不应该是任何面向公众的接口(interface)的一部分我相信这是一个可以接受的规则异常(exception)。制作构造函数protected跨越这个鸿沟还有很长的路要走。

还有 Impl后缀也只是更多的噪音。更多的重言式。任何不是接口(interface)的东西都是实现,即使是部分实现的抽象类。你会这么傻吗Impl每个 Class 的每个名称的后缀?

Interface是关于公共(public)方法和属性必须支持的契约(Contract),它也是 Type信息也是如此。实现 Truck 的所有内容是 TypeTruck .

查看 Java 标准库本身。你看到了吗IList , ArrayListImpl , LinkedListImpl ?不,你看 ListArrayList , 和 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/

相关文章:

java - Apache UIMA 解析多语言内容

python - 编写 python 库 : structure, 命名和导入最佳实践

java - Python 通过异步递增变量运行 Java 命令行参数。

java - 为什么我的绘制方法仅在某些时候有效?

java - Kotlin dsl gradle,如何使用自定义任务调用和执行 .kt 内的函数

javascript - 在 TypeScript 中命名抽象类和接口(interface)

c++ - C++ 中缺少标准化命名约定 "standard"

Perl 6 命名空间和模块系统

oop - 函数/方法的主题评论命名

java - Android:无法将位图对象绘制到 View 上