我在一个Java Web应用程序上工作,该应用程序使用Spring进行依赖注入,并使用JMock来模拟单元测试中的这些依赖。
目前,在如何命名所使用的某些接口方面,我们的团队还处于不同意见。命名域中具有多个实现的接口没有问题,这很简单。但是,当涉及到我们只有一个实现并且打算将来仅拥有一个实现的接口时,我们遇到了麻烦。
我们拥有此类接口的原因纯粹是为了模拟,例如,我们有在单元测试中模拟的服务和存储库,这些服务将被命名为“
DocumentMappingService”或存储库“ EmployeeRepository”。目前,有些人只是在关联的接口名称前面加上“ I”,即“
IDocumentMappingService”和“ IEmployeeRepository”。其他人按照上面的方法命名接口,然后在实现类的接口名称后附加“
Impl”。
第三个“派别”认为这两个选择都很差。查阅诸如著名的“在测试的指导下增长面向对象的软件”之类的文献,会使人们相信前面提到的两个选项都很差,并且接口名称应清楚地定义合同和实现类名称。应明确说明该合同的执行方式。但是,在我上面提到的情况下,我们发现很难做到这一点。
我希望那里的某个人以前也遇到过类似的问题,并提出了一些建议,即哪个选项是最佳选择以及为什么。另外,如果您认为“ I”和“
Impl”选项都不好,请提出一个特定的替代约定。
这里没有“一个”正确答案。命名是很主观的,但是最重要的是,它在整个代码库中都应该保持 一致
。我只想为您添加(作为@fge的答案)一些其他选项:
使接口更加通用。
EmployeeRepository implements Repository
DocumentMappingService implements MappingService
将单个实现称为 “默认值” 。
DefaultEmployeeRepository implements EmployeeRepository
DefaultDocumentMappingService implements DocumentMappingService
将基本实现(如果有时扩展)称为 “ support” 。
EmployeeRepositorySupport implements EmployeeRepository
DocumentMappingServiceSupport implements DocumentMappingService
使用 Spring Framework 时,我经常遇到这些命名约定。
编辑: 响应用户nyxz
对-Base
或Base-
约定的评论。
就像我之前说过的那样,命名是主观的,使用这样的Base
命名法也没有错。但是,就我个人而言,我不喜欢使用它。原因如下:
如果您的实现将大部分直接使用,那么实例化类的代码会给人留下破坏OOP层次结构的印象。可能应该实例化特定的派生类。
如果您的实现主要是从扩展而来的,那么这个词Base
在某种程度上将变得多余。您正在扩展它,因此,它当然是基类。h!
在 第二 点主要适用于外设类在你的项目。在发布要在其他项目中使用和扩展的框架或库时提供的扩展点。
另一方面,使用该Base
术语的一个好用例是框架内部的类,这些类将其他外围类之外的常用功能也包括在内。由于不应直接实例化这些类,因此将其标记abstract
为与第
一个 点一致。
这是Adapter
来自Android框架的层次结构作为示例:
接口层次结构。
public interface Adapter
public interface ListAdapter extends Adapter
public interface SpinnerAdapter extends Adapter
本abstract
Base
类因素与众不同的行为和接口实现。
public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter
外围设备类大多数实例化,但有时由Android应用程序扩展。
public class SimpleAdapter extends BaseAdapter implements Filterable
public class ArrayAdapter
问题内容: 如何命名你创建的不同类/接口?有时我没有实现信息要添加到实现名称中,例如接口和类。 发生这种情况时,我通常使用“普通”名称来命名接口,例如Truck并命名实际的类。 你在这方面如何命名接口和类? 问题答案: 命名你的名字。。不是因为它不是一个而是一个。 中的 是。然后你有,,等那个。 当你使用Interface代替子类时,只需将其转换为即可Truck。就像在List 。把I前面的只是匈
问题内容: 我将发布我的代码: 应该注意的是,ServerSession也是一个接口,对我来说,调用“ ServerSessioner”是一种感觉。 我正在玩用IsRole()和AssumeRole()创建接口的想法,但是“ Roler”似乎很奇怪。我突然意识到,除了标准的“ er”后缀之外,我真的不知道或者从未遇到过接口的命名约定。我确实记得VS C ++约定是在所有内容前都加上“ I”。这是“
问题内容: 我的完整变量名称是“唯一代码”,但是我希望此变量是“ ucode” -ish。 那么考虑Java命名约定是正确的吗? 编码 uCode UCode 问题答案: 请参阅编码约定。对于变量,建议使用驼峰式大小写。回覆。命名,我本以为 将是最合乎逻辑的选择(我知道那不在您的选择列表中)。任何变体在我看来都是 unicode 的缩写,我认为这是一种误导。以上不是一个太长的名称(例如,它不是Ab
问题内容: 大多数OO语言的接口名称都以大写的I开头,为什么Java不这样做呢?不遵守该公约的理由是什么? 为了说明我的意思,如果我想拥有一个用户界面和一个用户实现,那么在Java中有两种选择: 类=用户,接口= UserInterface 类= UserImpl,接口=用户 在大多数语言中: 类=用户,接口= IUser 现在,你可能会争辩说,你总是可以为用户实现选择一个最具描述性的名称,问题就
问题内容: 在Java中,使用“ 非法 ”(如)与“ 无效 ”(如)之间在语义上有区别吗? 在分配过程中,编写的子类来表示一系列无法分词的输入字符变得很有用,我想知道约定是使用还是。 到目前为止,我能找到的唯一区别是似乎更喜欢“非法”,而更喜欢“无效”。但是,也存在的子类。 问题答案: 您可以 合法 使用API并仍然拥有 无效 数据;都是语义。
为了在跨API开发中向开发者提供一致的开发体验,所有的命名应该保证: 简单 直观 一致 这适用于接口、资源、集合、方法以及消息的命名。 因为很多开发者并非以英语作为母语,所以命名约定的目标之一是确保大多数开发者可以更容易理解 API。对于方法和资源,我们鼓励使用简单、直观和一致的单词来命名。 API 中的命名应该使用正确的美式英语。例如,使用美式英语的 license 而非英式英语的 licenc