如何命名您创建的不同类/接口?有时,我没有实现信息可以添加到实现名称中,比如接口FileHandler和类SqlFileHandler。
在这种情况下,我通常使用“普通”名称命名接口,如Truck,并将实际的类命名为TruckClass。
在这方面,如何命名接口和类?
发布于 2010-05-12 06:17:36
将您的Interface命名为它是什么。Truck。不是ITruck,因为它不是ITruck,而是Truck。
在Java中,Interface就是Type。然后你有DumpTruck,TransferTruck,WreckerTruck,CementTruck等implements Truck。
当您使用Interface代替子类时,只需将其转换为Truck即可。就像List<Truck>一样。将I放在前面只是Hungarian style符号tautology,它只会向代码中添加更多要输入的内容。
所有现代Java IDE的标记接口和实现,以及没有这个愚蠢的符号的东西。不要把它叫做TruckClass,因为它和IInterface同义重言式一样糟糕。
如果它是一个实现,那么它就是一个类。这条规则唯一的例外可能是像AbstractTruck这样的东西,而且总是有例外。因为只有子类才会看到这一点,所以您永远不应该强制转换为Abstract类,它确实添加了一些信息,表明该类是抽象的,以及应该如何使用它。您仍然可以想出一个比AbstractTruck更好的名称,并使用BaseTruck或DefaultTruck,因为abstract在定义中。但是由于Abstract类永远不应该是任何面向公共的接口的一部分,我相信这是一个可以接受的规则例外。让构造器protected对于跨越这一鸿沟有很大的帮助。
而Impl后缀也只是更多的噪音。更多的同义反复。任何不是接口的东西都是实现,即使抽象类也是部分实现。你要在每个Class的名字上都加上那个愚蠢的Impl后缀吗?
Interface是一个关于公共方法和属性必须支持的约定,它也是Type信息。所有实现Truck的东西都是Truck的Type。
看看Java标准库本身。你看到IList,ArrayListImpl,LinkedListImpl了吗?不,你看到了List和ArrayList,还有LinkedList。这里有一个关于这个问题的很好的article。这些愚蠢的前缀/后缀命名约定也都违反了DRY原则。
此外,如果您发现自己向对象添加了DTO、JDO、BEAN或其他愚蠢的重复后缀,那么它们可能属于package,而不是所有这些后缀。正确打包的命名空间是自我文档化的,并减少了这些构思非常糟糕的专有命名方案中所有无用的冗余信息,大多数地方甚至在内部都没有以一致的方式遵守这些命名方案。
如果您所能想到的使您的Class名称具有唯一性的所有方法都是使用Impl作为后缀,那么您需要重新考虑是否拥有一个Interface。因此,当您有一个Interface和一个不是从Interface唯一专有的Implementation的情况下,在大多数情况下您可能不需要Interface。
然而,一般而言,为了可维护性、可测试性和模拟,最佳实践是提供接口。参见this answer for more details。
也可以参考Martin Fowler关于InterfaceImplementationPair的这篇有趣的文章
发布于 2010-05-12 08:48:06
我在这里看到的答案表明,如果你只有一个实现,那么你就不需要接口。这违背了依赖注入/控制反转原则(不要打电话给我们,我们会打电话给你!)。
因此,是的,在某些情况下,您希望通过依赖注入的接口实现来简化代码并使其易于测试(这也可能是代理的-您的代码不知道!)。即使您只有两个实现--一个是用于测试的Mock,另一个是注入到实际生产代码中的Mock--这并不意味着有一个接口是多余的。一个文档化良好的接口建立了一个契约,该契约也可以由严格的模拟实现来维护以进行测试。
事实上,您可以建立具有mock的测试,这些测试实现最严格的接口约定(为不应该为null的参数抛出异常,等等),并在测试中捕获错误,方法是在生产代码中使用更有效的实现(不检查不应该为null的参数,因为mock在测试中抛出异常,并且您知道这些参数不是null,因为在这些测试之后修复了代码)。
对于一个新手来说,依赖注入/IOC可能很难掌握,但是一旦你理解了它的潜力,你就会想要在所有地方使用它,你会发现自己一直在做接口-即使只有一个(实际的生产)实现。
对于这一个实现(您可以推断,您可能是正确的,我认为用于测试的模拟应该称为模拟(InterfaceName)),我更喜欢名称默认(InterfaceName)。如果出现更具体的实现,则可以对其进行适当的命名。这也避免了我特别不喜欢的Impl后缀(如果它不是一个抽象类,当然是一个"impl"!)。
我也更喜欢“基础(InterfaceName)”而不是“抽象(InterfaceName)”,因为在某些情况下,你希望你的基类稍后变得可实例化,但现在你坚持使用“抽象(InterfaceName)”的名称,这迫使你重命名类,可能会造成一些小混乱-但如果它总是基础(InterfaceName),删除抽象修饰符并不会改变类是什么。
发布于 2010-05-12 06:27:13
接口的名称应该描述接口所代表的抽象概念。任何实现类都应该有一些特定的特征,这些特征可以用来给它起一个更具体的名字。
如果只有一个实现类,并且您想不出任何使其具体的东西(通过想要将其命名为-Impl来暗示),那么看起来根本没有理由拥有接口。
https://stackoverflow.com/questions/2814805
复制相似问题