第53回Kotlin dojoを開催した

f:id:kidani_a:20210227161153p:plain

今週は第53回を開催しました!

引き続きKotlin Hands-onをすすめています。

 

前回の様子はコチラ↓

kdnakt.hatenablog.com

 

 

[第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
    • suspend修飾子を使うとその下のスレッドをブロックせずにすむ
    • suspend修飾子のついたRetrofitのAPIはHTTP APIから取得したオブジェクトを返すか、あるいは例外を投げるようになる
    • 例外処理がめんどうなので、以下のようにResponse型の戻り値を利用する
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関数が登場したものの、具体的な使い方やスレッドとの違いなどはよくわからなかった。次回が楽しみ!

 

今週の進捗は以下のプルリクエストにまとまっている。

github.com