Slide 1

Slide 1 text

Kotlinの特徴として語られる機能の効果を 実践での結果から紹介する from サーバーサイド 2019年7月2日 Kotlin愛好会 vol.12 竹端 尚人

Slide 2

Slide 2 text

自己紹介

Slide 3

Slide 3 text

概要 氏名:竹端 尚人 Twitter:@n_takehata 株式会社アプリボット所属 ・サーバーサイドKotlin ・スマートフォンゲーム開発 ・エンジニアは11年ほど

Slide 4

Slide 4 text

登壇、執筆など ・CEDEC 2018登壇 ・Software Design 2019年2〜4月号で短期連載 ・Swift/Kotlin愛好会で技術書典執筆 https://booth.pm/ja/items/1315478

Slide 5

Slide 5 text

宣伝 • CEDEC 2019登壇 • Unity C# × gRPC × サーバーサイドKotlinに よる次世代のサーバー/クライアント通信 〜ハイ パフォーマンスな通信基盤の開発とMagicOnion によるリアルタイム通信の実現〜 https://cedec.cesa.or.jp/2019/session/detail /s5c9dede391631

Slide 6

Slide 6 text

今日話すこと

Slide 7

Slide 7 text

Kotlinの特徴としてよく言われるものたち ・安全 ・Null安全 ・val、var ・コードがシンプル ・型推論 ・データクラス ・スコープ関数 ・Javaからの移行コストが低い ・Javaとの相互互換 ・Spring FrameworkのKotlin対応 ・etc…

Slide 8

Slide 8 text

実践で使うとどう良いのか?

Slide 9

Slide 9 text

1年半開発した結果にならって話します (サーバーサイド視点)

Slide 10

Slide 10 text

アジェンダ 1.Null安全 2.変数は基本的にImmutableにできる 3.不要なキーワードの削除 4.Lombokが不要になった 5.まとめ

Slide 11

Slide 11 text

安全性

Slide 12

Slide 12 text

コンパイルで防げるエラーが多く 安全性が高まった

Slide 13

Slide 13 text

1.Null安全Null可、Null不可の不整合がなくなる

Slide 14

Slide 14 text

Javaの場合 ①引数をNull不可にしている(Lombokを使用) ②Null可の変数を引数に渡して実行している public void execute(Integer id) { createUser(id); } private void createUser(@NotNull Integer id) { // ・・・ } ① ② 実行時にNullPointerExceptionが発生する

Slide 15

Slide 15 text

Kotlinの場合 ①引数は?なしなのでNull不可 ②Null可の変数を引数に渡して実行している ① ② コンパイルエラーで気付ける fun execute(id: Int?) { createUser(id) } private fun createUser(id: Int) { // ・・・ }

Slide 16

Slide 16 text

実際に使っていて • 大体の変数、引数はNull不可で問題ない • Java(or その他の言語)では意識せずNull可にしていた変数 も、Null不可で良い場合が多い • デフォルトがNull不可になっていることで意識が変わる

Slide 17

Slide 17 text

2.変数定義は基本的にImmutableにできる

Slide 18

Slide 18 text

val、varの存在 • Kotlinはval、varで必ず変数のImmutable、Mutableを定義 しないといけない • JavaではデフォルトがMutableで、Immutableにするには finalを付ける必要があった

Slide 19

Slide 19 text

更新は基本的に オブジェクトのプロパティにすることが多い • IntやStringの変数を直接更新することは少ない • O/RマッパーのEntityクラスなどのオブジェクトを取得して更 新することが多い

Slide 20

Slide 20 text

val user = selectUser(id) user.name = "hoge" updateUser(user) オブジェクトの取得、更新 ①Userオブジェクトを取得 ②nameプロパティを更新 ① ② valで変数定義しても、プロパティの値は書き換えられる (プロパティがvarで定義されていれば) data class User(val id: Int, var name: String)

Slide 21

Slide 21 text

IntやStringの変数も書き換えないことが多い ①Int型の変数に値を取得 ②オブジェクトのプロパティに設定 ① ② 関数で取得した値を入れて、そのまま使う場合が多い val product: Product = getProduct(id) val userCount: Int = getUserCount(id) product.userCount = userCount

Slide 22

Slide 22 text

varを使うパターン

Slide 23

Slide 23 text

インクリメントしていきたい数値など ①varで合計値の変数を定義 ②ループの中で変数に加算していく ① fun calcAmmount(itemList: List) { var sumAmmount = 0 itemList.forEach { if (sumAmmount + it.price > MAX_BUY_AMMOUNT) { return } sumAmmount += it.price } } ②

Slide 24

Slide 24 text

実際に使っていて • 大体の変数はvalで定義できる(Immutableにできる) • var を使うのは最低限の箇所に留め、基本は val とし変更不 可にするのが安全 • val、varの存在やCollectionのデフォルトがImmutableなこ とでImmutableで事足りる気付く

Slide 25

Slide 25 text

Collectionも基本的にImmutable

Slide 26

Slide 26 text

実際に使っていて • やっぱりListを取得して使うだけで、変更を加えない場合が多 い • Collectionライブラリが優秀なので、変更を加える場合はこち らを使った方が分かりやすい →MutableListを使う機会は少ない

Slide 27

Slide 27 text

コードがシンプル

Slide 28

Slide 28 text

コード量(ステップ数)は2割減った

Slide 29

Slide 29 text

3.不要なキーワードの削除

Slide 30

Slide 30 text

Javaの場合 public void execute() { User user = new User(); user.setId(1); user.setName("Applibot"); registerUser(user); System.out.println("id=" + user.getId() + "name=" + user.getName()); }

Slide 31

Slide 31 text

Kotlinの場合 ・デフォルトのアクセス修飾子がpublic ・newキーワードが不要 ・型推論 ・String Template ・セミコロンが不要 ・etc… fun execute() { val user = User(1, "Applibot") registerUser(user) println("id=${user.id} name=${user.name}") }

Slide 32

Slide 32 text

実際に使っていて • 記述量が減ることで、考えることも減り思考がスムーズになっ た • いくらIDEが補完してくれても、記述が必要だと意識はしないと いけない • セミコロンやnewなど、細かいところもバカにならない

Slide 33

Slide 33 text

4.Lombokが不要になった

Slide 34

Slide 34 text

@Getter、@Setter

Slide 35

Slide 35 text

Javaの場合 ①Getterのみ生成 ②Getter、Setter両方を生成 ① public class User { @Getter private Integer id; @Getter @Setter private String name; } ②

Slide 36

Slide 36 text

Kotlinの場合 ①Getterのみ生成 ②Getter、Setter両方を生成 ① ② class User { val id: Int = 0 var name: String = "" }

Slide 37

Slide 37 text

@Data

Slide 38

Slide 38 text

Javaの場合 @Data public class User { private Integer id; private String name; }

Slide 39

Slide 39 text

Kotlinの場合 data class User(val id: Int, val name: String, var age: Int) データクラスを使う

Slide 40

Slide 40 text

@Builder

Slide 41

Slide 41 text

Javaの場合 @Builder @Data public class User { private Integer id; private String name; private String profile; private Integer age; } return User().builder() .id(1) .name(”LoveKotlin") .age(30) .build();

Slide 42

Slide 42 text

Kotlinの場合 data class User(val id: Int, val name: String, val profile: String = "", val age: Int) return User(id = 1, name = "Applibot", age = 30) デフォルト引数、名前付き引数を使う

Slide 43

Slide 43 text

Kotlinの場合(別解) val user = User().also { it.id = 1 it.name = "Applibot" it.age = 30 } ・コンストラクタがない場合(データクラスでない場合等)に使える ・Javaで作られたクラスに対して使う場合にも有効(ORM関連の自動生成クラス等)

Slide 44

Slide 44 text

実際に使っていて • 記述量が減ることで、考えることも減った • Lombokが不要になり、標準機能で大体のことが実現できる のが大きい

Slide 45

Slide 45 text

5.まとめ

Slide 46

Slide 46 text

• 変数は大体Null不可にできる • 変数は大体Immutableにできる • 記述量が少ないとプログラミングがスムーズに • 標準機能でできることが増えた • etc…

Slide 47

Slide 47 text

https://blog.applibot.co.jp/2019/06/ 20/benefits-of-server-side-kotlin/ 全文はこちらご御覧ください 1年半開発してきて実感したサーバーサイドKotlinのメリット

Slide 48

Slide 48 text

Kotlinを使っていて良かった!

Slide 49

Slide 49 text

ご清聴ありがとうございました