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