我一直在看 Jake 关于 Dagger 的幻灯片。在第 29 页,他说“将“做”与“如何”分开。这具体是什么意思?它有什么好处?
https://speakerdeck.com/jakewharton/android-testing?slide=29
我一直在看 Jake 关于 Dagger 的幻灯片。在第 29 页,他说“将“做”与“如何”分开。这具体是什么意思?它有什么好处?
https://speakerdeck.com/jakewharton/android-testing?slide=29
如果我必须扩展这句话,它会是:“需要‘执行’一个动作的代码不应该需要知道‘如何’完成那个动作。”
这是一个基本原则,可以归为许多不同的短语,但可以最具体地解释为 Java 中的接口和实现。
当您Set
在 Java 中使用 a 时,您关心的是行为:每个元素只出现一次。Java 提供了多种Set
. 每个实现都使用不同的技术来履行接口的契约:哈希桶、树或位。
与唯一交互的代码Set
只关心行为,而不是如何实现。
相同的语义可以应用于应用程序中的许多不同事物。我最喜欢的例子是发布推文的东西。
interface Tweeter {
void postTweet(String message);
}
如果我是一个想要发布推文的班级,我只关心它发送推文的能力。
public MyClass(Tweeter tweeter) {
this.tweeter = tweeter;
}
@Override
public void run() {
tweeter.postTweet("I'm a Runnable that's being run!");
}
推文是如何发送的?从谁的角度来看MyClass
,谁在乎!
在我的实际应用程序中,我当然会使用 a TwitterTweeter
(在实例化时直接使用MyClass
或通过依赖注入)。但是,我现在可以传入MockTweeter
我自己的实现来编写一个测试,该测试断言它何时MyClass
发布run()
一条推文。
像这样的事情可能看起来很明显,但看到代码(对于这个例子)需要发布推文并且确切地知道如何这样做并不罕见。
在我离开之前,有两点很重要: