SlideShare a Scribd company logo
1 of 47
Download to read offline
Kyash Androidで
新しい画面を作る時の
コードの書き順
Kyash meetup #1
@konifar
設計自体の話もいいですが
とある設計の中で
他の人がどう書いているのか
気になりませんか?
今日話すこと
• Kyash Androidアプリで新しい画面を開発する
時に、自分がどういう順番で何を考えながら
コードを書いているのか。



※ 現状こうやってるよ、という話で改善点もあります。Kyashでは常に変化を
楽しみながら開発しています。
今日話さないこと
• MVVMの詳細な説明
• DataBindingの基本的な内容
• DI・Daggerの説明
• ユニットテストの書き方
• Jetpackなどを使った今後の展望
リアルカードを有効化する時
の画面を例に説明します。
※ 一部コードを変更しています
1. 閉じるボタン
2. スクロールしたら影がつ
くToolbar
3. カード発行済みかどうか
APIで取得して、発行済み
だったら表示を変えるレ
イアウト
4. タップしたら遷移するボ
タンとリンク
ViewModel
UseCase
Repository
View
API / Preference
ViewModel
UseCase
Repository
View
API / Preference
Activity.kt

Fragment.kt

activity.xml

fragment.xml
databinding
ViewModel.kt
CheckKyashCardExistsUseCase.kt
KyashCardRepository.kt
KyashApi.kt (Retrofit service)
ViewModel
UseCase
Repository
View
API / Preference
Activity.kt

Fragment.kt

activity.xml

fragment.xml
databinding
ViewModel.kt
CheckKyashCardExistsUseCase.kt
KyashCardRepository.kt
KyashApi.kt (Retrofit service)
データ取ってきて レイアウトに表示
データ取得とレイアウト表示
• どちらを先に実装するかは、APIとデザインの
どちらが先にできているかによる。
• APIが先にできていればデータ取得部分、デザ
インが先にあればレイアウトから作る。
• どちらもできていなかった場合はレイアウトか
ら雑に作っておく(Kyashではあまりない)
データ取得部分の実装順
• クラス依存のないところから作る。APIのクラ
スやメソッドがないとRepositoryを実装でき
ない(TDDでやる場合は別ですが)
• API => Repository => UseCase の順番。
KyashApi.kt
• Retrofitのインターフェースにリクエスト用のメソッドを追加。
• レスポンスやパラメータで新しいEntityが必要ならこのタイミ
ングで作っておく。
KyashCardRepository.kt
• nonceを取得して、それを使って別のAPIを叩く。

RxのflatMapを使ってAPIの直列化。
CheckKyashCardExistsUseCase.kt
• UseCaseは、Repositoryのメソッドの結果をビジネスロジックに沿った形
(今回だとBoolean)に加工する。

Rxだと加工しやすいので返り値はSingleやCompletableにしている。
_人人人人人人人人人_
> ここで初ビルド <
 ̄^Y^Y^Y^Y^Y^Y^ ̄
初めてのビルド
• ビルドが遅いので、データ取得部分はガッと
一気に書いてしまうことが多い。
• この例だとUseCaseにロジックが入っている
のでユニットテストもこのタイミングで書く。
レイアウト表示部分の実装順
• クラス依存のないところから作る。
• ViewModel => xml => Fragment => Activity
ViewModelの捉え方
• Viewの表示要素をプロパティに持つ。
• Viewからのアクション(ライフサイクルや
タップなど)をメソッドで実装する。
• どんなプロパティとアクションが必要かを頭
の中で整理しておく。
1. カード発行済みかどうかチェック
中のロード中表示のVisibility
2. 発行済みだった時のViewの
Visibility
3. 未発行だった時のViewのVisibility
表示要素となるプロパティ
ViewModel.kt - プロパティ
• コンストラクタには、カード発行済みかどうかをチェックするUseCaseと画面
遷移のためのNavigatorクラスをDaggerでInject。
• Viewの表示に必要なVisibilityのIntのプロパティを書く。この例ではVisibilityだ
けだが、表示するテキストのStringなどもViewModelに書いている。
1. onResumeでカード発行してい
るかどうかのチェック
2. タップしたら画面遷移
アクション
ViewModel.kt - onResume()
• ロードした結果によってプロパティを変更する。このプロパティをあとでdatabindingでxmlにバインドするぞーという気持ちで書く。
• ちなみに subscribeOnとobserveOnをここで両方やるのはあまりよくないと思っている。
_人人人人人人人人人人人_
> ここでテストを書く <
 ̄^Y^Y^Y^Y^Y^Y^Y^ ̄
データ取得と表示のテスト
• UseCaseをモックして、メソッドが呼ばれて
いるかをVerifyする。
• メソッドの返り値の結果(Singleのsuccessや
error)によって、プロパティの値が適切に変
更されているかをテストする。
ViewModel.kt - 閉じるボタン
• DataBindingのonClickでバインドするために、引数にはViewを渡す。
• Navigatorは現在のActivityの参照を持っていて、finishActivity() を呼ぶと
Activityが閉じる(Navigatorをひとつ作るやり方がいいかについては検討
の余地ありです)
• すでに画面遷移先がある場合にはnavigatorのメソッドを呼ぶようにする。
• まだできていない場合はTODOコメントだけ書いておく。
ViewModel.kt - ボタンとリンク
_人人人人人人人人人人人_
> ここでテストを書く <
 ̄^Y^Y^Y^Y^Y^Y^Y^ ̄
画面遷移のテスト
• Navigatorをモックして、適切なメソッドと引
数が呼ばれているかをVerifyすることで画面遷
移のテストを書く。
fragment.xml
• dataにViewModelを宣言。
• ここで必要になるので、ViewModelの方を先に書くようにしている。
fragment.xml - Toolbar
• Toolbar はstyleをセットするだけで影の有無、戻るボタンのアイコンなどを変
えられるようにしている。
• navigationOnClickListenerにViewModelのクリックイベントをセット。
• shadowAnimationScrollViewIdはお手製のBindingAdapterで、ScrollViewのid
をセットするとスクロールすると影がつく動きをつけられる。
ToolbarExt.kt
• 引数で渡されたレイアウトIDをもとにScrollViewを探して、スクロールしたらToolbar
のelevationを変えるようにしている。これに限らず、lottieのアニメーションなど
Viewの役割で共通化できそうなものは結構DataBindingでやるようにしている。
fragment.xml - 表示切り替え
_人人人人人人人人人_
> ここでビルド② <
 ̄^Y^Y^Y^Y^Y^Y^ ̄
2回目のビルド
• DataBindingはたまにどこが悪いのか全くわか
らないエラーを出してきてつらい。
• xmlにバインドしたあとで一度ビルドが通るよ
うにしておくと安心する。
Fragment.kt
Activity.kt
_人人人人人人人人人人人_
> ここで確認のビルド <
 ̄Y^Y^Y^Y^Y^Y^Y^Y ̄
デバッグメニュー
• 任意の画面をメニューから

開けるようにしている。
• とりあえず作った画面を

すぐに開いて確認したい時に

便利。
俺のコードの書き順まとめ
データ取得、レイアウト表示
のどちらから先に実装するか
はAPIとデザインどちらが
先行しているか次第
ビルドが遅いので
データ取得部分は一気に書く
表示部分はViewModelの
プロパティとアクション
に整理して書く
DataBindingで
つなげてビルドしてみて
エラーが出ないことを祈る
コードの書き方は
人それぞれ
設計されたアプリのコードを
実際にどう書いているのか
という紹介でした
ありがとうございました

More Related Content

Similar to Kyash Androidで 新しい画面を作る時の コードの書き順

.NET 7におけるBlazorの新機能
.NET 7におけるBlazorの新機能.NET 7におけるBlazorの新機能
.NET 7におけるBlazorの新機能TomomitsuKusaba
 
Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編Yasuhito Yabe
 
ユニバーサル Windowsプラットフォーム(UWP)アプリの開発と配布
ユニバーサル Windowsプラットフォーム(UWP)アプリの開発と配布ユニバーサル Windowsプラットフォーム(UWP)アプリの開発と配布
ユニバーサル Windowsプラットフォーム(UWP)アプリの開発と配布Tomokazu Kizawa
 
Go mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうGo mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうTakuya Ueda
 
「自分のとこでは動くけど…」を無くす devcontainer
「自分のとこでは動くけど…」を無くす devcontainer「自分のとこでは動くけど…」を無くす devcontainer
「自分のとこでは動くけど…」を無くす devcontainerYuta Matsumura
 
短期間+大規模ゲーム開発でも破綻しないHTML・SCSS
短期間+大規模ゲーム開発でも破綻しないHTML・SCSS短期間+大規模ゲーム開発でも破綻しないHTML・SCSS
短期間+大規模ゲーム開発でも破綻しないHTML・SCSSShogo Iwano
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけようKouji Matsui
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~normalian
 
LightSwitch 結局何ができるの
LightSwitch 結局何ができるのLightSwitch 結局何ができるの
LightSwitch 結局何ができるのYoshitaka Seo
 
楽しいゲーム開発管理
楽しいゲーム開発管理楽しいゲーム開発管理
楽しいゲーム開発管理Maki Koiwa
 
そこのスマホ開発者さん、Windows Phone どうですか?
そこのスマホ開発者さん、Windows Phone どうですか?そこのスマホ開発者さん、Windows Phone どうですか?
そこのスマホ開発者さん、Windows Phone どうですか?Kazuaki TAUCHI
 
ネイティブとHTML5を スマートに連携させる設計と 実装のノウハウについて
ネイティブとHTML5を スマートに連携させる設計と 実装のノウハウについてネイティブとHTML5を スマートに連携させる設計と 実装のノウハウについて
ネイティブとHTML5を スマートに連携させる設計と 実装のノウハウについてKazuaki Hidaka
 
Windows10とRaspberryPiで MakerFaireTokyoに参加
Windows10とRaspberryPiでMakerFaireTokyoに参加Windows10とRaspberryPiでMakerFaireTokyoに参加
Windows10とRaspberryPiで MakerFaireTokyoに参加Yuki Ando
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021Atsushi Nakamura
 
コードレビューを文化にするまでの取り組み.pdf
コードレビューを文化にするまでの取り組み.pdfコードレビューを文化にするまでの取り組み.pdf
コードレビューを文化にするまでの取り組み.pdfssuser5ddba11
 
NGN2012B 発表資料
NGN2012B 発表資料NGN2012B 発表資料
NGN2012B 発表資料Kenji Nagase
 

Similar to Kyash Androidで 新しい画面を作る時の コードの書き順 (20)

Android0422
Android0422Android0422
Android0422
 
.NET 7におけるBlazorの新機能
.NET 7におけるBlazorの新機能.NET 7におけるBlazorの新機能
.NET 7におけるBlazorの新機能
 
Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編Htmlコーディングの効率化 前編
Htmlコーディングの効率化 前編
 
ユニバーサル Windowsプラットフォーム(UWP)アプリの開発と配布
ユニバーサル Windowsプラットフォーム(UWP)アプリの開発と配布ユニバーサル Windowsプラットフォーム(UWP)アプリの開発と配布
ユニバーサル Windowsプラットフォーム(UWP)アプリの開発と配布
 
Go mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろうGo mobileでモバイルアプリを作ろう
Go mobileでモバイルアプリを作ろう
 
「自分のとこでは動くけど…」を無くす devcontainer
「自分のとこでは動くけど…」を無くす devcontainer「自分のとこでは動くけど…」を無くす devcontainer
「自分のとこでは動くけど…」を無くす devcontainer
 
短期間+大規模ゲーム開発でも破綻しないHTML・SCSS
短期間+大規模ゲーム開発でも破綻しないHTML・SCSS短期間+大規模ゲーム開発でも破綻しないHTML・SCSS
短期間+大規模ゲーム開発でも破綻しないHTML・SCSS
 
Win32 APIをてなずけよう
Win32 APIをてなずけようWin32 APIをてなずけよう
Win32 APIをてなずけよう
 
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
わんくま同盟名古屋勉強会18回目 ASP.NET MVC3を利用したHTML5な画面開発~クラウドも有るよ!~
 
Lt40
Lt40Lt40
Lt40
 
LightSwitch 結局何ができるの
LightSwitch 結局何ができるのLightSwitch 結局何ができるの
LightSwitch 結局何ができるの
 
楽しいゲーム開発管理
楽しいゲーム開発管理楽しいゲーム開発管理
楽しいゲーム開発管理
 
そこのスマホ開発者さん、Windows Phone どうですか?
そこのスマホ開発者さん、Windows Phone どうですか?そこのスマホ開発者さん、Windows Phone どうですか?
そこのスマホ開発者さん、Windows Phone どうですか?
 
ネイティブとHTML5を スマートに連携させる設計と 実装のノウハウについて
ネイティブとHTML5を スマートに連携させる設計と 実装のノウハウについてネイティブとHTML5を スマートに連携させる設計と 実装のノウハウについて
ネイティブとHTML5を スマートに連携させる設計と 実装のノウハウについて
 
Windows10とRaspberryPiで MakerFaireTokyoに参加
Windows10とRaspberryPiでMakerFaireTokyoに参加Windows10とRaspberryPiでMakerFaireTokyoに参加
Windows10とRaspberryPiで MakerFaireTokyoに参加
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
Developers Summit 2013【15-B-6】開発者の "資産形成" につながる Action とは?
 
コードレビューを文化にするまでの取り組み.pdf
コードレビューを文化にするまでの取り組み.pdfコードレビューを文化にするまでの取り組み.pdf
コードレビューを文化にするまでの取り組み.pdf
 
Infragistics Ultimate 2018 Vol.2最新機能
Infragistics Ultimate 2018 Vol.2最新機能Infragistics Ultimate 2018 Vol.2最新機能
Infragistics Ultimate 2018 Vol.2最新機能
 
NGN2012B 発表資料
NGN2012B 発表資料NGN2012B 発表資料
NGN2012B 発表資料
 

Kyash Androidで 新しい画面を作る時の コードの書き順