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

【とらのあな主催】オタクがKotlinを追うライトニングトークイベント

 【とらのあな主催】オタクがKotlinを追うライトニングトークイベント

More Decks by 虎の穴ラボ株式会社

Other Decks in Technology

Transcript

  1. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 社内ツールをKotlin化してみた 株式会社 虎の穴 大場 祥哉 1 Copyright © 2019

    Toranoana Inc. All Rights Reserved.
  2. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 自己紹介 名前     :大場 祥哉 担当業務   :ECサイト開発 業務使用の言語:Java、Kotlin 好きなアニメ :幽☆遊☆白書         みなみけ 今期アニメ:約束のネバーランド 2

    Copyright © 2019 Toranoana Inc. All Rights Reserved.
  3. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 アジェンダ • Kotlinについて • なぜ社内ツールをKotlin化したか? • Kotlin化した際のエラー修正 • 個人的に嬉しかった機能紹介

    • まとめ 3 Copyright © 2019 Toranoana Inc. All Rights Reserved.
  4. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Kotlinについて 4 ・Java互換です 言語の設計思想としてJava互換を謳っています。 その為、Javaの既存ライブラリを利用することができます。 前回の発表資料より引用__20190122_LT_Kotlin&Ktor ・型推論が出来ます 型を指定して書かなくても推論してくれます。 Copyright

    © 2019 Toranoana Inc. All Rights Reserved. // String 型推論 val tora = "tora";
  5. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 5 社内ツール Copyright © 2019 Toranoana Inc. All Rights

    Reserved. 通販サイトの日々の受注数を集計、集計結果を表示。
  6. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 6 Copyright © 2019 Toranoana Inc. All Rights Reserved.

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

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

    Kotlin化してみた IntelliJ IDEAの機能を利用して JavaからKotlinに変換していきます。 ▪操作 対象のJavaファイルを開いた状態で、 [Code]→[Convert Java File to Kotlin File]
  9. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 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 }
  10. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 10 ・文字数が劇的に削減される訳ではない。 ・Javaがイケてないとエラーを吐く。 変換しただけでは Copyright © 2019 Toranoana Inc.

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

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

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

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

    Kotlinのオススメ文法 ①Raw String → 文字列中に改行/スペースがそのまま使える →→要はヒアドキュメント ②String Templase → 文字列中に変数を混ぜ込める →→要は変数展開
  17. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 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"; 整形前 整形後(手作業
  18. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 18 Kotlin ・SQL以外の余計な文字が入らない →スッキリしていて見やすい、再利用も楽! Raw String を使うと...!! Copyright ©

    2019 Toranoana Inc. All Rights Reserved. val query = """ SELECT * FROM COMMON_HEADER WHERE COMMON_ID = 1 """
  19. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 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"
  20. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 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 """
  21. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 Kotlin化してみた まとめ 21 ・Kotlin化を進める工程でJavaの悪いコードに気付ける →今回紹介したようにObject型を指定しているArrayList等 →悪いコードが見つかるので、Kotlin化ついでにリファクタリング 出来る! ・ソース中に記載されたクエリ再利用がしやすくなった →Raw

    String + String Template がオススメ。 →障害調査や似たような機能開発の際にソース中に記載されて いるクエリの取り回し(コピペ)がしやすくなる。 Copyright © 2019 Toranoana Inc. All Rights Reserved.
  22. 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 虎の穴 ▪Kotlin(自動変換後 var errorList = ArrayList() ▪Kotlin ( var errorList

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

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