Submit Search
Upload
画面状態を抽象化してテスタブル設計ライフを送ろう
•
3 likes
•
2,656 views
Hiroshi Kikuchi
Follow
Shibuya.apk #17で発表した(する)内容です。
Read less
Read more
Technology
Report
Share
Report
Share
1 of 32
Download now
Download to read offline
Recommended
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
gree_tech
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
NTT DATA Technology & Innovation
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
20220319_新卒から活躍し続けるエンジニアが大切にしている5つのこと
20220319_新卒から活躍し続けるエンジニアが大切にしている5つのこと
LIFULL Co., Ltd.
UniRx完全に理解した
UniRx完全に理解した
torisoup
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
BIGLOBE Inc.
Modern C# Programming 現代的なC#の書き方、ライブラリの選び方
Modern C# Programming 現代的なC#の書き方、ライブラリの選び方
Yoshifumi Kawai
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
Recommended
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
WFSにおけるCloud SpannerとGKEを中心としたGCP導入事例の紹介
gree_tech
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
バイトコードって言葉をよく目にするけど一体何なんだろう?(JJUG CCC 2022 Spring 発表資料)
NTT DATA Technology & Innovation
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
20220319_新卒から活躍し続けるエンジニアが大切にしている5つのこと
20220319_新卒から活躍し続けるエンジニアが大切にしている5つのこと
LIFULL Co., Ltd.
UniRx完全に理解した
UniRx完全に理解した
torisoup
ドメイン駆動設計 失敗したことと成功したこと
ドメイン駆動設計 失敗したことと成功したこと
BIGLOBE Inc.
Modern C# Programming 現代的なC#の書き方、ライブラリの選び方
Modern C# Programming 現代的なC#の書き方、ライブラリの選び方
Yoshifumi Kawai
できる!並列・並行プログラミング
できる!並列・並行プログラミング
Preferred Networks
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
正しいものを正しくつくる
正しいものを正しくつくる
toshihiro ichitani
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くない
Carnot Inc.
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
健一 辰濱
今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編
VirtualTech Japan Inc./Begi.net Inc.
TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。
tak9029
「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことか
Yoshiki Hayama
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jp
kyon mm
DynamoDBの初心者に伝えたい初めて触るときの勘所
DynamoDBの初心者に伝えたい初めて触るときの勘所
Ryo Sasaki
【Unite Tokyo 2018】XRで心地よい3D体験を生むための、絵画的空間構成手法とUnityへの実装
【Unite Tokyo 2018】XRで心地よい3D体験を生むための、絵画的空間構成手法とUnityへの実装
UnityTechnologiesJapan002
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
Amazon Web Services Japan
ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修
akkuma
Goのシンプルさについて
Goのシンプルさについて
pospome
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
Shota Imai
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
Yahoo!デベロッパーネットワーク
Addressables で大量のリソース管理・困りどころと解消法
Addressables で大量のリソース管理・困りどころと解消法
Kenta Nagai
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
Hajime Fujita
Android Developer Toolsのバグを見つけて直してもらった話
Android Developer Toolsのバグを見つけて直してもらった話
Hiroshi Kikuchi
今更聞けない? Androidのテストのいろは
今更聞けない? Androidのテストのいろは
Hiroshi Kikuchi
More Related Content
What's hot
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
Takuya Sato
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
正しいものを正しくつくる
正しいものを正しくつくる
toshihiro ichitani
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くない
Carnot Inc.
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
健一 辰濱
今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編
VirtualTech Japan Inc./Begi.net Inc.
TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。
tak9029
「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことか
Yoshiki Hayama
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
Game Tools & Middleware Forum
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jp
kyon mm
DynamoDBの初心者に伝えたい初めて触るときの勘所
DynamoDBの初心者に伝えたい初めて触るときの勘所
Ryo Sasaki
【Unite Tokyo 2018】XRで心地よい3D体験を生むための、絵画的空間構成手法とUnityへの実装
【Unite Tokyo 2018】XRで心地よい3D体験を生むための、絵画的空間構成手法とUnityへの実装
UnityTechnologiesJapan002
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
Amazon Web Services Japan
ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修
akkuma
Goのシンプルさについて
Goのシンプルさについて
pospome
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
Shota Imai
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
Yahoo!デベロッパーネットワーク
Addressables で大量のリソース管理・困りどころと解消法
Addressables で大量のリソース管理・困りどころと解消法
Kenta Nagai
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
Hajime Fujita
What's hot
(20)
設計と実装で 抑えておきたい サービスクラスと例外
設計と実装で 抑えておきたい サービスクラスと例外
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
正しいものを正しくつくる
正しいものを正しくつくる
ChatGPTは思ったほど賢くない
ChatGPTは思ったほど賢くない
知っておきたいFirebase の色んな上限について
知っておきたいFirebase の色んな上限について
今さら聞けない人のためのGitLabの始め方 Ubuntu編
今さら聞けない人のためのGitLabの始め方 Ubuntu編
TensorFlowで会話AIを作ってみた。
TensorFlowで会話AIを作ってみた。
「顧客の声を聞かない」とはどういうことか
「顧客の声を聞かない」とはどういうことか
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
FINAL FANTASY XVにおけるPhoton利用事例 - Photon運営事務局 GTMF 2018 OSAKA / TOKYO
Pythonによる黒魔術入門
Pythonによる黒魔術入門
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jp
DynamoDBの初心者に伝えたい初めて触るときの勘所
DynamoDBの初心者に伝えたい初めて触るときの勘所
【Unite Tokyo 2018】XRで心地よい3D体験を生むための、絵画的空間構成手法とUnityへの実装
【Unite Tokyo 2018】XRで心地よい3D体験を生むための、絵画的空間構成手法とUnityへの実装
Infrastructure as Code (IaC) 談義 2022
Infrastructure as Code (IaC) 談義 2022
ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修
Goのシンプルさについて
Goのシンプルさについて
ChatGPT 人間のフィードバックから強化学習した対話AI
ChatGPT 人間のフィードバックから強化学習した対話AI
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
深層学習による自然言語処理入門: word2vecからBERT, GPT-3まで
Addressables で大量のリソース管理・困りどころと解消法
Addressables で大量のリソース管理・困りどころと解消法
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
トップエンジニアが実践する思考整理法~テクニカルライティングを用いた課題解決の基本
More from Hiroshi Kikuchi
Android Developer Toolsのバグを見つけて直してもらった話
Android Developer Toolsのバグを見つけて直してもらった話
Hiroshi Kikuchi
今更聞けない? Androidのテストのいろは
今更聞けない? Androidのテストのいろは
Hiroshi Kikuchi
新規Androidアプリ開発において何より大切なこと
新規Androidアプリ開発において何より大切なこと
Hiroshi Kikuchi
モバイルアプリ開発をグッと楽にするKotlinの便利なところ3選
モバイルアプリ開発をグッと楽にするKotlinの便利なところ3選
Hiroshi Kikuchi
JUnit5とAndroidのテスト
JUnit5とAndroidのテスト
Hiroshi Kikuchi
KotlinJSって正直どうなん
KotlinJSって正直どうなん
Hiroshi Kikuchi
テストコードをアプリケーションコードと同じ階層に置きたい
テストコードをアプリケーションコードと同じ階層に置きたい
Hiroshi Kikuchi
Android thingsやってみた
Android thingsやってみた
Hiroshi Kikuchi
どうしてコードはレガシーになるのか
どうしてコードはレガシーになるのか
Hiroshi Kikuchi
Androidの世界を離れて異文化留学してみた
Androidの世界を離れて異文化留学してみた
Hiroshi Kikuchi
なるべくコードを書かないAndroid開発
なるべくコードを書かないAndroid開発
Hiroshi Kikuchi
開発チームにKotlinを導入した話
開発チームにKotlinを導入した話
Hiroshi Kikuchi
3分で作る Kotlin Friendly な API
3分で作る Kotlin Friendly な API
Hiroshi Kikuchi
Designing Auto Generated Codes
Designing Auto Generated Codes
Hiroshi Kikuchi
C#でiPhone & Androidアプリ!
C#でiPhone & Androidアプリ!
Hiroshi Kikuchi
Ideatter : Tech-on2011決勝でのプレゼン資料
Ideatter : Tech-on2011決勝でのプレゼン資料
Hiroshi Kikuchi
More from Hiroshi Kikuchi
(16)
Android Developer Toolsのバグを見つけて直してもらった話
Android Developer Toolsのバグを見つけて直してもらった話
今更聞けない? Androidのテストのいろは
今更聞けない? Androidのテストのいろは
新規Androidアプリ開発において何より大切なこと
新規Androidアプリ開発において何より大切なこと
モバイルアプリ開発をグッと楽にするKotlinの便利なところ3選
モバイルアプリ開発をグッと楽にするKotlinの便利なところ3選
JUnit5とAndroidのテスト
JUnit5とAndroidのテスト
KotlinJSって正直どうなん
KotlinJSって正直どうなん
テストコードをアプリケーションコードと同じ階層に置きたい
テストコードをアプリケーションコードと同じ階層に置きたい
Android thingsやってみた
Android thingsやってみた
どうしてコードはレガシーになるのか
どうしてコードはレガシーになるのか
Androidの世界を離れて異文化留学してみた
Androidの世界を離れて異文化留学してみた
なるべくコードを書かないAndroid開発
なるべくコードを書かないAndroid開発
開発チームにKotlinを導入した話
開発チームにKotlinを導入した話
3分で作る Kotlin Friendly な API
3分で作る Kotlin Friendly な API
Designing Auto Generated Codes
Designing Auto Generated Codes
C#でiPhone & Androidアプリ!
C#でiPhone & Androidアプリ!
Ideatter : Tech-on2011決勝でのプレゼン資料
Ideatter : Tech-on2011決勝でのプレゼン資料
Recently uploaded
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
FumieNakayama
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
akihisamiyanaga1
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
博三 太田
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
FumieNakayama
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
Hiroshi Tomioka
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
sugiuralab
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
UEHARA, Tetsutaro
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
Yuki Kikuchi
Recently uploaded
(8)
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
画面状態を抽象化してテスタブル設計ライフを送ろう
1.
画面状態を抽象化してテスタブル設計ライフ を送ろう kikuchy
2.
Who? @kikuchy 菊池紘 株式会社Diverse (ミクシィグループ) テストの大切さは知っているけれど腰が重い
3.
突然ですが こんなコードに出くわしたことはないですか
4.
var page =
1 var isLoading = false var hasBeenReachedPageEnd = false var isInitialLoading = true fun showData(data: Data) { page++ hasBeenReachedPageEnd = checkPageEnd(data) adapter.setDataAndNotifyChanged(data) } if (!isLoading && !hasBeenReachedPageEnd) { repository .getData() .subscribe(object: Observer { override fun onNext(data: Data) { showData(data) } override fun onStart() { isLoading = true; showProggress(isInitialLoading) } override fun onComplete() { isLoading = false; hideProgress(isInitialLoading); isIlitialLoading = false } }) }
5.
複数フラグで状態管理= 終わりの始まり
6.
booleanのフラグが3つあるとして、とり得る状態は本当に8通りな のか? 実際は5通りくらいだったりする あり得ない状態を考慮できてしまうのは混乱の元 いつ/どこでフラグいじる?問題 どこで変更するの? どこで参照するの? いま変更して大丈夫なの? Activity / Fragmentに生えたメンバ変数は実質グローバル変数
7.
8.
こんな地獄を防ぐには 状態を列挙 状態の操作をできる場所を制限 状態が正しく切り替わっているか確認 状態をオブジェクトで管理して 挙動のテストを書く!
9.
ちゃんと考えよう
10.
前提 APIからとってきた情報を表示するアプリ ‑> 通信状況≒ 画面の状態 暗黙的に期待されている機能は洗い出せているとする 読み込み中の表示 再読込 ページング 失敗時の表示
11.
作例 DroidKaigi 2017のStargazersを表示する https://github.com/kikuchy/ScreenStateIsModelSample
12.
いきなりページングする画面のことを考えるのはしんどいので 簡単な状態のものからステップアップして考えていきます
13.
状態 ページングなし、再取得なし、読んだ情報を表示するだけの画面 読み込みしていない[初期状態] 読み込み中 読み込み成功(with 読み込めたデータ) 読み込み失敗(with エラー内容)
14.
sealed class State
{ // 読み込みしていない object NeverFetched : State() // 読み込み中 object Fetching : State() // 読み込み成功 data class Success(val data: Data) : State() // 読み込み失敗 data class Failure(val error: Throwable) : State() }
15.
状態遷移 遷移を考える どの状態からどの状態へ遷移可能なのか どんな操作によって遷移が起こるのか 操作を受け付けられない状態であったら無視することにす る
16.
図 +--------------+ | NeverFetched | +--------------+ | |
fetch v +----------+ | Fetching | +----------+ | | (読み込みが終わったら自動で遷移) +--------------------- | | v v +---------------+ +----------------+ | Success(data) | | Failure(Error) | +---------------+ +----------------+
17.
状態の管理場所を作る 状態遷移モデルなので、 モデルと呼ぶ ステートマシンと呼んだ方がしっくり来る人もいる 状態の変更はモデル外部で受け取ってもらう必要がある 今回はRxJavaを使用 自前でObserverパターンを実現できればそれでも良い モデル内部では現在の状態を保持している必要がある 通知も同時にできるBehaviorSubjectが適任
18.
class Model(private val
repository: Repository) { // 状態を保持するメンバ代わり。通知役も兼ねる。 private val stateHolder = BehaviorSubject .createDefault<State>(State.NeverFetched) // 外にはObservableとして公開 val stateObservable: Observable<State> get() = stateHolder
19.
private fun fetchRepo()
{ // 読み込みが始まるときに、読み込み中状態にする。 stateHolder.onNext(State.Fetching) repository.getData().subscribe({ data -> // 読み込み成功 stateHolder.onNext(State.Success(data)) }, { error -> // 読み込み失敗 stateHolder.onNext(State.Failure(error)) }) } fun fetch() { // NeverFetched状態でなければ要求を無視する when (stateHolder.value) { is State.NeverFetched -> fetchRepo() else -> return } } }
20.
図のとおりになっているはず +--------------+ | NeverFetched | +--------------+ | |
fetch v +----------+ | Fetching | +----------+ | | (読み込みが終わったら自動で遷移) +--------------------- | | v v +---------------+ +----------------+ | Success(data) | | Failure(Error) | +---------------+ +----------------+
21.
ステップアップ
22.
再読込もページングもする画面の状態 読み込みしていない[初期状態] 読み込み中 (with ページ番号、今までに読み込んだアイテム) 読み込み成功(with
ページ番号、アイテム+ 新しいアイテム) 読み込み失敗(with ページ番号、エラー、アイテム) ページ終端(with アイテム+ 新しいアイテム) 読み込みに失敗してページ終端に到達することはない 操作 次のページを読み込む 読み込みに成功したらアイテムを増やし、ページ番号を増やす 再読込 抱えてるアイテムを破棄して、ページ番号を1に戻す
23.
24.
感覚はわかったと思うのでコードは省略
25.
テスト ちゃんと遷移できているかをテスト 画面にどう反映するかはモデルの関心事ではない テストすることはそこまで多くないから気が重くならない ※もちろん、モデルの複雑さによります
26.
画面とつなぐ 使ってみたかったのでLiveDataでイベントを流す RxLifrcycleを使えればそれでもよい LiveDataのObserverが表示を制御するようにする RecyclerViewのAdapter君 エラー用のSnackBar表示する君 読み込み中インジケーター表示する君 など 個別なので管理がすごく楽
27.
よかったこと 基本的なところは楽にテスト書ける 画面を作る前に動作確認できた テストするうちに抜けていた状態に気づくこともある どこに新しい機能を置けば良いのか悩まなくていい 少なくとも、状態と表示、どちらのことなのかは悩まないはず 1ファイルあたりのコード少なくて感動する モデルがライフサイクルを超えて生き残ってくれれば、Activity / Fragmentが表示された瞬間に以前の状態が復元される 各種アーキテクチャパターンに発展可能
28.
大変だったこと クラスは多い べた書きに比べれば初期開発の時間はかかる 慣れないと大変 暗黙的に期待されている状態を洗い出すのが一番大変 githubのREST API辛くないすか ヘッダのパース面倒とか rate limit引っかかって死ぬとか
29.
Activity / Fragmentが重くてお困りの方 まずは画面の状態を別クラスで 管理するところから始めてみては?
30.
ちなみに このアーキテクチャは弊社サービスYYCのiOS版(開発中)から ヒントを得て作りました Special thanks iOSチームのみなさま
31.
https://github.com/kikuchy/ScreenStateIsModelSample
Download now