Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

A957664ebee736441a342c8088375f88?s=47 kan
February 25, 2016

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

クライアント企業様向けの資料を公開させていただいています。

A957664ebee736441a342c8088375f88?s=128

kan

February 25, 2016
Tweet

Transcript

  1. Androidアプリ開発にクリーン アーキテクチャを取り入れよう (OSS編) 2016/02/25 notice,inc. http://www.notice.co.jp/ @notice_inc

  2. アーキテクチャ編の復習 質問がありましたので、ディスカッションしておきましょう。 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.”
  3. Day1 Keynote in DroidKaigi 2016 これ見てくれたら、今日は話すことなし。 「OSSの動向を捉えた実装方針」 https://speakerdeck.com/wasabeef/day1-keynote- in-droidkaigi-2016 でも、お仕事します。

    クリーンアーキテクチャを支える OSSのご紹介
  4. 開発環境 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 -> { … });
  5. 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できる。 使ってみたけど正直、難解 バターナイフではケガしないが、短剣は危険(笑)
  6. 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
  7. 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 まだ、使ったことないけど、試してみるか。
  8. 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/
  9. Database Realm(レルム)  SQLiteの代替データベース。ActiveRecordのように利用できる。  autoincrementなし。offset,limitなし。cascadingもなし。  SQLをガンガン使いたいなら、止めた方がいい。  Realmエンティティのメンバへの代入が即データベースに反映する

    (トランザクション必要)。便利だか、逆に切り離したいとき不便。そ もそも、エンティティをモデルとして利用すべきではない(でも、面 倒だし)。  iOS/Swiftでも使えるが、Objective-Cが混在すると、Objective-C版し か使えないのが、残念。 いまんとこ、Objective-C版しか使ったことないけど。
  10. 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
  11. Testing ActivityInstrumentationTestCase2 • ユニットテストでアクティビティが必要なら、こ のクラスを継承して、Activityのユニットテスト ができます。 • 非同期APIのテストは、CountDonwLatchを利 用してウェイトします(ウェイトクラス作成)。