SlideShare a Scribd company logo
1 of 13
Download to read offline
Android アプリ設計パターン入門 第7章 を
同じチームの人がもうちょっと語る
Tsuyoshi Yoshioka (@tsuyogoro)
Mercari Android Engineer
About me
Tsuyoshi Yoshioka (@tsuyogoro)
Android engineer (Mercari US pj)
Mercari, Inc
Chapter 4 (差分開発にみる設計アプローチ)
Mercari JP by
Chapter 7 (チームとアーキテクチャ )
Mercari US by
Example introduced in section 7
1. Layered architecture (4 layers)
2. Uni-directional data flow (with RxJava2)
3. Custom scope (Dagger2)
Base idea of layered architecture
View
ViewModel Service Repository
action: Completable
(fetch data)
action: Completable
(fetch data via API)
action: Completable
(set data in repository)
observeData: Flowable
(actually BehaviorProcessor)
observeXXX: Flowable
(calculate values)
observeXXX: Flowable
(calculate values for view)
Look “if actions complete or error”
Look “values”
Today’s topic : How’s in case of interactive view?
State changes
by user’s operation
Fields have dependencies
each other
Two types of state
● Domain state
○ 出品に関わるstate
○ 商品名、サイズ、配送方法 ...など、出品時にサーバへ送る重要な値から構成される
● View state
○ 表示に関する状態で、出品そのものには影響しない state
○ 例えば「ポップアップは一度ユーザが closeしたら、2度は出さない」といったユースケースで管
理すべき状態
ViewModel Service Respository
View state Domain stateSet input
Boundary of lifecycle
ViewModel Service Respository
View state Domain state
出品開始〜完了 (中断) が生存期間
Activity/Fragmentの
lifecycle
そして、Activityがいつ破壊されようが、再生成された時に
ViewModelへbindすることで即座に画面の状態が復元されるようにする
How?
ViewModel Service Respository
View state Domain state
出品開始〜完了 (中断) が生存期間
Activity/Fragmentの
lifecycle
(2) ここを BehaviorProcessor にする
(ただし外からonNextが呼べないように、interface は Flowable)
(1) この期間、DIに使うDagger componentが唯一のインスタ
ンスになるように管理する (Applicationクラスを活用)
The lifecycle of ViewModel (AAC)
https://developer.android.com/topic/libraries/architec
ture/viewmodel.html#lifecycle
Summary
● 7章のlayered architectureをInteractiveな画面に使う場合は、データの scopeを考える所から設計
していきましょう (domain / view)
● レイヤごとのライフサイクルをきちんと考えて、 Activity再生成に耐えられるような作りを実現してい
きましょう (Dagger2のcomponent / BehaviorProcessor)
● Repositoryまでデータを落とすという一見冗長な作りは、 Serviceレイヤによって逆に “scalableな作
り” になっている点がポイント
About section 4 (my article…)
● そんなわけで秘伝のタレたっぷりの日本市場向けのコードベース
● 只今絶賛改善中
● 何か特別なことをしている (Frameworkを作るなど) のではなく、どういうチームを作っていくかという
ことを全力で検討中。良いアーキテクチャを作る、とはそういう事なのかもしれませんね。
https://play.google.com/store/a
pps/details?id=tsuyogoro.sugo
rokuon&hl=ja
Sample of “Mercari US like architecture + AAC ViewModel”

More Related Content

Similar to 180320 Shibuya.apk - Android architecture pattern

ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計Tadayoshi Sato
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Akira Inoue
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介NilOne Ltd.
 
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...Shinji Takao
 
関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」Noritada Shimizu
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortemtamtam180
 
ARの教科書輪読会 第13章発表スライド
ARの教科書輪読会 第13章発表スライドARの教科書輪読会 第13章発表スライド
ARの教科書輪読会 第13章発表スライドWheetTweet
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2DToshiyuki Ienaga
 
SYSTEMI勉強会まとめ資料(React基礎まとめ)
SYSTEMI勉強会まとめ資料(React基礎まとめ)SYSTEMI勉強会まとめ資料(React基礎まとめ)
SYSTEMI勉強会まとめ資料(React基礎まとめ)YoshikiWatanabe1
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/AndroidセキュアコーディングMasaki Kubo
 
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略cch-robo
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークkenjis
 
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現インフラジスティックス・ジャパン株式会社
 
Spring2概論@第1回JSUG勉強会
Spring2概論@第1回JSUG勉強会Spring2概論@第1回JSUG勉強会
Spring2概論@第1回JSUG勉強会Mitsuhiro Okamoto
 
ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版Fumiya Sakai
 
NoSQLデータベースと位置情報
NoSQLデータベースと位置情報NoSQLデータベースと位置情報
NoSQLデータベースと位置情報Koji Ichiwaki
 
簡単AngularJS(関西AngularJS勉強会)
簡単AngularJS(関西AngularJS勉強会)簡単AngularJS(関西AngularJS勉強会)
簡単AngularJS(関西AngularJS勉強会)Takahiro Maki
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】Tomoharu ASAMI
 

Similar to 180320 Shibuya.apk - Android architecture pattern (20)

ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
 
All for verdy
All for verdyAll for verdy
All for verdy
 
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
Featuring Project Silk & Liike: 楽しい "モダン" Web 開発のちょっとディープなお話
 
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介中規模Androidアプリ開発の過程に生じた問題と対策の紹介
中規模Androidアプリ開発の過程に生じた問題と対策の紹介
 
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
情報システム障害解析のための知識グラフ構築の試み / Constructing a knowledge graph for information sys...
 
関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」関西FirefoxOS勉強会6thGiG「アプリ間通信」
関西FirefoxOS勉強会6thGiG「アプリ間通信」
 
jjugccc2018 app review postmortem
jjugccc2018 app review postmortemjjugccc2018 app review postmortem
jjugccc2018 app review postmortem
 
ARの教科書輪読会 第13章発表スライド
ARの教科書輪読会 第13章発表スライドARの教科書輪読会 第13章発表スライド
ARの教科書輪読会 第13章発表スライド
 
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
Next2Dで始めるゲーム開発  - Game Development Starting with Next2DNext2Dで始めるゲーム開発  - Game Development Starting with Next2D
Next2Dで始めるゲーム開発 - Game Development Starting with Next2D
 
SYSTEMI勉強会まとめ資料(React基礎まとめ)
SYSTEMI勉強会まとめ資料(React基礎まとめ)SYSTEMI勉強会まとめ資料(React基礎まとめ)
SYSTEMI勉強会まとめ資料(React基礎まとめ)
 
Java/Androidセキュアコーディング
Java/AndroidセキュアコーディングJava/Androidセキュアコーディング
Java/Androidセキュアコーディング
 
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
FlutterでのWidgetツリーへの状態伝播とアクセス制限の基本戦略
 
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワークCodeIgniter 〜 2008年大躍進のPHPフレームワーク
CodeIgniter 〜 2008年大躍進のPHPフレームワーク
 
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
Web アプリケーションにおけるクライアントサイドのデータハンドリングと可視化の実現
 
Spring2概論@第1回JSUG勉強会
Spring2概論@第1回JSUG勉強会Spring2概論@第1回JSUG勉強会
Spring2概論@第1回JSUG勉強会
 
ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版ReduxとSwiftの組み合わせ:改訂版
ReduxとSwiftの組み合わせ:改訂版
 
NoSQLデータベースと位置情報
NoSQLデータベースと位置情報NoSQLデータベースと位置情報
NoSQLデータベースと位置情報
 
簡単AngularJS(関西AngularJS勉強会)
簡単AngularJS(関西AngularJS勉強会)簡単AngularJS(関西AngularJS勉強会)
簡単AngularJS(関西AngularJS勉強会)
 
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
設計/ドメイン設計(3) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第25回】
 
図解 ngrx
図解 ngrx図解 ngrx
図解 ngrx
 

180320 Shibuya.apk - Android architecture pattern

  • 1. Android アプリ設計パターン入門 第7章 を 同じチームの人がもうちょっと語る Tsuyoshi Yoshioka (@tsuyogoro) Mercari Android Engineer
  • 2. About me Tsuyoshi Yoshioka (@tsuyogoro) Android engineer (Mercari US pj) Mercari, Inc
  • 3. Chapter 4 (差分開発にみる設計アプローチ) Mercari JP by Chapter 7 (チームとアーキテクチャ ) Mercari US by
  • 4. Example introduced in section 7 1. Layered architecture (4 layers) 2. Uni-directional data flow (with RxJava2) 3. Custom scope (Dagger2)
  • 5. Base idea of layered architecture View ViewModel Service Repository action: Completable (fetch data) action: Completable (fetch data via API) action: Completable (set data in repository) observeData: Flowable (actually BehaviorProcessor) observeXXX: Flowable (calculate values) observeXXX: Flowable (calculate values for view) Look “if actions complete or error” Look “values”
  • 6. Today’s topic : How’s in case of interactive view? State changes by user’s operation Fields have dependencies each other
  • 7. Two types of state ● Domain state ○ 出品に関わるstate ○ 商品名、サイズ、配送方法 ...など、出品時にサーバへ送る重要な値から構成される ● View state ○ 表示に関する状態で、出品そのものには影響しない state ○ 例えば「ポップアップは一度ユーザが closeしたら、2度は出さない」といったユースケースで管 理すべき状態 ViewModel Service Respository View state Domain stateSet input
  • 8. Boundary of lifecycle ViewModel Service Respository View state Domain state 出品開始〜完了 (中断) が生存期間 Activity/Fragmentの lifecycle そして、Activityがいつ破壊されようが、再生成された時に ViewModelへbindすることで即座に画面の状態が復元されるようにする
  • 9. How? ViewModel Service Respository View state Domain state 出品開始〜完了 (中断) が生存期間 Activity/Fragmentの lifecycle (2) ここを BehaviorProcessor にする (ただし外からonNextが呼べないように、interface は Flowable) (1) この期間、DIに使うDagger componentが唯一のインスタ ンスになるように管理する (Applicationクラスを活用)
  • 10. The lifecycle of ViewModel (AAC) https://developer.android.com/topic/libraries/architec ture/viewmodel.html#lifecycle
  • 11. Summary ● 7章のlayered architectureをInteractiveな画面に使う場合は、データの scopeを考える所から設計 していきましょう (domain / view) ● レイヤごとのライフサイクルをきちんと考えて、 Activity再生成に耐えられるような作りを実現してい きましょう (Dagger2のcomponent / BehaviorProcessor) ● Repositoryまでデータを落とすという一見冗長な作りは、 Serviceレイヤによって逆に “scalableな作 り” になっている点がポイント
  • 12. About section 4 (my article…) ● そんなわけで秘伝のタレたっぷりの日本市場向けのコードベース ● 只今絶賛改善中 ● 何か特別なことをしている (Frameworkを作るなど) のではなく、どういうチームを作っていくかという ことを全力で検討中。良いアーキテクチャを作る、とはそういう事なのかもしれませんね。