読者です 読者をやめる 読者になる 読者になる

vaguely

和歌山に戻りました。ふらふらと色々なものに手を出す毎日。

Kansai.kt #1で発表してきました

はじめに

7/9に開催されたKansai.ktで、Null安全について発表してきました。

kansai-kt.connpass.com

speakerdeck.com

トーク

今回は自分を含めて3/4が初心者向け、ということでそれぞれDelegateや継承、コレクション、kaptとバラエティに富んでいながら、基礎的な話から紹介していただけたので、内容を元にこれまで書いたコードを見直したいなぁ、という気持ちが高まってきました。
またLTについてもAnko DSLやExposeなど、「こんなのもあるのか」と参考になりました。

特にSealed Classはトークで紹介された内容と合わせて積極的に取り込んでいきたいです。

しかしこういう勉強会は、たくさんの方のお話を聞いたり(今回はできませんでしたが)他の参加者の方とお話をしたりというのがメインの目的でありつつも、聞いた内容を使ってすぐ自分でコード書いたり、これまでのものを直したりしたくなるのが悩みどころですねw

自分のトークについて

実は今回、このような勉強会では初の20分トークであったのですが、緊張のためもあって14分足らずで終了してしまいました。
LTとは違って時間が少し長いため、内容をぎゅうぎゅう詰めにするとマズイ、とわかってはいたのですが、ほとんど実際には調整できず...。

とはいえLTだとさっと飛ばさざるを得ない、紹介する話の前提部分(今回だとKotlinにはNull許容型と非Null許容型の変数が存在すること、Kotlinにもぬるぽは存在することなど)にも時間を使ってお話できたことは良い経験だったと思います。
あとネタ部分もw

今から思えば、例えばElvis演算子 "?:" を使った場合と、 "if(x != null)" でNullチェックして値を入れる場合とでどっちが早いか?とか、"?"演算子の内部実装(どのように変数がNullかを確認しているのか)などを検証したり、より突っ込んで調べたりできると良かったのかな、とは感じます。

主催者でもあるたくじさんにフォローしていただけたり、参加者の皆さんに温かく見守っていただいたりと「ありがてぇ...ありがてぇ...」という気持ちが印象強く残っています。

あまり一人の方のお名前を出すのもアレですが、たくじさんが一番前で話を聞きながら大きく頷いてくれるのは、とても安心感があります。
自分も他の方のお話を聞きながら頷くってことをしたいなとは思うのですが、どうしてもメモやら内容のツイートやらに追われてしまって...。

資料は後で公開していただけることがほとんどですし、いっそメモを取るのも諦めてもっと話を聞く方に集中した方が良いのかもしれませんね。

Null安全について

今回のテーマであるNull安全ですが、実はKotlinに初めて触った時からモヤッとしているところではありました。
ぬるぽを撲滅できる、という話だったのに発生するし(Nullの変数に"!."をつけてアクセスしたため)、”?”演算子を本当に全てのNull許容型の変数に使うべきなのか?ということも気になっていました。

今回の発表のために調べたことで、Smart Cast(今回の場合はコードの処理からNullでないことが保証されれば、非Null許容型と同じように扱うことができる)やElvis演算子によってコードが安全かつシンプルに書ける、というKotlinの強みに触れられましたし、それを使ってアプリのコードをリファクタリングできるな、とも思いました。

あと発表内でも言いましたが、以下の2つのコードで、"if(x != null)" でNullチェックをする方が、"?."を使ったCode2 の方が(微々たる差ではあるものの)早い、というのは意外な感じがしました。

var nullableText:  String? = "Not null"
var nullableNum1: Int? = null
var nullableNum2: Int? = null
var nullableNum3: Int? = null
var nullableNum4: Int? = null
var nullableNum5: Int? = null
var nullableNum6: Int? = null
var nullableNum7: Int? = null
var nullableNum8: Int? = null
var nullableNum9: Int? = null
var nullableNum10: Int? = null

// どちらもnullableTextがNullならNullを、
// そうでなければnullableText.lengthの値をセットする.

// Code1
for(i in 0..100000){
    if(nullableText != null){
        nullableNum1 = nullableText.length
        nullableNum2 = nullableText.length
        nullableNum3 = nullableText.length
        nullableNum4 = nullableText.length
        nullableNum5 = nullableText.length
        nullableNum6 = nullableText.length
        nullableNum7 = nullableText.length
        nullableNum8: = nullableText.length
        nullableNum9 = nullableText.length
        nullableNum10 = nullableText.length
    }
}
// Code2
for(i in 0..100000){
    nullableNum1 = nullableText?.length
    nullableNum2 = nullableText?.length
    nullableNum3 = nullableText?.length
    nullableNum4 = nullableText?.length
    nullableNum5 = nullableText?.length
    nullableNum6 = nullableText?.length
    nullableNum7 = nullableText?.length
    nullableNum8 = nullableText?.length
    nullableNum9 = nullableText?.length
    nullableNum10 = nullableText?.length
}

この辺はKotlinの最適化処理の賜物なのかなぁ、と思います。

さいごに

次回は、今回の内容を踏まえてコードをリファクタリング → その時の知見をまとめられたら、と考えています。

会場をご提供いただいたはてな様、主催者の皆様、そして参加された方々、ありがとうございました。