Androidアプリ開発にクリーン
アーキテクチャを取り入れよう
(OSS編)
2016/02/25
notice,inc.
http://www.notice.co.jp/
@notice_inc
アーキテクチャ編の復習
質問がありましたので、ディスカッションしておきましょう。
Q.1 「オニオンアーキテクチャと同じくたまねぎのようなレイヤー構成になっているが、その意味は?」
Domain Modelをコアとしたアーキテクチャだからです。
上下ではなく、コア(interface)を実装(implement)が包み込んでいく(DI)メタファ。
Q.2 「データベースは、下位層ではなく外界とすれば、いいのでは?」
The Onion Architecture - Jeffrey Palermo
http://jeffreypalermo.com/blog/the-onion-architecture-part-1/
その通り!
“The database is not the center. It is external. ”
じゃあ、センターはなに?
“Remember that the Domain Model is the very center.”
Day1 Keynote in DroidKaigi 2016
これ見てくれたら、今日は話すことなし。
「OSSの動向を捉えた実装方針」
https://speakerdeck.com/wasabeef/day1-keynote-
in-droidkaigi-2016
でも、お仕事します。
クリーンアーキテクチャを支える
OSSのご紹介
開発環境
Android Studio
Eclipse+ADTはオワコン
新しいSDKを使うなら、Android Studioを選択。
Gradle※(build tool)でOSSを簡単にインポート。
※グラドルではないよ。グレイドル
Retrolambda(レトロラムダ)
Android Studioなら、SAM(Single Abstract Method)型はlambdaで書けるけど、
Retrolambda(backport tool)を使うとJava8のlambdaで書ける。
SAM型なら、こんなに簡単に書ける。
before:
button.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) { … }
}
after:
button.setOnClickListener(v -> { … });
Binding/DI
ButterKnife – Jake Wharton
面倒なfindViewById()のボイラープレートを抹殺
@Bind(R.id.button) Button button
リスナーもbindできるよ。
@OnClick(R.id.submit) public void submit(View view)
Dagger2 – Google/Square
Component/Module単位にDIできる。
使ってみたけど正直、難解
バターナイフではケガしないが、短剣は危険(笑)
Networking
Okhttp3+Retrofit2 – Square/J.W.
API作成最適コンビ。Retrofit2はbeta4まできたね。
http://square.github.io/okhttp/
http://square.github.io/retrofit/
拙記事:「Retrofit2のRxJavaCallアダプタを試す」 beta<=2での話。
http://qiita.com/notice_inc/items/74a7e98b54dd2838c559
Picasso(ピカソ) - Square
画像ダウンロード・キャッシュ
Volley(ボレー) - Google
HTTPクッキーの扱いにバグがあるんで、セッション使うアプリはやめといたほうがいいよ。
自分でHttpStackつくれってよ。えぇ、これ仕様??
特にLaravelは、セッションキー以外にXSRFトークンがクッキーされるんで、つぶしてしまいます。
弊社では独自パッチして使ったよ(非公開)。
NetworkResponse does not support multiple cookies
https://github.com/mcxiaoke/android-volley/issues/87
Reactive eXtentions/Promise
RxJava/RxAndroid/RxBinding
Rxbinding – Jake Wharton
TextViewの入力文字列を文字列があるかどうかの真偽値に変換(map)して、
サーチボタンを活性・不活性する。
@Bind(R.id.text) TextView textView;
@Bind(R.id.search) Button search;
RxTextView.textChanges(textView)
.map(text -> text.length() > 0)
.subscribe(enabled -> search.setEnabled(enabled))
jdeferred/android-promise
まだ、使ったことないけど、試してみるか。
View/Presenter
Mortar(モルタル) - Square
Bundleサービスを提供してくれる。
永続化できるViewPresenterが利用できる。
Dagger2と相性よし。
Flow/Path – Square
FragmentManagerの代替。
スクリーン・画面遷移を抽象化したフレームワーク。
ヒストリーも扱える。
Mortarとあわせて、画面状態・画面スタックを保存・復元。
リクリエーション地獄から解放される。
実際使うには、もう少し内部の理解が必要そう。
Flow and Mortar – Thorben Primke
https://realm.io/jp/news/using-flow-mortar/
Database
Realm(レルム)
 SQLiteの代替データベース。ActiveRecordのように利用できる。
 autoincrementなし。offset,limitなし。cascadingもなし。
 SQLをガンガン使いたいなら、止めた方がいい。
 Realmエンティティのメンバへの代入が即データベースに反映する
(トランザクション必要)。便利だか、逆に切り離したいとき不便。そ
もそも、エンティティをモデルとして利用すべきではない(でも、面
倒だし)。
 iOS/Swiftでも使えるが、Objective-Cが混在すると、Objective-C版し
か使えないのが、残念。
いまんとこ、Objective-C版しか使ったことないけど。
Others
Gson(ジーサン) - Google
Json-POJO間をシリアライズ・デシリアライズする。
Timber(ティンバー) - Jake Wharton
ログファサードとして利用できる。
Logと違って、フォーマットできる。
Timber.d(“[%s] %d”, “hoge”, n)
Logクラスを使うと、リリース時のログ抑制ができなくなる。
拙記事:「アンドロイドアプリのログ出力にTimber+Log4Jを使う」
http://www.notice.co.jp/archives/3852
Testing
ActivityInstrumentationTestCase2
• ユニットテストでアクティビティが必要なら、こ
のクラスを継承して、Activityのユニットテスト
ができます。
• 非同期APIのテストは、CountDonwLatchを利
用してウェイトします(ウェイトクラス作成)。

Androidアプリ開発にクリーンアーキテクチャを取り入れよう (OSS編)