会社でKotlin勉強会(第22回)を開催した

今週は第22回を開催しました。

 

前回の様子はコチラ↓

kdnakt.hatenablog.com

 

 

[第22回の様子]

2020/07/15に第22回を開催した。

 

参加メンバーは自分を含めて5人。前回まではここしばらく3人でこぢんまりと開催していたが、学習コンテンツが練習問題形式に変更となったこともあって、久しぶりにあーでもないこーでもないと、わいわい楽しく学べたと思う。

 

勉強会本編の内容としては、 練習問題集Kotlin Koansの第1章 IntroductionのHello, world!からNullable typesまでの7節を完了し、画面上での進捗は18%となった。

今回の範囲の問題傾向として、Javaで書かれたコードをKotlinで書き直そう、という内容のものが多かった。画面上でJavaのコードが表示されているせいか、そちらの実装方法を意識するあまり、Javaをそのまま記述してしまいコンパイルエラーとなる場面もしばしばあった。半年ほど多少コードを書き換えながらKotlinを学んできたとはいえ、やはり本格的に数行ロジックを書いてみて、また違う経験が得られて良かった。

 

[学んだことや疑問点]

  • Hello, world!
    • 練習問題の解き方を学ぶ回
    • 右側に問題文、真ん中に問題のコードが表示されている
    • 解答となるコードを入力して実行ボタンをクリックするとテストが実行されて結果がわかるようになっている
    • サクッと下記の2パターン実装して正解できた
// 問題のコード:"OK"を返すように実装する
fun start(): String = TODO()

// 解答1
fun start(): String = "OK"

// 解答2
fun start(): String {
    return "OK"
}
  • Named arguments
    • Collection#joinToStringメソッドの名前付き引数かつデフォルト引数を利用して解く問題
    • それほど迷わずサクッと正解できた
  • Default arguments
    • デフォルト引数を利用すると、Javaオーバーロードするためにたくさんメソッド定義していたのが不要になるよ、という問題
    • 言われてみればたしかにそうなのだが、改めてKotlinのコードのがスッキリしていて読みやすいと感じた
  • Lambdas
    • collection.any { ... }のLambda 式を実装する問題
    • 偶数を含むかどうかなので、2で割った余りが0になるかどうか、という判定をすればいいはずなのだが、間違ってcollection.any { it / 2 == 0 }(2で割ったら結果が0になるかどうか)と実装したところ、テストが通ってしまった
    • 勉強会後に、参加メンバーの1人がテストの内容をGitHubでみつけてくれたが、なぜこの実装でテストが通るのかは謎(サイトにデプロイされているテストとGitHubのmasterブランチの内容が異なる?)
    • テスト条件が十分でないことは一目瞭然だが......
  • Strings
    • Stringテンプレートを"""〜"""という形で利用できるというのはKotlin by Exampleでは出てこなかった内容のような気がする
    • とはいえ単なる正規表現の問題なのでサクッと実装してテストはパスした
    • これはJava 13で同様のテキストブロック機能があるのは知っていたが、ちゃんと使ったのは初めてだったので勉強になった
  • Data classes
    • データクラスについて、Javaのコードを比較しながら実装すると、Kotlinの方が行数もとても少なく読みやすいことを実感できた
    • Java 14で同様のrecord型が導入されているので、こちらもいつか試してみたい
  • Nullable types
    • サンプルのJavaの内容につられて、ついgetterを使ってしまいコンパイルエラーになった
    • Kotlinの場合classのプロパティにはそのままuser.nameのようにアクセスできるのを忘れていた
    • 本題であるNullable typesのプロパティアクセスの際にuser?.nameのように?を利用するのはちゃんと覚えていたのでヨシ
class User(val name: String, val age: Int)

fun main() {
    val user = User(name="John", age=30)
    println("name = ${user.name}, age = ${user.age}")
    // name = John, age = 30
}

 

 

[まとめ]

今回から 練習問題集Kotlin Koansが始まった!たくさん正解できて、やったー!

 

最初は簡単な問題が多いとはいえ、一気に18%も進んでしまった。

あと1ヶ月もしたら違う勉強会のネタを探さなければいけないのでは……?と頭が痛い。勉強会の一番最初にやろうとして断念したHands-Onに着手してみようか。環境構築が大変そうだけど、Gitpodとか使えばいい感じにできるだろうか。1ヶ月のうちに準備しておかねば。

www.gitpod.io