匕首 - “分离”做什么与“如何”意味着什么?

时间:2014-03-21 03:51:58

标签: android dependency-injection dagger

我一直在看杰克关于匕首的幻灯片。在第29页,他说'分开'做“来自”如何“'。具体是什么意思?它有什么好处?

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

1 个答案:

答案 0 :(得分:1)

如果我必须扩展句子,那就是:"需要做的代码'一个行动不应该知道'如何'该行动得以实现。"

这是一个基本原则,可以归入许多不同的短语,但最具体的可以解释为Java中的接口和实现。

在Java中使用Set时,您会关注行为:每个元素只出现一次。 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的角度来看,谁在乎!

在我的实际应用程序中,我当然会使用TwitterTweeter(直接在实例化MyClass时或通过依赖注入)。但是,我现在能够传入MockTweeter我自己的实现来编写一个测试,断言当MyClass run()发布推文时。

这样的事情似乎显而易见,但看到代码(对于此示例)需要发布推文并确切知道如何执行此操作并不罕见。

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

  • 接口和实现并不是实现这一目标的唯一方法,它们只是一种非常有效的方法。
  • 这种形式的抽象是锦上添花。没有结冰的蛋糕很糟糕。但是一块5英寸厚的糖衣也很糟糕。将它应用到需要和合乎逻辑的地方。