当前位置: 首页 > 面试题库 >

Java接口命名约定

戴博
2023-03-14
问题内容

我在一个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-BaseBase-约定的评论。

就像我之前说过的那样,命名是主观的,使用这样的Base命名法也没有错。但是,就我个人而言,我不喜欢使用它。原因如下:

  1. 如果您的实现将大部分直接使用,那么实例化类的代码会给人留下破坏OOP层次结构的印象。可能应该实例化特定的派生类。

  2. 如果您的实现主要是从扩展而来的,那么这个词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 extends BaseAdapter implements Filterable



 类似资料:
  • 问题内容: 如何命名你创建的不同类/接口?有时我没有实现信息要添加到实现名称中,例如接口和类。 发生这种情况时,我通常使用“普通”名称来命名接口,例如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