まえおき
Kotlin歴が一週間の自分が、Kotlinのコードをレビューするときに指摘していること - YusukeIwakiのブログ を書いたあと、 id:suzan2go からコメントをいただいて、
Idiomatic Kotlin. Best Practices.
のページの存在を知ることになった。
業務でも「新しく作っていくものはKotlinで!」ってなったので、本格的に触り始めた。実際さわりはじめて「お!これはKotlinがいいかも」って思えてきたものを幾つか紹介してみる。
ちなみになんだかんだでJavaのほうがIDEが(速度的に)優秀なので、わりとJavaで書いてKotlinに変換してるんだけど、それは内緒。
SharedPreferenceをDelegated Propertyでread/writeする
「×ボタンを押したら二度と出さないようにする」みたいな制御をやるときには、かんたんなキャッシュとしてSharedPreferenceをささっと使いたい。ただ、経験上、SharedPreferenceは「ラッパークラスを作れば作るほど複雑化して、結局SharedPreferenceを生で使うのが一番いい」ということになりがちだった。
けど、KotlinのDelegated Propertyで、BooleanPref, StringPref, IntPref, LongPref, ... などなどうっっっっすーーーーーーいラッパークラスを用意してやることで
class HogeCache(val context: Context) { private val prefs get() = context.getSharedPreferences("hoge", Context.MODE_PRIVATE) var dontShowBanner: Boolean by BooleanPref(prefs) }
みたいなクラスを作って
class HogeActivity: Activity { override fun onCreate(savedInstanceState: Bundle?) { ... buttonCloseBanner.setOnClickListener { _ -> hogeCache(this).dontShowBanner = true } if (hogeCache(this).dontShowBanner) { buttonCloseBanner.visibility = View.GONE }
みたいに書けるようになった。
可読性が上がって良いと思うので、適当にライブラリ化もしてみた。
(世の中には、↑をもっと汎用的にした chibatching/KotPref というライブラリもあったりする)
JSONArray#forEachを拡張関数で定義する
for (int i = 0; i < jsonArray.length(); i++) { JSONObject jsonObject = jsonArray.getJSONObject(i); ... }
をKotlinでバカ正直に書くと
for (i in 0 until jsonArray.length()) { JSONObject jsonObject = jsonArray.getJSONObject(i); ... }
みたいになる。
悪いコードじゃないんだけど、これでは可読性がやや低いと思う。
fun JSONArray.forEach(action: (JSONObject) -> Unit) { for (i in 0 until length()) { action(jsonArray.getJSONObject(i)); } }
という拡張関数を定義しておけば
jsonArray.forEach { jsonObject -> ... }
のようにスッキリ書けて、可読性が上がる。
まだ試したことはないけど、ViewGroupとかでも同じことが言えると思う。
まとめ
Kotlinは「○○みたいなときには便利」みたいなしくみがアホみたいにたくさんある。
相変わらずKotlinは嫌いだけど、少しずつ勉強していくと可読性の高いコードが書けるようになっていきそう。