Kansai.kt #1で発表してきました
はじめに
7/9に開催されたKansai.ktで、Null安全について発表してきました。
トーク
今回は自分を含めて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の最適化処理の賜物なのかなぁ、と思います。
さいごに
次回は、今回の内容を踏まえてコードをリファクタリング → その時の知見をまとめられたら、と考えています。
会場をご提供いただいたはてな様、主催者の皆様、そして参加された方々、ありがとうございました。