既存AndroidアプリにKotlinを導入しました!

こんにちは!新卒入社2年目でAndroidエンジニアの永井です。

今回は弊社の@cosmeアプリにKotlinを導入した話をしたいと思います。

導入するに至った経緯

弊社には勉強会への参加サポート制度があり、業務の一環として会社の費用でDroidKaigi2018に参加しました。
その時の感想はこちら
DroidKaigi2018に参加してきました!

DroidKaigi2018でKotlinについて思ったことを少し紹介します。

  • 聴講したセッションで紹介されたサンプルコードの多くがKotlinで書かれていた
  • Kotlinに関連したセッションは人気が高かった

Kotlinの利用が一般的になって来ていることや関心が高かったことから、弊社もこの波に乗ろうという思いはもちろん、Kotlinについて学ぶうちにメリットを感じることも多かったため、導入に踏み切りました。

導入してみてよかったこと

  • コードがシンプルになりコード量も減少した
  • チーム内のコミュニケーションが増えた

シンプルに書けてコード量も減少した

お試しでプロダクションのコードをKotlinに書き直して見たのですが、複数行に分けて条件分岐させていたものが1行や数行で書くことができjavaに比べてシンプルに書くことができました。
シンプルに書けたことにより、ぱっと見で分かるほどコード量も減少しました。

コミュニケーションの増加

これは、Kotlin自体がjavaに比べてよかった点ではないのですが、Kotlinに触れたこともないメンバーも多かったため、全員で一斉に学び始めました。
結果として、Kotlinでの書き方を共有したり質を高めていくために、もっとこう書けますといった会話がチーム内で増えてコミュニケーションが増えました。

文法で悩んだところ

Kotlinを使っていく上で文法をどうするかで悩みました。
今回は初歩的な記述部分を例に2つほど紹介します。

どこまで型推論に任せるか

Kotlinでは型推論が可能なのでjavaで書いていた型を省くことができました。

class Sample {
    val count = 0
    // もちろん型指定もできます
    val typeIntCount : Int = 0
}

しかし、ぱっと見で何が代入されるのか不明な場合も型推論で良いのかという悩みがありました。

class SampleActivity {
    val viewModel: SampleViewModel = SampleViewModel()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        val adapter = viewModel.adapter
        ......
    }
}

上記の例ではSampleViewModelのadapterを取得しているんだろうなということが想像できます。
実際にAndroid StudioでFind Usageを使用したりして、遡っていけばどのクラスかはすぐにわかります。
Android開発者はIDEを使用している方がほとんどかと思います。
そのため、実際に開発途中に困ることはあまりないと思います。
しかし、GitHub上でコードレビューをする際にコードが少し追いづらかったりすることもあります。

レシーバーはどこまでitでネストさせるか

Kotlinにはスコープ関数と呼ばれるものがあります。
let, run, apply, also, withの5つです。
使用する関数によってitまたはthisをレシーバーとして使用できるのですが、thisは基本的にネストさせない方が良いというお話があるようなので置いておきます。
itを使用した場合にネストが深くなると、そのitがなんなのかわかりづらくなります。

class ItemList {
    val items = listOf<Item>()
} 

class Item {
    val name = "おにぎり"
}

class Sample {
    val itemList = listOf<ItemList>()

    ......

    fun printItem() {
        itemList.first {
            it.first {
                print(it.name)
            }
        }
    }
}

チームメンバーのKotlinに対する技術力が単純に増えれば解決できる話なのか、回避策として名前をつけてあげるべきなの
よくわかりません。

チーム内で使用可能な文法を制限するか否か

チーム内では現状、Kotlinの技術力や知識を貯める時期だと考え、Kotlinに由来する文法については制約を設けていません。
なので、コードレビューの際にここの処理は、何をしているんだろう?(´ – ` )と思うこともしばしばあります。
この部分については、いずれ決まったら書きたいと思います。

おわりに

弊社では、美容に関するすべてのモノ/コト/ヒト/場所を繋げるビューティプラットフォームを実現するため、今後もアプリに力を入れてきます!
そのために必要な最新技術は積極的に取り入れていきます!

弊社ではAndroid/iOSエンジニアを超募集しております。
興味のある方は是非ご連絡ください!

株式会社アイスタイル 中途採用
新規ネイティブアプリやグローバル向けアプリ開発がしたいiOS/Androidエンジニア募集!

Androidエンジニア、新卒入社2年目 料理が好きです。最近はテストに興味があります。