kdnakt blog

hello there.

第60回Kotlin dojoを開催した

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

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

 

前回の様子はコチラ↓ 

kdnakt.hatenablog.com

 

 

[第60回の様子]

2021/4/14に第60回を開催した。今週はいつもどおり水曜日の開催。

 

参加メンバーは自分をいれて4名。前回からの入れ替わりが2名。

今回も自分はナビゲータ役で参加した。

 

勉強会本編の内容としては、ひき続きIntroduction to Coroutines and Channelsハンズオンを進めた。第7章 Showing progressのタスクの動作確認をしたり、答えあわせをしたり。

 

[学んだことや疑問点]

  • Introduction to Coroutines and Channels: 7. Showing progress
    • 前回できなかった動作確認をするところから。
    • とりあえずサイトにあるgif画像と同じような動きをしたので、実装に大きな問題はなさそう
    • 模範回答のsolutionを見てみると、いくつか違いがあった
    • 違い1:我々の解答は、getOrgRepos()でリポジトリ一覧を取得する際のチェーンの最後で拡張関数.bodyList()を利用していない
      • これはわざわざ拡張関数を使わなくても同じなので問題ない
    • 違い2:模範解答は、集計結果を格納する変数allUsersが再代入可能
    • 違い3:模範解答は終了フラグの実装がAtomicIntegerではなくList.withIndex()を利用して、indexがlastIndexと一致するかどうかで判定している
      • これは、メモリ効率的にも模範解答の方が良さそう
    • 問題は違い2の部分……testディレクトリ以下に、実は各タスクに対するテストケースが用意されていたことに気づいたので実行してみる。と、コンパイルエラーが出た
    • GitHubServiceインターフェースに、RetrofitのCallクラス非使用のメソッドを追加したので、その分の実装がMockGithubServiceに足りていないらしい。これは既に実装が用意されていたので、コメントアウトを外すだけで終了。
    • Request6ProgressKtTest.ktを再実行すると、今度は以下のようなエラーが出た
Wrong intermediate result after 3585: expected:<[User(login=user-2, contributions=50), User(login=user-1, contributions=50)]> but was:<[User(login=user-1, contributions=50), User(login=user-2, contributions=50)]>
Expected :[User(login=user-2, contributions=50), User(login=user-1, contributions=50)]
Actual   :[User(login=user-1, contributions=50), User(login=user-2, contributions=50)]
    • どうやらUserのソート順が違うらしい。ここではソート順関係ないはずなんだけどな……ということで違い2の部分を模範解答に合わせると、テストが通った
    • テストにはコメントアウトされている部分があった
    @Test
    fun testProgress() = runBlocking {
        val startTime = System.currentTimeMillis()
        var index = 0
        loadContributorsProgress(MockGithubService, testRequestData) {
            users, _ ->
            val expected = progressResults[index++]
            val time = System.currentTimeMillis() - startTime
            /*
            // TODO: uncomment this assertion
            Assert.assertEquals("Expected intermediate result after virtual ${expected.timeFromStart} ms:",
                expected.timeFromStart, time)
            */
            Assert.assertEquals("Wrong intermediate result after $time:", expected.users, users)
        }
    }
    • これはコメントアウトはずしてテストを実行してみたが、どうにも上手くいかなかったのでコメントアウトしたまま……。
    • MockGithubServiceの実装をみると、delayで一定秒数待機するようになってはいたものの、マシンの実行速度が遅いせいか期待値と完全には一致しなかった。まあこれは仕方ないやつ……。
    • ここで時間切れとなったので、第7章の最後の解説は来週確認することに。

 

[まとめ]

モブプログラミング・スタイルで、Introduction to Coroutines and Channelsハンズオンを進めた。

ナビゲータの何気ない一言のおかげで、テストコードの存在を思い出すことができた。テスト大事!

 

今週のプルリクエストはこちら。

github.com