最近、Tree Based DIツールのToothpickを知りました。
https://github.com/stephanenicolas/toothpick
このメンテナは、RoboGuiceをメンテしていたGrouponの人です。RoboGuiceの更新を見に行った時にたまたま見つけました。ここ数ヶ月で作り上げられたDIライブラリのようです。このリポジトリWikiのあるページに、AndroidにおけるDIの歴史や経験をまるっと学ぶことができて良かったです。
https://github.com/stephanenicolas/toothpick/wiki/FAQ#why-creating-toothpick-
さらには、彼らがRoboguiceからDagger1/2と触れた上でこのToothpickを作るに至った流れも書いています。
まだWikiと簡易サンプルをさっと眺めた程度なのですが、備忘録がてら。
AndroidでToothpick
Toothpick自体はJavaのTree Based DIです。これ単体ではAndroidはサポートしていません。Androidをサポートするために、smootheがあります。
このサンプルにあるように、Toothpickはsmoothieを介してAndroidにDIを提供します。
幾つかのDIツールとの速度比較
Roboguice4/Dagger1/Dagger2/Toothpickのinjectionするメソッドの個数による速度差が以下の通り。
https://github.com/stephanenicolas/toothpick/wiki/Benchmark#benchmark-raw-data
Androidの環境でいうと、injectionするメソッド数が1000個超えるとかな大規模なものになることはまだそこまで多くはないはずなので、速度としては申し分ないのではないでしょうか。
初期設定では一部reflectionを使っている
以下の通り、default設定ではfactoriesの読み込みやmember injectorsを読み込むにあたりreflectionを使っているらしいです。
https://github.com/stephanenicolas/toothpick/wiki/Configurations
ただ、このreflectionはOFFにすることができるそうな。そのためには以下の通りToothpickを使う時に reflectionFree の設定を与える必要があるとのこと。これにより、完全にToothpickはreflectionなく動作し、高速になると。
Toothpick.setConfiguration(Configuration.reflectionFree()); FactoryRegistryLocator.setRootRegistry(new <package>.FactoryRegistry()); MemberInjectorRegistryLocator.setRootRegistry(new <package>.FactoryRegistry());
ベンチマークはこちら => ★
確かに、reflectionの有無で何倍も速度差がでますね。ここら辺の積み重ねで性能差が大きく出てきそうな。
scopeにより意図しないクラッシュを避ける
Scopeという概念を入れることで、Scopeに属さないfragmentなんかを意図せず読んだ時にクラッシュする、というような不用意なinjectionを回避できるようにしているそうな。ここはまだこのツールの中身を追ってはいないのでなるほどなという感じ。
あと、ここなんかでは、メモリリークに対するこのツールの見解といったところも記述されています。
締め
まだざっとWikiなんかを眺めただけで中身を追ってはいないのですが、tree based DIが、学習コストがあまり高くなくとも比較的容易に使えるライブラリなのであれば結構有力なDIの選択肢になるのではないかなと感じています。個人的には、toothpickにはテストコード向けの機能も提供しているので、テストコード書くにあたってもかきやすいものであればなお嬉しいなという感じです。シンプルにinjectionするモジュールの関係性や使い方を理解して使えるのであれば、内部品質向上へ大きく寄与するし、テストコードを描きやすいのであればクラッシュや機能不全などの外部品質の担保にも寄与できると期待できるためです。
ちなみに、過去、私はDagger2を学んでいました。このBlogの過去のDagger2関係 => 検索
その中でDagger2を使ってテストコードのDIによるテストも書きはしたのですが、そんなに簡単に書けた!というほどでもなかった記憶が。。。
ともあれ、Dagger2と同じくらいには使い方などを追ってみようと思っています。(少し気長に…)
1 Comment