Java 接口/实现命名约定
如何命名您创建的不同类/接口?有时我没有要添加到实现名称中的实现信息 - 例如接口和类。FileHandler
SqlFileHandler
当这种情况发生时,我通常以“正常”名称命名接口,就像并命名实际的类一样。Truck
TruckClass
在这方面,你如何命名接口和类?
如何命名您创建的不同类/接口?有时我没有要添加到实现名称中的实现信息 - 例如接口和类。FileHandler
SqlFileHandler
当这种情况发生时,我通常以“正常”名称命名接口,就像并命名实际的类一样。Truck
TruckClass
在这方面,你如何命名接口和类?
命名你是什么。.不是因为它不是一个.。Interface
Truck
ITruck
ITruck
Truck
Java 中的 a 是一种类型。然后你有,,,等。Interface
DumpTruck
TransferTruck
WreckerTruck
CementTruck
implements Truck
当您使用 代替子类时,只需将其转换为 。如 中所示。放在前面只是匈牙利风格的符号重言式,除了在代码中键入更多内容之外,什么都没有。Interface
Truck
List<Truck>
I
所有现代Java IDE都标记了接口和实现,如果没有这种愚蠢的符号,什么都没有。不要说它是重言式的,就像重言式一样糟糕。TruckClass
IInterface
如果它是一个实现,它是一个类。此规则的唯一真正例外(并且总是有例外)可能是类似 .由于只有子类才能看到这一点,并且您永远不应该强制转换为类,因此它确实添加了一些信息,表明该类是抽象的,并且应该如何使用它。您仍然可以想出一个比和使用更好的名称,或者相反,因为它在定义中。但是,由于类永远不应该成为任何面向公众的界面的一部分,我相信这是一个可以接受的规则例外。制作构造函数对于跨越这一鸿沟有很长的路要走。AbstractTruck
Abstract
AbstractTruck
BaseTruck
DefaultTruck
abstract
Abstract
protected
后缀也只是更多的噪音。更多同义词。任何不是接口的东西都是实现,甚至是作为部分实现的抽象类。你打算把那个愚蠢的后缀放在每个班级的每个名字上吗?Impl
Impl
这是一个关于公共方法和属性必须支持的内容的契约,它也是类型信息。实现的所有内容都是 .Interface
Truck
Truck
看看Java标准库本身。你看到 , , ?否,您会看到 和 、和 。这是一篇关于这个确切问题的好文章。这些愚蠢的前缀/后缀命名约定中的任何一个都违反了 DRY 原则。IList
ArrayListImpl
LinkedListImpl
List
ArrayList
LinkedList
此外,如果您发现自己在对象中添加 、 或其他愚蠢的重复后缀,那么它们可能属于包中,而不是所有这些后缀。正确打包的命名空间是自我记录的,并减少了这些真正构思拙劣的专有命名方案中所有无用的冗余信息,大多数地方甚至没有以一致的方式在内部遵守。DTO
JDO
BEAN
如果你所能想出的使你的名字独一无二的就是用 它作为后缀,那么你需要重新考虑有一个。因此,当您遇到这种情况时,您有一个和一个不是唯一专业化的,您可能在大多数情况下不需要。Class
Impl
Interface
Interface
Implementation
Interface
Interface
但是,一般来说,对于可维护性,可测试性,模拟,提供接口是最佳做法。有关更多详细信息,请参阅此答案。
另请参阅Martin Fowler关于InterfaceImplementationPair主题的这篇有趣的文章
我在这里看到的答案表明,如果你只有一个实现,那么你就不需要接口。这与Pencency Injection/Inversion of Control原则背道而驰(不要打电话给我们,我们会打电话给你!
所以,是的,在某些情况下,您希望简化代码,并通过依赖注入的接口实现(也可以被代理 - 您的代码不知道!) 来使其易于测试。即使您只有两个实现 - 一个是用于测试的Mock,另一个是注入实际生产代码的实现 - 这也不会使接口变得多余。一个记录良好的接口建立了一个契约,这个契约也可以通过严格的模拟实现来维护。
事实上,您可以建立具有模拟的测试,这些测试实现了最严格的接口协定(为不应该为null的参数抛出异常等),并在测试中使用更有效的实现来捕获测试中的错误(不检查不应该为null的参数,因为模拟在测试中抛出了异常,并且您知道由于在这些测试之后修复代码,参数不是null, 例如)。
对于新手来说,依赖注入/IOC可能很难掌握,但是一旦你了解了它的潜力,你就会想要到处使用它,你会发现自己一直在制作接口 - 即使只有一个(实际生产)实现。
对于这个实现(你可以推断,你是对的,我相信用于测试的模拟应该被称为Mock(InterfaceName)),我更喜欢名称Default(InterfaceName)。如果出现更具体的实现,则可以适当地命名它。这也避免了我特别不喜欢的 Impl 后缀(如果它不是一个抽象类,当然它是一个“impl”!
我也更喜欢“Base(InterfaceName)”而不是“Abstract(InterfaceName)”,因为在某些情况下,您希望基类以后可实例化,但现在您坚持使用名称“Abstract(InterfaceName)”,这迫使您重命名该类,可能会引起一些轻微的混淆 - 但如果它始终是Base(InterfaceName), 删除抽象修饰符不会更改类的内容。