Java中interface / class / mockClass的命名约定?

时间:2011-10-25 03:51:33

标签: java

我正在为Lexer对象创建一个模拟类,我想我可能需要进行一些重构。我有两个选择:

  1. 创建界面Lexer,并将当前Lexer重命名为RealLexerMockLexer实施Lexer,方法调用采用Lexer类型的任何内容。我不喜欢我的珍贵Lexer课程现在被重命名为没有意义的东西,如果你不知道有一个模拟课程。
  2. 创建一个界面LexerInterface(我已经不喜欢它,因为它的名称中有Interface),但允许自己保持当前Lexer的方式。 MockLexer然后实现LexerInterface。另一个缺点是方法调用将LexerInterface作为参数。
  3. 这两个选项对我来说都很难闻,所以我想我会让标准为我决定。有没有人有这方面的经验?

4 个答案:

答案 0 :(得分:6)

我肯定会投票使用Lexer作为您的界面名称。如何添加有关 E.g:

  • StringParsingLexer
  • TokenizingLexer
  • SingleThreadedLexer
  • {ThirdPartyLibraryName}DelegatingLexer

另外,你真的需要明确构建MockLexer吗?使用像Mockito这样的框架可以使您的测试更加轻松快捷;您可以像以下一样轻松入门:

Lexer mockLexer = Mockito.mock(Lexer.class);

Mockito.when(mockLexer.doFoo()).thenReturn("bar");

答案 1 :(得分:1)

正如我在评论中所说,我的建议是对您的界面使用Lexer,对默认实现使用DefaultLexer。这种模式经常使用,因此对于维护代码的任何人来说都是非常容易理解的。至于模拟对象,将其命名为MockLexer

也是可以理解的

作为Java使用的命名约定的示例:

javax.swing.table.TableModel是一个界面
javax.swing.table.AbstractTableModel是一个实现TableModel的抽象类 javax.swing.table.DefaultTableModelAbstractTableModel的实现。

但是Java Codding Conventions之外没有建议使用大写字母,名词等。

答案 2 :(得分:1)

根据我的经验,有两个标准。

  1. “标记”您的界面。 (ILexerLexerInterface等)
  2. 使用接口的名称,并为具体实现使用不同的名称。
  3. 我知道这些已经是你提出的选择。麻烦的是,其中没有一个是坚定的“标准”。

    强烈更喜欢选项2)。对象的类名应该倾向于是一个适合“is-a”句子的上下文的名词。说一个对象“是一个”LexerInterface感觉很奇怪,而自然地说对象“是一个”DefaultLexer

    由于我的类或接口名称最终代表一种类型,所以我回避了类或接口名称中的“元”信息。

答案 3 :(得分:0)

我通常使用选项1 - 名为Lexer的接口,默认实现称为DefaultLexerLexerImpl。我喜欢这个,因为我认为它可以让你轻松地讨论类 - 如果你有多个Lexer的实现,那么它们的具体名称可以描述实现类型 - 例如NativeLexer或{{1} } 管他呢。作为一个提到的评论者,那么你的模拟类(如果有的话)可以使用类似TreeBasedLexer的名称来跟随这种模式。

但是,使用模拟库such as the excellent Mockito,您无论如何都可以模拟具体类 - 因此您不再需要在任何地方使用接口以便轻松地测试事物。以下是他们提供的示例in their documentation

MockLexer

那就是说,我仍然建议使用接口而不是将方法签名绑定到具体的类,因为那时使用//You can mock concrete classes, not only interfaces LinkedList mockedList = mock(LinkedList.class); 的东西不需要与实现绑定 - 这可以大大增加可维护性(例如,如果您以后需要多个实现。)

相关问题