我正在为Lexer
对象创建一个模拟类,我想我可能需要进行一些重构。我有两个选择:
Lexer
,并将当前Lexer
重命名为RealLexer
。 MockLexer
实施Lexer
,方法调用采用Lexer
类型的任何内容。我不喜欢我的珍贵Lexer
课程现在被重命名为没有意义的东西,如果你不知道有一个模拟课程。LexerInterface
(我已经不喜欢它,因为它的名称中有Interface
),但允许自己保持当前Lexer
的方式。 MockLexer
然后实现LexerInterface
。另一个缺点是方法调用将LexerInterface
作为参数。这两个选项对我来说都很难闻,所以我想我会让标准为我决定。有没有人有这方面的经验?
答案 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.DefaultTableModel
是AbstractTableModel
的实现。
但是Java Codding Conventions之外没有建议使用大写字母,名词等。
答案 2 :(得分:1)
根据我的经验,有两个标准。
ILexer
,LexerInterface
等)我知道这些已经是你提出的选择。麻烦的是,其中没有一个是坚定的“标准”。
我强烈更喜欢选项2)。对象的类名应该倾向于是一个适合“is-a”句子的上下文的名词。说一个对象“是一个”LexerInterface
感觉很奇怪,而自然地说对象“是一个”DefaultLexer
。
由于我的类或接口名称最终代表一种类型,所以我回避了类或接口名称中的“元”信息。
答案 3 :(得分:0)
我通常使用选项1 - 名为Lexer
的接口,默认实现称为DefaultLexer
或LexerImpl
。我喜欢这个,因为我认为它可以让你轻松地讨论类 - 如果你有多个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);
的东西不需要与实现绑定 - 这可以大大增加可维护性(例如,如果您以后需要多个实现。)