$30 off During Our Annual Pro Sale. View Details »
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Kotlinの特徴として語られる機能の効果を実践での結果から紹介する from サーバーサイド
Search
Takehata Naoto
July 02, 2019
Programming
1
820
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
480
2024年版 Kotlin サーバーサイドプログラミング実践開発
n_takehata
6
3.8k
Server-Side目線で見る、Kotlin Festの楽しみ方
n_takehata
0
340
KotlinとCloud Vision APIで領収書の電子帳簿保存法対応をする
n_takehata
1
340
KotlinConf 2023 現地参加レポート
n_takehata
1
310
サーバーサイドKotlinクイズ
n_takehata
0
170
サーバーサイドでのKotlin Coroutines
n_takehata
0
1.1k
KotlessとDynamoDBで自分のツイートを収集するサーバーレスアプリケーションを作る
n_takehata
0
370
書籍『Kotlin サーバーサイドプログラミング実践開発』のこだわりとおすすめポイント
n_takehata
0
510
Other Decks in Programming
See All in Programming
Vue.js_好きに捧ぐ Nuxt Hub で簡単に始めるCloudflare
xiombatsg
1
110
OnlineTestConf: Test Automation Friend or Foe
maaretp
0
140
Functional Event Sourcing using Sekiban
tomohisa
0
130
プロダクトの品質に コミットする / Commit to Product Quality
pekepek
0
160
Cognitoが大型アップデート!Managed Loginとパスワードレスログインを実際に使ってみた@しむそくRadio Special Day1
tmhirai
2
150
Leverage LLMs in Java with LangChain4j and Quarkus
hollycummins
0
120
Missing parts when designing and implementing Android UI
ericksli
0
370
Thoughts and experiences on Rust and TypeScript
unvalley
2
200
Modular Monolith Monorepo ~シンプルさを保ちながらmonorepoのメリットを最大化する~
yuisakamoto
10
3.7k
チームにとって最適なスキルアップ施策とは何か/what-is-the-best-skill-up-approach-for-team
nobuoooo
0
160
Arm移行タイムアタック
qnighy
0
390
タクシーアプリ『GO』のリアルタイムデータ分析基盤における機械学習サービスの活用
mot_techtalk
6
2.3k
Featured
See All Featured
We Have a Design System, Now What?
morganepeng
50
7.2k
Building Your Own Lightsaber
phodgson
103
6.1k
Speed Design
sergeychernyshev
25
640
Practical Orchestrator
shlominoach
186
10k
Embracing the Ebb and Flow
colly
84
4.5k
Keith and Marios Guide to Fast Websites
keithpitt
410
22k
Happy Clients
brianwarren
98
6.7k
4 Signs Your Business is Dying
shpigford
181
21k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
No one is an island. Learnings from fostering a developers community.
thoeni
19
3k
How to Ace a Technical Interview
jacobian
276
23k
Typedesign – Prime Four
hannesfritz
40
2.4k
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を使っていて良かった!
ご清聴ありがとうございました