41
前前前前前前前前前前 Eight Android 前前前前前前前前 2017/02/16 Sansan tech meetup #1 前前前前前前前前 Sansan 前前前前 Eight 前前前 前前前

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

Embed Size (px)

Citation preview

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

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

2017/02/16Sansan tech meetup #1 モバイルアプリ編 Sansan 株式会社 Eight 事業部 辰濱健一

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

Copyright © 2014 Sansan, Inc. All rights reserved.

#Sansan_tech_meetup

2

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

Copyright © 2014 Sansan, Inc. All rights reserved. 3

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

Copyright © 2014 Sansan, Inc. All rights reserved. 4

【公開自粛】

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

Copyright © 2014 Sansan, Inc. All rights reserved.

>自己紹介

5

• 辰濱健一   @tatsuhama50• 徳島生まれ、奈良育ち、徳島県在住

• 2 回転職するも、いずれも徳島県内勤務

• Tokushima.app 主催(徳島でのスマホアプリの勉強会)

• Sansan 株式会社所属

• 古民家を改修した神山ラボ勤務

• 名刺アプリ Eight Android 版の開発

• Kotlin, RxJava, Realm, … を使ってます

• リモートワーク

• 趣味は楽器演奏

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

Copyright © 2014 Sansan, Inc. All rights reserved.

>Sansan 神山ラボ

6

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

Copyright © 2014 Sansan, Inc. All rights reserved.

>趣味

7

• 楽器演奏(エレクトーン・トランペット)

• 徳島県内のイベントで、ちらほら演奏する機会を頂いてます

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

Copyright © 2014 Sansan, Inc. All rights reserved.

Eight Android アプリ関係者の推移

8

#1 #2

#3 #4

#5 #6

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

Copyright © 2014 Sansan, Inc. All rights reserved.

Eight Android アプリ関係者の推移

9

#1 #2

#3 #4

#5 #6

前任者

社員 社員

業務委託

社員

内定者

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

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 社員

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

Copyright © 2014 Sansan, Inc. All rights reserved.

時代の推移

11

• 前任者時代

• Android エンジニア同士のレビューができない

• どうしても個性が出る

• マッチョな Activity

• バトンタッチ後

• Android エンジニアの複数人体制

• レビューによる議論も盛んに

• 技術顧問の招聘

• モダンなライブラリの紹介&ハンズオン

• レビューへの参加

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

Copyright © 2014 Sansan, Inc. All rights reserved.

バトンタッチ後に導入したライブラリ等

12

• Realm• Dagger2• RxJava• Kotlin• Retrofit• など…

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

Copyright © 2014 Sansan, Inc. All rights reserved.

バトンタッチ後に導入した CI 環境( Jenkins )

13

• 自動ビルド

• リリースバイナリ作成

• Fabric beta へのアップロード

• Verification• Lint• UnitTest• 関数の UnitTest

• AndroidTest• Realm のマイグレーションテスト

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

Copyright © 2014 Sansan, Inc. All rights reserved.

本題へ…

14

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

Copyright © 2014 Sansan, Inc. All rights reserved.

内部設計の改善

15

• レイヤーの整理・分割

• データの流れ、 View の更新方法を整理

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

Copyright © 2014 Sansan, Inc. All rights reserved.

レイヤーの整理・分割

16

• Before• マッチョな Activity• View の構築

• 通信処理を呼び出す準備のコード

• 通信処理のコールバックで DB 書き込み、 View 更新

• After• 表示: Presentation Layer に分割

• 操作: UseCase に切り出して呼び出すだけ

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

Copyright © 2014 Sansan, Inc. All rights reserved.

Layers

17

Presentation Layer

Application Layer

Domain Layer

Infrastructure Layer

View Presenter

Activity

Entity UseCase

DB Network

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

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

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

Copyright © 2014 Sansan, Inc. All rights reserved.

データの流れ、 View の更新方法を整理

19

• モデルの変更は別スレッドで行う

• View はモデル( Store )からの変更通知を受けて表示を更新する( Action が View を直接編集しない)

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

Copyright © 2014 Sansan, Inc. All rights reserved.

簡単なアプリで考える

20

• 仕様

• サーバ上のデータを TextView に表示する

• 処理

• ローカルにキャッシュがあれば、先にそれを表示する

• サーバからデータが取得できたら

• TextView に反映する

• 値をキャッシュしておく

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

21

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

22

→   Presenter に切り出せる

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

23

→   UseCase に切り出せる

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

24

色んな場所でView を更新している!!

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

25

Action ( UseCase )が 表示を更新している!

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

26

色んな場所でView を更新している!!

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

27

色んな場所でView を更新している!!

モデルの変更通知を受けて更新すべき

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

Copyright © 2014 Sansan, Inc. All rights reserved.

モデルの変更通知を受けて View を更新する…

28

• SharedPreference• OnSharedPreferenceChangeListener

• BehaviorSubject• onNext → subscribe

• Realm• Finegrained notifications

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

Copyright © 2014 Sansan, Inc. All rights reserved.

モデルの変更通知を受けて View を更新する…

29

• SharedPreference• OnSharedPreferenceChangeListener

• BehaviorSubject• onNext → subscribe

• Realm• Finegrained notifications

データの保存場所に依存せず、View に Entity を提供したい

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

Copyright © 2014 Sansan, Inc. All rights reserved.

モデルの変更通知を受けて View を更新する…

30

• SharedPreference• OnSharedPreferenceChangeListener

• BehaviorSubject• onNext → subscribe

• Realm• Finegrained notifications

データの保存場所に依存せず、View に Entity を提供したい

Storeの導入

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

Copyright © 2014 Sansan, Inc. All rights reserved.

Store

31

• View は Store からの更新を受けて更新するだけ

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

Copyright © 2014 Sansan, Inc. All rights reserved.

Store

32

• View は Store からの更新を受けて更新するだけ

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

Copyright © 2014 Sansan, Inc. All rights reserved.

ObjectStore を定義

33

• 値を取得する

• 値の変更を Observable で受け取る

• これらの実装クラスを作成し、View はこの実装クラスだけを監視して、更新があったら反映するだけ

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

34

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

35

Action ( UseCase )が 表示を更新している!×

不要

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

Copyright © 2014 Sansan, Inc. All rights reserved.

例)

36

Action ( UseCase )が 表示を更新している!×

不要

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

Copyright © 2014 Sansan, Inc. All rights reserved.

Before / After

37

TextView

SharedPref.

初期化時に取得・反映

UseCase

※ サーバからの取得処理反映

反映

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

Copyright © 2014 Sansan, Inc. All rights reserved.

Before / After

38

TextViewStoreUseCase

TextView

SharedPref.

初期化時に取得・反映

UseCase

※ サーバからの取得処理反映

反映

SharedPref.

反映

反映

監視

反映

監視

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

Copyright © 2014 Sansan, Inc. All rights reserved. 39

スッキリ!

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

Copyright © 2014 Sansan, Inc. All rights reserved.

補足

40

• 更新通知には rx.Observable を使ってます

• Kotlin 使うと Rx 周りはとてもシンプルに書けます

• 1 つの値を保持する ObjectStore だけでなく、集合を保持する ArrayStore も用意しています

• デグレを支えてくれるテストチームさまさま m(__)m

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

Copyright © 2014 Sansan, Inc. All rights reserved. 41

Fin.