如何命名您创建的不同类/接口?
有时,我没有要添加到实现名称(如接口FileHandler
和类SqlFileHandler
)中的实现信息.
发生这种情况时,我通常使用"普通"名称命名接口,如Truck
,然后将实际的类命名为TruckClass
.
在这方面,您如何命名接口和类?
如何命名您创建的不同类/接口?
有时,我没有要添加到实现名称(如接口FileHandler
和类SqlFileHandler
)中的实现信息.
发生这种情况时,我通常使用"普通"名称命名接口,如Truck
,然后将实际的类命名为TruckClass
.
在这方面,您如何命名接口和类?
说出你的Interface
个名字.不是ITruck
因为它不是ITruck
而是Truck
.
在Java中,Interface
是Type.然后你有DumpTruck
,TransferTruck
,WreckerTruck
,CementTruck
,等等,implements Truck
.
当您使用Interface
来代替子类时,只需将其强制转换为Truck
即可.就像List<Truck>
号一样.将I
放在前面只是Hungarian style表示法tautology,它只会向代码中添加更多要键入的内容.
所有现代Java IDE的标记接口和实现等等都没有这个愚蠢的符号.不要称它为TruckClass
,那是tautology,就像IInterface
个同义重言式一样糟糕.
如果它是一个实现,那么它就是一个类.这条规则唯一真正的例外,也总是有例外,可能是AbstractTruck
左右.因为只有子类才会看到这一点,而且您永远不应该强制转换到Abstract
类,所以它确实添加了一些信息,说明该类是抽象的,以及应该如何使用它.你仍然可以想出一个比AbstractTruck
更好的名字,用BaseTruck
或DefaultTruck
代替,因为abstract
在定义中.但是由于Abstract
类永远不应该是任何面向公众的接口的一部分,我相信这是一个可以接受的例外.让施工人员成为protected
人对于跨越这一鸿沟有很大帮助.
Impl
后缀也只是更多的噪音.更多的同义反复.任何不是接口的东西都是一个实现,甚至是部分实现的抽象类.你要在每Class个人的名字上都加上那愚蠢的Impl
后缀吗?
Interface
是关于公共方法和属性必须支持的约定,它也是Type个信息.所有实现Truck
的东西都是Truck
的Type.
看看Java标准库本身.你看到IList
ArrayListImpl
LinkedListImpl
了吗?不,你看List
和ArrayList
,还有LinkedList
.关于这个问题,这里有一个很好的答案.所有这些愚蠢的前缀/后缀命名约定都违反了DRY原则.
此外,如果你发现自己给对象添加了DTO
、JDO
、BEAN
或其他愚蠢的重复后缀,那么它们可能属于package,而不是所有这些后缀.正确包装的名称空间是self 记录的,并减少了这些构思非常糟糕的专有命名方案中所有无用的冗余信息,而大多数地方甚至没有以一致的方式在内部遵循这些方案.
如果你能想出的让你的Class
个名字独一无二的办法就是用Impl
来填充它,那么你需要重新考虑用Interface
.所以,当你有一个Interface
和一个Implementation
的情况下,你可能不需要Interface
在大多数情况下,不是唯一专门从Interface
.
但是,一般而言,出于可维护性、可测试性和模仿性的考虑,最佳实践是提供接口.请参见this answer for more details.
也请参考马丁·福勒关于InterfaceImplementationPair人主题的这篇有趣的文章