Upgrade to Pro — share decks privately, control downloads, hide ads and more …

20190319_社内WEBツールをKotlin化してみた

 20190319_社内WEBツールをKotlin化してみた

【とらのあな主催】オタクがKotlinを追うライトニングトークイベント-発表資料1
https://yumenosora.connpass.com/event/120691/

shoya oba

March 19, 2019
Tweet

Other Decks in Technology

Transcript

  1. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 6 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    なぜ社内ツール(Java)を Kotlin化したか? • 社内ツールは小規模システム  →失敗しても業務影響が低い • 社内ツールのコア部分がKotlin  →実はKotlinで開発する予定だった! • JVM界隈でKotlinが流行  →Kotlin化して社外へ技術アピール • なんか可愛い →可愛いは正義・・・!!
  2. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 7 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    Kotlin化してみた ❑手順 1. Intellij IDEAでJavaファイルを変換 2. 自動変換後のエラー箇所修正 3. Kotlin文法に寄せる
  3. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 8 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    Kotlin化してみた IntelliJ IDEAの機能を利用して JavaからKotlinに変換していきます。 ▪操作 対象のJavaファイルを開いた状態で、 [Code]→[Convert Java File to Kotlin File]
  4. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 9 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    Kotlin化してみた Javaファイル→Kotlinに変換される                    HashMap<String, Object> commodityOrder = new HashMap<>(); // リクエストパラメータの取得 String formatParam = req.queryParams("tsv"); String itemId = req.queryParams("common_code_order").replaceAll("\r\n", ","); // 入力チェック if (StringUtils.isEmpty(itemId)) { commodityOrder.put("message", "データが入力されていません。"); return commodityOrder; } val commodityOrder = HashMap<String, Any>() // リクエストパラメータの取得 val formatParam = req.queryParams("tsv") val itemId = req.queryParams("commodity_code_order").replace("\r\n".toRegex(), ",") // 入力チェック if (StringUtils.isEmpty(itemId)) { commodityOrder["message"] = "データが入力されていません。" return commodityOrder }
  5. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 11 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    エラーが発生したコード      変換前と変換後の比較 ▪Java List errorList = new ArrayList(); ▪Kotlin(自動変換後 ( var errorList = ArrayList() Please specify it explicitly (↑エラー内容は【型を明示的に指定してください】 )
  6. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 12 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    ArrayListのジェネリクス型を省略してる・・・   ▪Java List errorLine = new ArrayList(); ▪Kotlin //どっちに変換すれば良いかわからん var errorLine = ArrayList<java.lang.Object>() var errorLine = ArrayList<kotlin.Any>() 自動変換がダメだった理由
  7. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 13 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    Intellij IDEA 自動変換くん 「Javaで型省略だからjava.lang.Objectに変換! でも、kotlin.Anyかjava.lang.Objectかわからない」 ▪ルートクラス(型省略時) Java・・・java.lang.Object Kotlin・・・kotlin.Any ▪java.lang.Objectクラス Java・・・java.lang.Object Kotlin・・・kotlin.Any or java.lang.Object
  8. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 14 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    ArrayListのジェネリクス型がStringで明示的! ▪Java List errorLine = new ArrayList<String>(); ▪Kotlin var errorLine = ArrayList<String>() 自動変換が正常なパターン
  9. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 15 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    補足 KotlinではObjectクラスをArrayList<Object>のように、 何でも格納できるクラスとして使う事は出来ません。
  10. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 16 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    Kotlinのオススメ文法 ①Raw String → 文字列中に改行/スペースがそのまま使える →→要はヒアドキュメント ②String Templase → 文字列中に変数を混ぜ込める →→要は変数展開
  11. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 17 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    プログラム内のクエリを再利用する際 Raw String を使わないと... Java ・文字列内の\n削除や空白文字やインデントを調整 →面倒!再利用もしにくい! final String query = "SELECT" + " *" + "FROM" + " COMMON_HEADER" + "WHERE " + " COMMON_ID = 1"; final String query = "" + "SELECT " + " * " + "FROM " + " COMMON_HEADER " + "WHERE " + " COMMON_ID = 1"; 整形前 整形後(手作業
  12. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 19 Kotlin ・文字列+変数を結合している場合は、 Javaと同様の状態に後戻り・・・ String Templateを使わないと Copyright © 2019

    Toranoana Inc. All Rights Reserved. // サンプルコード val common_id = 1 val query = """ SELECT * FROM COMMON_HEADER WHERE COMMON_ID = """ + common_id + " AND 1=1"
  13. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 20 Kotlin ・変数部分以外余計な文字が入らない String Templateを使うと…!! Copyright © 2019 Toranoana

    Inc. All Rights Reserved. // サンプルコード val common_id = 1 val query = """ SELECT * FROM COMMON_HEADER WHERE COMMON_ID = $common_id AND 1 = 1 """
  14. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 ▪Kotlin(自動変換後 var errorList = ArrayList() ▪Kotlin ( var errorList

    = mutableListOf<String>() 22 Copyright © 2019 Toranoana Inc. All Rights Reserved. ・Stringを格納したいので明示的に型を指定 エラー箇所の修正
  15. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 23 Copyright © 2019 Toranoana Inc. All Rights Reserved.

    Kotlinでは色々な書き方ができるが、どう書こうが実体のクラ スはすべて java.util.ArrayList ArrayListの色々な書き方