Dagger に関する Jake のスライドを見てきました。29ページ目で、彼は「「行う」を「どのように」から分離する」と述べています。それは具体的にどういう意味ですか?そして、その利点は何ですか?
https://speakerdeck.com/jakewharton/android-testing?slide=29
Dagger に関する Jake のスライドを見てきました。29ページ目で、彼は「「行う」を「どのように」から分離する」と述べています。それは具体的にどういう意味ですか?そして、その利点は何ですか?
https://speakerdeck.com/jakewharton/android-testing?slide=29
文を拡張する必要がある場合は、次のようになります。「アクションを「実行」する必要があるコードは、そのアクションが実行される「方法」を知る必要はありません。」
これは、さまざまな言い回しにまとめられる基本原則ですが、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
ときにアサートするテストを作成できるようになりました。MyClass
run()
このようなことは当たり前のように思えるかもしれませんが、(この例では) ツイートを投稿する必要があり、その方法を正確に知っているコードを目にすることは珍しくありません。
出発する前に、2 つの重要なポイント: