Dependency Injection 一歩目

3173827605_427626c6af-1

話題でした.

「なぜDI(依存性注入)が必要なのか?」についてGoogleが解説しているページを翻訳した  - Qiita

これを幼稚に理解しておこうかとな.

 

「Dependency Injection」という言葉

「依存性注入」てのがしっくりこないので少し調べてみる.

「オブジェクトを注入する」と言うと日本語としても意味がはっきりしていますね。

「Dependency」は「依存性」ではなく「使われる側のオブジェクト」(依存オブジェクト)という意味になります。

やはりあなた方のDependency Injectionはまちがっている。 — A Day in Serenity

「外部オブジェクトの注入」と覚えたら直感的にわかりやすいですよね.

 

修正前/後のコードを比べてみる

修正前.

メソッド内で外部オブジェクトを生成している.


public class RealBillingService implements BillingService { 

  public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {
    CreditCardProcessor processor = new PaypalCreditCardProcessor();
    TransactionLog transactionLog = new DatabaseTransactionLog();
    // ...
  }

}

修正後.

外部オブジェクトを外部で生成してコンストラクタから注入している.


public class RealBillingService implements BillingService {

  private final CreditCardProcessor processor;
  private final TransactionLog transactionLog;

  public RealBillingService(CreditCardProcessor processor,TransactionLog transactionLog) {
    this.processor = processor;
    this.transactionLog = transactionLog;
  }

  public Receipt chargeOrder(PizzaOrder order, CreditCard creditCard) {
     // ...
  }
}

これをテスト時には, メンバ初期化で生成したオブジェクトを各メソッド内でコンストラクタから注入して利用する.


public class RealBillingServiceTest extends TestCase {

  private final PizzaOrder order = new PizzaOrder(100);
  private final CreditCard creditCard = new CreditCard("1234", 11, 2010);

  private final InMemoryTransactionLog transactionLog = new InMemoryTransactionLog();
  private final FakeCreditCardProcessor processor = new FakeCreditCardProcessor();

  public void testSuccessfulCharge() {
    RealBillingService billingService
        = new RealBillingService(processor, transactionLog);
    Receipt receipt = billingService.chargeOrder(order, creditCard);

    // assert etc...
  }

}

 

例) データ抽出先のサーバを切り替える

Repository クラスに, RemoteDataSource オブジェクトを注入しておいてテスト時には切り替えます.

それぞれのインスタンスは Singleton によって一意であることを保証しています.

公開用コード.
android-architecture/Injection.java at todo-mvp · googlesamples/android-architecture


public class Injection {

    public static TasksRepository provideTasksRepository(@NonNull Context context) {
        checkNotNull(context);
        return TasksRepository.getInstance(TasksRemoteDataSource.getInstance(),
                TasksLocalDataSource.getInstance(context));
    }
}

テスト用コード.
android-architecture/Injection.java at todo-mvp · googlesamples/android-architecture


public class Injection {

    public static TasksRepository provideTasksRepository(@NonNull Context context) {
        checkNotNull(context);
        return TasksRepository.getInstance(FakeTasksRemoteDataSource.getInstance(),
                TasksLocalDataSource.getInstance(context));
    }
}

外部オブジェクトの変更が容易になっていることがよくわかります.

注入の方法は他にもあるようですがまあいいか.

 

まとめ

メソッド外で生成してコンストラクタから注入する.
(メソッド内で生成しない)


【リオオリンピック 2016】実際の競技開始時刻を知りたい

テレビ番組表をみながら, テレビを見ていたのですが,

いきなり楽しみにしていた試合が終わっていたり,

録画の再放送だったり, チャンネル違いだったり,

ライブなのになかなか試合が始まらなかったり,

じゃあ 一体 正式な競技開始の時刻はいつなのか.

それが分かれば, ネット上のSNSや動画サイトなどで競技結果や情報を知ることができたり, 無駄に試合前にテレビの前にいることもありません.

ググるのがよさげです.

「rio 2016」

検索結果の最上段に表示されます.

rio_2016_-_Google_検索

「日程」のところをクリックして, 実際の競技開始時間を一覧で確認できます.

リオオリンピック2016

すべて日本時刻で表示されるので時差の計算も不要です.


【急げ】オライリー「Gradle Recipes for Android」が無料ダウンロード配布中!!

あのオライリーから発売されているこの本ですが.

Amazon_co_jp:_Gradle_Recipes_for_Android__Master_the_New_Build_System_for_Android__Ken_Kousen__洋書

Chapter 1 Gradle for Android Basics
1.1. Gradle Build Files in Android
1.2. Configure SDK Versions and Other Defaults
1.3. Executing Gradle Builds from the Command Line
1.4. Executing Gradle Builds from Android Studio
1.5. Adding Java Library Dependencies
1.6. Adding Library Dependencies Using Android Studio
1.7. Configuring Repositories

Chapter 2 From Project Import to Release
2.1. Setting Project Properties
2.2. Porting Apps from Eclipse ADT to Android Studio
2.3. Porting Apps from Eclipse ADT Using Eclipse
2.4. Upgrading to a Newer Version of Gradle
2.5. Sharing Settings Among Projects
2.6. Signing a Release APK
2.7. Signing a Release APK Using Android Studio

Chapter 3 Build Types and Flavors
3.1. Working with Build Types
3.2. Product Flavors and Variants
3.3. Merging Resources
3.4. Flavor Dimensions
3.5. Merging Java Sources Across Flavors

Chapter 4 Custom Tasks
4.1. Writing Your Own Custom Tasks
4.2. Adding Custom Tasks to the Build Process
4.3. Excluding Tasks
4.4. Custom Source Sets
4.5. Using Android Libraries

Chapter 5 Testing
5.1. Unit Testing
5.2. Testing with the Android Testing Support Library
5.3. Functional Testing with Robotium
5.4. Activity Testing with Espresso

Chapter 6 Performance and Documentation
6.1. Performance Recommendations
6.2. DSL Documentation
Appendix Just Enough Groovy to Get By
Appendix Gradle Basics



無料版PDFが本家Gradleのサイトからダウンロードできるようになっています!

New_Gradle_Android_Ebook_for_Free_-_Gradle

New Gradle Android Ebook for Free - Gradle

メールアドレスなど入力後, 送信されてくるメール内のリンクからダウンロードできます.

Free_ebook_from_O_Reilly__Learn_Gradle_for_Beginners

図表入りで, 初心者にもわかりやすい内容になっています.

Gradle_Recipes_for_Android

Gradle_Recipes_for_Android 2

早めにダウンロードしたほうがいいような気がします!