Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlinの特徴として語られる機能の効果を実践での結果から紹介する from サーバーサイド
Search
Takehata Naoto
July 02, 2019
Programming
1
860
Kotlinの特徴として語られる機能の効果を実践での結果から紹介する from サーバーサイド
2019年7月2日(火) 「集まれKotlin好き!Kotlin愛好会 vol.12」の談義資料です。
Takehata Naoto
July 02, 2019
Tweet
Share
More Decks by Takehata Naoto
See All by Takehata Naoto
組織貢献をするフリーランスエンジニアという生き方
n_takehata
1
1.3k
「2024年版 Kotlin サーバーサイドプログラミング実践開発」の補講 〜O/Rマッパー編〜
n_takehata
2
590
2024年版 Kotlin サーバーサイドプログラミング実践開発
n_takehata
7
5k
Server-Side目線で見る、Kotlin Festの楽しみ方
n_takehata
0
400
KotlinとCloud Vision APIで領収書の電子帳簿保存法対応をする
n_takehata
1
870
KotlinConf 2023 現地参加レポート
n_takehata
1
320
サーバーサイドKotlinクイズ
n_takehata
0
190
サーバーサイドでのKotlin Coroutines
n_takehata
0
1.2k
KotlessとDynamoDBで自分のツイートを収集するサーバーレスアプリケーションを作る
n_takehata
0
400
Other Decks in Programming
See All in Programming
Linux && Docker 研修/Linux && Docker training
forrep
24
4.5k
SpringBoot3.4の構造化ログ #kanjava
irof
2
990
Flutter × Firebase Genkit で加速する生成 AI アプリ開発
coborinai
0
150
『品質』という言葉が嫌いな理由
korimu
0
160
Compose でデザインと実装の差異を減らすための取り組み
oidy
1
300
法律の脱レガシーに学ぶフロントエンド刷新
oguemon
5
740
技術を根付かせる / How to make technology take root
kubode
1
250
CI改善もDatadogとともに
taumu
0
110
Lottieアニメーションをカスタマイズしてみた
tahia910
0
120
Formの複雑さに立ち向かう
bmthd
1
830
2024年のWebフロントエンドのふりかえりと2025年
sakito
2
240
AWSマネコンに複数のアカウントで入れるようになりました
yuhta28
2
160
Featured
See All Featured
How STYLIGHT went responsive
nonsquared
98
5.4k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
Code Review Best Practice
trishagee
67
17k
Scaling GitHub
holman
459
140k
How to train your dragon (web standard)
notwaldorf
91
5.8k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
30
4.6k
How to Think Like a Performance Engineer
csswizardry
22
1.3k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
A better future with KSS
kneath
238
17k
Writing Fast Ruby
sferik
628
61k
Building Your Own Lightsaber
phodgson
104
6.2k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
193
16k
Transcript
Kotlinの特徴として語られる機能の効果を 実践での結果から紹介する from サーバーサイド 2019年7月2日 Kotlin愛好会 vol.12 竹端 尚人
自己紹介
概要 氏名:竹端 尚人 Twitter:@n_takehata 株式会社アプリボット所属 ・サーバーサイドKotlin ・スマートフォンゲーム開発 ・エンジニアは11年ほど
登壇、執筆など ・CEDEC 2018登壇 ・Software Design 2019年2〜4月号で短期連載 ・Swift/Kotlin愛好会で技術書典執筆 https://booth.pm/ja/items/1315478
宣伝 • CEDEC 2019登壇 • Unity C# × gRPC ×
サーバーサイドKotlinに よる次世代のサーバー/クライアント通信 〜ハイ パフォーマンスな通信基盤の開発とMagicOnion によるリアルタイム通信の実現〜 https://cedec.cesa.or.jp/2019/session/detail /s5c9dede391631
今日話すこと
Kotlinの特徴としてよく言われるものたち ・安全 ・Null安全 ・val、var ・コードがシンプル ・型推論 ・データクラス ・スコープ関数 ・Javaからの移行コストが低い ・Javaとの相互互換
・Spring FrameworkのKotlin対応 ・etc…
実践で使うとどう良いのか?
1年半開発した結果にならって話します (サーバーサイド視点)
アジェンダ 1.Null安全 2.変数は基本的にImmutableにできる 3.不要なキーワードの削除 4.Lombokが不要になった 5.まとめ
安全性
コンパイルで防げるエラーが多く 安全性が高まった
1.Null安全Null可、Null不可の不整合がなくなる
Javaの場合 ①引数をNull不可にしている(Lombokを使用) ②Null可の変数を引数に渡して実行している public void execute(Integer id) { createUser(id); }
private void createUser(@NotNull Integer id) { // ・・・ } ① ② 実行時にNullPointerExceptionが発生する
Kotlinの場合 ①引数は?なしなのでNull不可 ②Null可の変数を引数に渡して実行している ① ② コンパイルエラーで気付ける fun execute(id: Int?) {
createUser(id) } private fun createUser(id: Int) { // ・・・ }
実際に使っていて • 大体の変数、引数はNull不可で問題ない • Java(or その他の言語)では意識せずNull可にしていた変数 も、Null不可で良い場合が多い • デフォルトがNull不可になっていることで意識が変わる
2.変数定義は基本的にImmutableにできる
val、varの存在 • Kotlinはval、varで必ず変数のImmutable、Mutableを定義 しないといけない • JavaではデフォルトがMutableで、Immutableにするには finalを付ける必要があった
更新は基本的に オブジェクトのプロパティにすることが多い • IntやStringの変数を直接更新することは少ない • O/RマッパーのEntityクラスなどのオブジェクトを取得して更 新することが多い
val user = selectUser(id) user.name = "hoge" updateUser(user) オブジェクトの取得、更新 ①Userオブジェクトを取得
②nameプロパティを更新 ① ② valで変数定義しても、プロパティの値は書き換えられる (プロパティがvarで定義されていれば) data class User(val id: Int, var name: String)
IntやStringの変数も書き換えないことが多い ①Int型の変数に値を取得 ②オブジェクトのプロパティに設定 ① ② 関数で取得した値を入れて、そのまま使う場合が多い val product: Product =
getProduct(id) val userCount: Int = getUserCount(id) product.userCount = userCount
varを使うパターン
インクリメントしていきたい数値など ①varで合計値の変数を定義 ②ループの中で変数に加算していく ① fun calcAmmount(itemList: List<Item>) { var sumAmmount
= 0 itemList.forEach { if (sumAmmount + it.price > MAX_BUY_AMMOUNT) { return } sumAmmount += it.price } } ②
実際に使っていて • 大体の変数はvalで定義できる(Immutableにできる) • var を使うのは最低限の箇所に留め、基本は val とし変更不 可にするのが安全 •
val、varの存在やCollectionのデフォルトがImmutableなこ とでImmutableで事足りる気付く
Collectionも基本的にImmutable
実際に使っていて • やっぱりListを取得して使うだけで、変更を加えない場合が多 い • Collectionライブラリが優秀なので、変更を加える場合はこち らを使った方が分かりやすい →MutableListを使う機会は少ない
コードがシンプル
コード量(ステップ数)は2割減った
3.不要なキーワードの削除
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()); }
Kotlinの場合 ・デフォルトのアクセス修飾子がpublic ・newキーワードが不要 ・型推論 ・String Template ・セミコロンが不要 ・etc… fun execute()
{ val user = User(1, "Applibot") registerUser(user) println("id=${user.id} name=${user.name}") }
実際に使っていて • 記述量が減ることで、考えることも減り思考がスムーズになっ た • いくらIDEが補完してくれても、記述が必要だと意識はしないと いけない • セミコロンやnewなど、細かいところもバカにならない
4.Lombokが不要になった
@Getter、@Setter
Javaの場合 ①Getterのみ生成 ②Getter、Setter両方を生成 ① public class User { @Getter private
Integer id; @Getter @Setter private String name; } ②
Kotlinの場合 ①Getterのみ生成 ②Getter、Setter両方を生成 ① ② class User { val id:
Int = 0 var name: String = "" }
@Data
Javaの場合 @Data public class User { private Integer id; private
String name; }
Kotlinの場合 data class User(val id: Int, val name: String, var
age: Int) データクラスを使う
@Builder
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();
Kotlinの場合 data class User(val id: Int, val name: String, val
profile: String = "", val age: Int) return User(id = 1, name = "Applibot", age = 30) デフォルト引数、名前付き引数を使う
Kotlinの場合(別解) val user = User().also { it.id = 1 it.name
= "Applibot" it.age = 30 } ・コンストラクタがない場合(データクラスでない場合等)に使える ・Javaで作られたクラスに対して使う場合にも有効(ORM関連の自動生成クラス等)
実際に使っていて • 記述量が減ることで、考えることも減った • Lombokが不要になり、標準機能で大体のことが実現できる のが大きい
5.まとめ
• 変数は大体Null不可にできる • 変数は大体Immutableにできる • 記述量が少ないとプログラミングがスムーズに • 標準機能でできることが増えた • etc…
https://blog.applibot.co.jp/2019/06/ 20/benefits-of-server-side-kotlin/ 全文はこちらご御覧ください 1年半開発してきて実感したサーバーサイドKotlinのメリット
Kotlinを使っていて良かった!
ご清聴ありがとうございました