エムティーアイ エンジニアブログ

株式会社エムティーアイのエンジニア達による技術ブログ

Java->Kotlinへのリプレース率を出してくれるCLIツールをKotlinで実装してみた

はじめに

こんにちは、Androidエンジニアの三堀と申します。エンジニアブログでは2回目の投稿となります。よろしくお願いします。 私は、弊社サービス「ルナルナ」のAndroidアプリを開発しているのですが、密かにKotlinを愛でています。もう最近はAndroidアプリ開発といえばKotlinを採用している会社さんも多いのではないでしょうか。

そんな流行に遅れるなと言わんばかりにルナルナでも一部分のコードをKotlinに移植しています。その過程で、いまJava->Kotlinのリプレース率どれくらいなんだろうというのが一目でわからなかった&知れたらいいな〜と思ったので、それを解消してくれるものを作ってみました。 そもそも「移行する意味あるの?」ということに関しては今回は置いといて、移行したいというニーズがあると仮定した上でご覧になっていただければと思います。

作ったもの

Androidプロジェクト内のJava->Kotlinへのリプレース率を出してくれるコマンドラインツール(jarファイル)です。 今回は、どうせならKotlinに関するものだしKotlinで書いてみようと思い全てKotlinで実装しています。

※最初に言っておきます。名前だけ無駄に立派ですが大したものではないです。多分1日で作れます。

開発環境

  • MacBook Pro Sierra 10.12.6
  • intelliJ IDEA Community

作成したもの

https://github.com/youmitsu/KotlinReplaceSupporter/releases/download/1.1/kotlin_replace_supporter-1.1.jar

上記のjarをダウンロードしてきて、以下のようにjavaコマンドでAndroidプロジェクトのルート直下で実行します。

$ java -jar kotlin_replace_supporter-1.1.jar [Androidのプロジェクトルート]

実行結果

なかなか見た目的には残念なものができてしまいました。 もう少しビジュアル的に映える、インスタ映え、はてな映えできるものを作れるようになりたいです。(グラフっぽいの表示したり) ちなみに以下はルナルナアプリのリプレース率を表したものです。Javaが圧倒的に多いですね笑

f:id:mti-techblog-writer:20180522184503p:plain

コード

以下にソースコードを載せています。 よければスターもよろしくお願いします。モチベが上がります。 GitHub - youmitsu/KotlinReplaceSupporter

ここで、Kotlinをあまり触ったことがない方向けに、この開発を通じてKotlinいいなと思ったところをTipsとして3つほど紹介したいと思います。 詳しい文法についての説明はここではしません。いろんな方々がQiita、ブログ等でで公開しているのでそちらを見ていただいた方がわかりやすいと思います。

Tips1: メソッドが一行で定義できる

これはKotlinの魅力の一つだと思います。 例えば探索したファイルをカウントに入れるかどうかを判定するメソッドは以下のように一行で宣言できます。なんとシンプルなことでしょう。

private fun isTargetFile(file: File, extension: String): Boolean = file.extension == extension

Tips2: 簡潔なクラス宣言

Kotlinでのクラス宣言はこんなにも簡単に記述できます。 toStringのoverrideもメソッドが一行で宣言できるのでとてもシンプルですね。

data class Language(
        val name: String,  //言語名
        val extension: String //拡張子
        ){
        override fun toString() = name
}

Tips3: 再帰的な探索

walkTopDown()というKotlin標準のライブラリが提供してくれているメソッドを使うとフォルダ階層の探索がとてもシンプルにかけてしまいます。 内部のアルゴリズムについては、調べていませんが、このようなバックオフィス系のツールならそこまで気にする必要はないかなと思います。

rootDir.walkTopDown().forEach { file ->
            langList.map { langList ->
                if(!isIgnoreFile(file) && isTargetFile(file, langList.language.extension)){
                    langList.add(file)
                    println(file)
                    sizeAll++
                }
            }
        }

参考:intelliJIDEAでのビルド方法

念のため、実際にjarをビルドしてみたいという方のために、ここでは、kotlin_replace_supporterのjarファイルのビルドの仕方を紹介しています。

  1. IntelliJ IDEAをインストール Download IntelliJ IDEA: The Java IDE for Professional Developers by JetBrains

  2. IntelliJ IDEAを起動し、openを押下。クローンしてきたディレクトリを選択

  3. メニューのview > ToolWindows > Gradleを押下。Gradleウィンドウが開くので、kotlin_replace_supporter > Tasks > other > packJarをダブルクリック

  4. ビルドが走り、/build/libs/フォルダにkotlin_replace_supporter-1.1.jarが生成される

という感じで面倒ですね。参考までに。。

まとめ

今回は勉強も兼ねてKotlinでコマンドラインツールを作ってみました。その中でKotlinの利点と思われるところも読者のみなさまに紹介できました。 homebrewで公開してみようとトライしたのですが、恥ずかしながらGitHubリポジトリの制限に引っかかってしまったので、今回はできなかったです。 正直このリプレース率を表示するツールはAndroidStudioの拡張プラグインとして実装した方が便利なのではないかと思うので、できそうであればそちらでも実装してみようかなと思っています。 こんな調子で今後も小鳥を愛ででいこうかなと思います。次回はKotlinでのAndroid開発に関するTips集的なものをあげれたらいいなと思っています。

最後まで読んでいただきありがとうございました!