今週は第53回を開催しました!
引き続きKotlin Hands-onをすすめています。
前回の様子はコチラ↓
[第53回の様子]
2021/2/26に第53回を開催した。
通常水曜日に実施しているが、今週は他のミーティングがある参加者が多かったので金曜日の開催となった。
参加メンバーは自分をいれて3名。やや少なめか。今回は自分はナビゲータ役を担当した。
勉強会本編の内容としては、ひき続きIntroduction to Coroutines and Channelsハンズオンを進めた。第4章 Using suspend functions
のタスクを実施したところまでで時間切れとなった。4章の半分くらいまで終わったはず。
[学んだことや疑問点]
- Introduction to Coroutines and Channels: 4. Using suspend functions
interface GitHubService { @GET("orgs/{org}/repos?per_page=100") suspend fun getOrgRepos( @Path("org") org: String ): Response<List<Repo>> @GET("repos/{owner}/{repo}/contributors?per_page=100") suspend fun getRepoContributors( @Path("owner") owner: String, @Path("repo") repo: String ): Response<List<User>> }
- 今回のタスクは、以下の
loadContributorsSuspend()
関数を実装すること
suspend fun loadContributorsSuspend(service: GitHubService, req: RequestData): List<User> { // TODO }
- 第2章で実装した
Call
オブジェクトを返すGitHubService
のメソッドを利用したバージョンをコピーして、ちょっと書き換えたら実装はおわり Call.execute()
がResponse
オブジェクトを返すので、ちょうど今回追加したgetOrgRepos()
と戻り値の型が同じになる
suspend fun loadContributorsSuspend(service: GitHubService, req: RequestData): List{ val repos = service // これが第2章で実装したやり方。 // .getOrgReposCall(req.org).execute() .getOrgRepos(req.org) .also { logRepos(req, it) } .bodyList() return repos.flatMap { repo -> service // これが第2章で実装したやり方。 // .getRepoContributorsCall(req.org, repo.name).execute() .getRepoContributors(req.org, repo.name) .also { logUsers(repo, it) } .bodyList() }.aggregate() }
Call.execute()
の呼び出しがなくなる分、コードが短くなって読みやすくなった。- 「スレッドをブロックする」かわりに「Coroutineを中断する」ようになるらしい。
- 結局Coroutineがなんなのかよくわからないが、軽量なスレッドと説明されることが多いようだ
[まとめ]
モブプログラミング・スタイルで、Introduction to Coroutines and Channelsハンズオンを進めた。
suspend関数が登場したものの、具体的な使い方やスレッドとの違いなどはよくわからなかった。次回が楽しみ!
今週の進捗は以下のプルリクエストにまとまっている。