Retty Tech Blog

実名口コミグルメサービスRettyのエンジニアによるTech Blogです。プロダクト開発にまつわるナレッジをアウトプットして、世の中がHappyになっていくようなコンテンツを発信します。

RettyとKotlinの歩み〜アプリからサーバサイドまで

RettyでAndroidエンジニアとして働いている福井 と サーバサイドエンジニアの石田です。 本日Googleから「AndroidでKotlin正式サポートする」と発表されました! 🎉🎉 そんなKotlinですが、弊社では去年2月頃からプロダクトに導入しています。今回はその歩みと一年以上使ってきた感想をご紹介します。

Androidでの導入事例

最初にKotlinを導入したのはAndroidチームでした。タイミングとしては1.0が正式リリースされる少し前から導入を検討していました。

まずはプロダクトと直接関係ない小さなアプリを書き、これで行ける!と判断したのと正式リリースのタイミングがちょうど重なり導入を決断しました。1 プロダクトに導入する際は、新規ファイルを作成する時にJavaではなくKotlinで書くといったようにファイル単位でじわじわKotlin化していきました。今ではJava : Kotlin = 2 : 1 くらいの割合まで増えています。

現在Androidアプリをリニューアルする計画があって実際に開発も始まっているのですが、今のところ フルKotlin です。特に大きな縛りもなくJavaかKotlinかどちらで書くのかは各開発者に委ねられているのですが、全員がKotlinを選択したということになります。

Androidでの導入してよかったところ

JavaではなくKotlinを選んだ理由はいくつかあるのですが、実際Androidアプリに導入して特によかったところを簡単に2点挙げていきます。

コレクションが便利

Javaと比較してKotlinはコレクションが充実しています。 例えば、ユーザ情報が格納されたListのうち、課金ユーザのみ取り出したいといった場合はこれだけで書けます。 (弊社のサービスではユーザさんに課金する機能はありません。あくまで一例です。)

val premiumUsers = allUsers.filter { it.isPremium == true }

Delegationが充実している

Javaにはない機能としてDelegationがとても便利です!Lazyなんかも好きですが、Observable も大好きです。これを使うと気軽にreactiveなコードが書けたりします。

例えば何かの状態を表す文言を表示するTextViewを表示する場合、その状態をObservableしておけばいい感じに表示されます✌️ コードはたった3行!

    var status by Delegates.observable("") { _, _, new ->
        statusTextView.text = new
    }

サーバサイドでの導入事例

AndroidチームがKotlinを導入してまもなく、アプリAPI開発チームがKotlinに興味を持ちはじめました。

もともとアプリAPIはJava8で作られた比較的新しいプロダクトで、Optional型やラムダを積極的に使っていたため、当初は導入に消極的でした。

が、チームメンバの1人がおもむろにKotlinでエンドポイントを開発→すんなり動いたことをきっかけに導入に拍車がかかり、新規で作成するファイルや、既存の小さいファイルのリファクタリングを積極的にKotlinで書くようになりました。2 こちらも現在ではJava : Kotlin = 2 : 1 くらいの割合まで増えています。

サーバサイドでKotlinを導入してよかったところ

導入のきっかけはあまり積極的なものとは言えませんが、結果的には導入してよかったと思っています。その中でも特に良かったところを以下に2点挙げたいと思います。

拡張関数が便利

Kotlinには既存のクラスにインスタンスメソッドを追加で生やせる、拡張関数という機能があります。「このクラスにこんなメソッドもあったらいいのに!」と言ったケースに、**Utilsみたいなクラスを生やしたりしなくてよくなります。例えばMapからクエリ文字列を生成する関数を以下のように定義することができます。

fun <K, V> Map<K, V>.toQueryString(): String {
    return this.keys.map { key ->
        this[key]?.let {
            "$key=${URLEncoder.encode(this[key].toString(), Charsets.UTF_8.toString())}"
        }
    }.filterNotNull().joinToString("&")
}

そして、これを定義しておけば、他のインスタンスメソッドと同じように map.toQueryString() とコールすることができます。

データを持つだけのクラスを簡単に記述できる

サーバサイドの場合、他のプロダクトとのやり取りをする上でデータ形式を定義するケースが多いと思いますが、Javaの場合、単にデータを持つだけのクラスを作るだけでもgetter/setterを含めて結構な行数のクラスを書く必要があります。こういったケースのためにKotlinにはデータクラスというものが用意されていて、プロパティを複数個持つだけのクラスをシンプルに記述できます。

data class User(val userId: Int, val userName: String, ...)

--

KotlinはNULL安全や型推論をはじめとする、モダンな言語の機能を一通り揃えていて、一見目新しい機能はあまり無いように見えますが、エンジニアの直感に沿って、比較的ストレスが少なく書ける言語だと感じます。あと名前がかわいい。

Kotlinを一緒に書いてくれるエンジニア募集中!

Androidはもちろん、いろんなプロダクトでKotlinを書きたいエンジニア募集中です!

また、弊社は毎月Androidもくもく会を開いています。もくもく会とはいっていますが、もくもくするだけだはなく質問タイムを取っているので、「実際にKotlinどうなの?」「こういった場合困らない?」など自由に聞いてもらえます! 弊社に入社したいかはともかく、気軽にKotlin書きたい、使用感を聞いてみたいエンジニアさんはぜひお越しくだだい!

retty.connpass.com


  1. 弊社は各プロダクトで使う言語・フレームワークは各チームの判断に委ねられているのでサクッと導入することができます✌️

  2. 弊社は各プロダクトで使う言語・フレームワークは各チームの判断に委ねられているのでサクッと導入することができます✌️ ※大切なので二回言いました