3 回答
TA贡献1780条经验 获得超1个赞
我在这里看到的答案表明,如果只有一种实现,则不需要接口。这与“依赖注入/控制反转”原理相违背(不要打电话给我们,我们会打电话给您!)。
所以是的,在某些情况下,您希望简化代码,并依靠注入的接口实现轻松地对其进行测试(这也可能是代理的-您的代码不知道!)。即使您只有两种实现-一种用于测试的Mock,另一种被注入到实际的生产代码中-这也不会使接口变得多余。记录良好的界面可建立合同,也可以通过严格的模拟实施进行维护以进行测试。
实际上,您可以使用更有效的生产代码实现(不检查应作为参数的参数)来建立测试,以使模拟程序执行最严格的接口协定(对不应为null的参数抛出异常等)并捕获测试中的错误。不为null表示为null,因为模拟在测试中引发了异常,并且您知道参数不为null(例如,由于在这些测试之后修复了代码)。
对于新手来说,依赖注入/ IOC可能很难掌握,但是一旦您了解了它的潜力,便会想在各处使用它,并且会发现自己一直在建立接口-即使只有一个(实际生产)实施。
对于这一实现(您可以推断,并且您是对的,我相信测试用的模拟应该称为Mock(InterfaceName)),我更喜欢使用Default(InterfaceName)这个名称。如果出现更具体的实现,则可以适当地命名。这也避免了我特别不喜欢的Impl后缀(如果它不是一个抽象类,当然,它是一个“ impl”!)。
我还更喜欢“ Base(InterfaceName)”而不是“ Abstract(InterfaceName)”,因为在某些情况下,您希望基类在以后可实例化,但是现在您的名称仍然是“ Abstract(InterfaceName)” ,这会迫使您重命名该类,可能会引起一些小的混乱-但是,如果始终为Base(InterfaceName),则删除abstract修饰符不会更改该类的名称。
TA贡献1780条经验 获得超5个赞
我倾向于遵循Java Core / Sun建立的伪约定,例如在Collections类中:
List
-“概念”对象的接口ArrayList
-接口的具体实现LinkedList
-接口的具体实现AbstractList
-抽象的“部分”实现,以协助自定义实现
在AWT Event / Listener / Adapter范例之后,我曾经做过相同的事情来为事件类建模。
添加回答
举报