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
800
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
「2024年版 Kotlin サーバーサイドプログラミング実践開発」の補講 〜O/Rマッパー編〜
n_takehata
2
460
2024年版 Kotlin サーバーサイドプログラミング実践開発
n_takehata
4
3.5k
Server-Side目線で見る、Kotlin Festの楽しみ方
n_takehata
0
330
KotlinとCloud Vision APIで領収書の電子帳簿保存法対応をする
n_takehata
1
210
KotlinConf 2023 現地参加レポート
n_takehata
1
300
サーバーサイドKotlinクイズ
n_takehata
0
160
サーバーサイドでのKotlin Coroutines
n_takehata
0
1.1k
KotlessとDynamoDBで自分のツイートを収集するサーバーレスアプリケーションを作る
n_takehata
0
370
書籍『Kotlin サーバーサイドプログラミング実践開発』のこだわりとおすすめポイント
n_takehata
0
500
Other Decks in Programming
See All in Programming
Tauriでネイティブアプリを作りたい
tsucchinoko
0
370
エンジニアとして関わる要件と仕様(公開用)
murabayashi
0
280
PHP でアセンブリ言語のように書く技術
memory1994
PRO
1
170
subpath importsで始めるモック生活
10tera
0
300
광고 소재 심사 과정에 AI를 도입하여 광고 서비스 생산성 향상시키기
kakao
PRO
0
170
Content Security Policy入門 セキュリティ設定と 違反レポートのはじめ方 / Introduction to Content Security Policy Getting Started with Security Configuration and Violation Reporting
uskey512
1
520
初めてDefinitelyTypedにPRを出した話
syumai
0
400
Macとオーディオ再生 2024/11/02
yusukeito
0
370
Contemporary Test Cases
maaretp
0
130
CSC509 Lecture 11
javiergs
PRO
0
180
Duckdb-Wasmでローカルダッシュボードを作ってみた
nkforwork
0
120
アジャイルを支えるテストアーキテクチャ設計/Test Architecting for Agile
goyoki
9
3.3k
Featured
See All Featured
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
44
2.2k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Designing the Hi-DPI Web
ddemaree
280
34k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
48k
Fontdeck: Realign not Redesign
paulrobertlloyd
82
5.2k
10 Git Anti Patterns You Should be Aware of
lemiorhan
654
59k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
246
1.3M
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
329
21k
Adopting Sorbet at Scale
ufuk
73
9.1k
Git: the NoSQL Database
bkeepers
PRO
427
64k
Intergalactic Javascript Robots from Outer Space
tanoku
269
27k
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を使っていて良かった!
ご清聴ありがとうございました