0

我一直在看 Jake 关于 Dagger 的幻灯片。在第 29 页,他说“将“做”与“如何”分开。这具体是什么意思?它有什么好处?

https://speakerdeck.com/jakewharton/android-testing?slide=29

4

1 回答 1

1

如果我必须扩展这句话,它会是:“需要‘执行’一个动作的代码不应该需要知道‘如何’完成那个动作。”

这是一个基本原则,可以归为许多不同的短语,但可以最具体地解释为 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()一条推文。

像这样的事情可能看起来很明显,但看到代码(对于这个例子)需要发布推文并且确切地知道如何这样做并不罕见。

在我离开之前,有两点很重要:

  • 接口和实现并不是实现这一点的唯一方法,它们只是一种非常有效的方法。
  • 这种形式的抽象是锦上添花。没有糖霜的蛋糕很烂。但是带有 5 英寸厚糖霜的蛋糕也很糟糕。将其应用到需要且合乎逻辑的地方。
于 2014-03-21T05:06:55.310 回答