
今週は第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関数が登場したものの、具体的な使い方やスレッドとの違いなどはよくわからなかった。次回が楽しみ!
今週の進捗は以下のプルリクエストにまとまっている。