0

Dagger に関する Jake のスライドを見てきました。29ページ目で、彼は「「行う」を「どのように」から分離する」と述べています。それは具体的にどういう意味ですか?そして、その利点は何ですか?

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

4

1 に答える 1

1

文を拡張する必要がある場合は、次のようになります。「アクションを「実行」する必要があるコードは、そのアクションが実行される「方法」を知る必要はありません。」

これは、さまざまな言い回しにまとめられる基本原則ですが、Java でのインターフェイスと実装として最も具体的に説明できます。

Java でa を使用する場合Set、動作に関心があります。各要素は 1 回だけ表示されます。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または依存性注入を介して) を使用します。ただし、独自の実装の a を渡して、 aがツイートを投稿したMockTweeterときにアサートするテストを作成できるようになりました。MyClassrun()

このようなことは当たり前のように思えるかもしれませんが、(この例では) ツイートを投稿する必要があり、その方法を正確に知っているコードを目にすることは珍しくありません。

出発する前に、2 つの重要なポイント:

  • インターフェースと実装は、これを達成するための唯一の方法ではありません。それらは、そうするための非常に効果的な手段にすぎません。
  • この形式での抽象化は、ケーキのアイシングです。アイシングなしのケーキはだめです。しかし、5 インチの厚さのアイシングを使ったケーキも最悪です。必要かつ論理的な場所に適用します。
于 2014-03-21T05:06:55.310 に答える