Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

前任者から引き継いだ Eight Android アプリ内部の改善

Sansan tech meetup #1 モバイルアプリ編
https://sansan.connpass.com/event/48510/
発表資料

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all
  • Be the first to comment

前任者から引き継いだ Eight Android アプリ内部の改善

  1. 1. 前任者から引き継いだ Eight Android アプリ内部の改善 2017/02/16 Sansan tech meetup #1 モバイルアプリ編 Sansan 株式会社 Eight 事業部 辰濱健一
  2. 2. Copyright © 2014 Sansan, Inc. All rights reserved. #Sansan_tech_meetup 1
  3. 3. Copyright © 2014 Sansan, Inc. All rights reserved. 2
  4. 4. Copyright © 2014 Sansan, Inc. All rights reserved. 3 【公開自粛】
  5. 5. Copyright © 2014 Sansan, Inc. All rights reserved. > 自己紹介 4 • 辰濱健一 @tatsuhama50 • 徳島生まれ、奈良育ち、徳島県在住 • 2回転職するも、いずれも徳島県内勤務 • Tokushima.app 主催 (徳島でのスマホアプリの勉強会) • Sansan株式会社所属 • 古民家を改修した神山ラボ勤務 • 名刺アプリ Eight Android 版の開発 • Kotlin, RxJava, Realm, … を使ってます • リモートワーク • 趣味は楽器演奏
  6. 6. Copyright © 2014 Sansan, Inc. All rights reserved. > Sansan神山ラボ 5
  7. 7. Copyright © 2014 Sansan, Inc. All rights reserved. > 趣味 6 • 楽器演奏(エレクトーン・トランペット) • 徳島県内のイベントで、ちらほら演奏する機会を頂い てます
  8. 8. Copyright © 2014 Sansan, Inc. All rights reserved. Eight Android アプリ関係者の推移 7 #1 #2 #3 #4 #5 #6
  9. 9. Copyright © 2014 Sansan, Inc. All rights reserved. Eight Android アプリ関係者の推移 8 #1 #2 #3 #4 #5 #6 前任者 社員 社員 業務委託 社員 内定者
  10. 10. Copyright © 2014 Sansan, Inc. All rights reserved. Eight Android アプリ関係者の推移 9 #1 #2 #3 #4 #5 #6 前任者 社員 社員 業務委託 社員 内定者 ・#5前任者 ・#1社員 ・#3業託 ・#1社員 ・#3業託 ・#2社員 ・#1社員 ・#3業託 ・#2社員 ・#6社員
  11. 11. Copyright © 2014 Sansan, Inc. All rights reserved. 時代の推移 10 • 前任者時代 • Android エンジニア同士のレビューができない • どうしても個性が出る • マッチョな Activity • バトンタッチ後 • Android エンジニアの複数人体制 • レビューによる議論も盛んに • 技術顧問の招聘 • モダンなライブラリの紹介&ハンズオン • レビューへの参加
  12. 12. Copyright © 2014 Sansan, Inc. All rights reserved. バトンタッチ後に導入したライブラリ等 11 • Realm • Dagger2 • RxJava • Kotlin • Retrofit • など…
  13. 13. Copyright © 2014 Sansan, Inc. All rights reserved. バトンタッチ後に導入した CI 環境(Jenkins) 12 • 自動ビルド • リリースバイナリ作成 • Fabric beta へのアップロード • Verification • Lint • UnitTest • 関数の UnitTest • AndroidTest • Realm のマイグレーションテスト
  14. 14. Copyright © 2014 Sansan, Inc. All rights reserved. 本題へ… 13
  15. 15. Copyright © 2014 Sansan, Inc. All rights reserved. 内部設計の改善 14 • レイヤーの整理・分割 • データの流れ、View の更新方法を整理
  16. 16. Copyright © 2014 Sansan, Inc. All rights reserved. レイヤーの整理・分割 15 • Before • マッチョな Activity • View の構築 • 通信処理を呼び出す準備のコード • 通信処理のコールバックで DB 書き込み、View 更新 • After • 表示:Presentation Layer に分割 • 操作:UseCase に切り出して呼び出すだけ
  17. 17. Copyright © 2014 Sansan, Inc. All rights reserved. Layers 16 Presentation Layer Application Layer Domain Layer Infrastructure Layer View Presenter Activity Entity UseCase DB Network
  18. 18. Copyright © 2014 Sansan, Inc. All rights reserved. Layers 17 Presentation Layer Application Layer Domain Layer Infrastructure Layer View Presenter Activity Entity UseCase DB Network マッチョ Activity
  19. 19. Copyright © 2014 Sansan, Inc. All rights reserved. データの流れ、View の更新方法を整理 18 • モデルの変更は別スレッドで行う • View はモデル(Store)からの変更通知を受けて 表示を更新する (Action が View を直接編集しない)
  20. 20. Copyright © 2014 Sansan, Inc. All rights reserved. 簡単なアプリで考える 19 • 仕様 • サーバ上のデータを TextView に表示する • 処理 • ローカルにキャッシュがあれば、先にそれを表示する • サーバからデータが取得できたら • TextView に反映する • 値をキャッシュしておく
  21. 21. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 20
  22. 22. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 21 → Presenter に切り出せる
  23. 23. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 22 → UseCase に切り出せる
  24. 24. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 23 色んな場所で View を更新している!!
  25. 25. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 24 Action(UseCase) が 表示を更新している!
  26. 26. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 25 色んな場所で View を更新している!!
  27. 27. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 26 色んな場所で View を更新している!! モデルの変更通知を 受けて更新すべき
  28. 28. Copyright © 2014 Sansan, Inc. All rights reserved. モデルの変更通知を受けて View を更新する… 27 • SharedPreference • OnSharedPreferenceChangeListener • BehaviorSubject • onNext → subscribe • Realm • Finegrained notifications
  29. 29. Copyright © 2014 Sansan, Inc. All rights reserved. モデルの変更通知を受けて View を更新する… 28 • SharedPreference • OnSharedPreferenceChangeListener • BehaviorSubject • onNext → subscribe • Realm • Finegrained notifications データの保存場所に依存せず、 View に Entity を提供したい
  30. 30. Copyright © 2014 Sansan, Inc. All rights reserved. モデルの変更通知を受けて View を更新する… 29 • SharedPreference • OnSharedPreferenceChangeListener • BehaviorSubject • onNext → subscribe • Realm • Finegrained notifications データの保存場所に依存せず、 View に Entity を提供したい Store の導入
  31. 31. Copyright © 2014 Sansan, Inc. All rights reserved. Store 30 • View は Store からの更新を受けて更新するだけ
  32. 32. Copyright © 2014 Sansan, Inc. All rights reserved. Store 31 • View は Store からの更新を受けて更新するだけ
  33. 33. Copyright © 2014 Sansan, Inc. All rights reserved. ObjectStore を定義 32 • 値を取得する • 値の変更を Observable で受け取る • これらの実装クラスを作成し、 View はこの実装クラスだけを監視して、 更新があったら反映するだけ
  34. 34. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 33
  35. 35. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 34 Action(UseCase) が 表示を更新している! × 不要
  36. 36. Copyright © 2014 Sansan, Inc. All rights reserved. 例) 35 Action(UseCase) が 表示を更新している! × 不要
  37. 37. Copyright © 2014 Sansan, Inc. All rights reserved. Before / After 36 TextView Shared Pref. 初期化時に取得・反映 UseCase ※サーバからの取得処理 反映 反映
  38. 38. Copyright © 2014 Sansan, Inc. All rights reserved. Before / After 37 TextViewStoreUseCase TextView Shared Pref. 初期化時に取得・反映 UseCase ※サーバからの取得処理 反映 反映 Shared Pref. 反映 反映 監視 反映 監視
  39. 39. Copyright © 2014 Sansan, Inc. All rights reserved. 38 スッキリ!
  40. 40. Copyright © 2014 Sansan, Inc. All rights reserved. 補足 39 • 更新通知には rx.Observable を使ってます • Kotlin 使うと Rx 周りはとてもシンプルに書けます • 1つの値を保持する ObjectStore だけでなく、集合を 保持する ArrayStore も用意しています • デグレを支えてくれるテストチームさまさまm(__)m
  41. 41. Copyright © 2014 Sansan, Inc. All rights reserved. 40 Fin.

×