Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Kotlinにおける型の世界と エラーハンドリング / Type World and Erro...
Search
mako_makok
March 07, 2023
Programming
1.2k
3
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Kotlinにおける型の世界と エラーハンドリング / Type World and Error Handling in Kotlin
mako_makok
March 07, 2023
More Decks by mako_makok
See All by mako_makok
Javaでも使えるKotlin OSSを目指すためのkotlin.jvmの利用とインターフェース設計/Use of kotlin.jvm and interface design for Kotlin OSS that can also be used in Java
makomakok
0
1k
Slack_API_Wrapper_BoltでBotを爆速開発.pdf
makomakok
0
380
退屈なことはバッチにやらせよう
makomakok
1
670
Firebase + BoltではじめるSlackアプリ開発
makomakok
0
15k
Other Decks in Programming
See All in Programming
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8k
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
390
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
230
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
340
Simple Storage Service(S3) is not simple
iwatsukayura
0
230
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
半永久的に提供し続けられるプライベートクラウドを目指して ― 利用者の認知負荷を抑えるAPI抽象化とハードウェア世代交代の基盤設計
tomokon
0
470
Apple Intelligence を用いた個人情報誤送信防止、及びユーザーリクエスト体験の改善について
yukiny
0
320
速く作れる。その次は、速く確かめられる開発へ 〜AIネイティブ開発を支える、Shift Down〜 / Can build fast. Next, moving to development where we can verify fast.
rkaga
8
5.6k
Java 27新機能 / Java 27 new features
kishida
2
210
Jetpack Compose Mechanisms
skydoves
2
630
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
450
Featured
See All Featured
Everyday Curiosity
cassininazir
0
350
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
Navigating Team Friction
lara
192
16k
Technical Leadership for Architectural Decision Making
baasie
3
600
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1.3k
ラッコキーワード サービス紹介資料
rakko
1
5.2M
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Java REST API Framework Comparison - PWX 2021
mraible
34
9.8k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
320
Transcript
1 ©2023 Loglass Inc. Kotlinにおける型の世界と エラーハンドリング 2023.3.07 Makoto Kobayashi
2 2 ©2023 Loglass Inc. 小林 允(Makoto Kobayashi) 自己紹介 @mako_makok
mako-makok 所属: 株式会社ログラス 好きな言語: Java, Kotlin, TypeScript 普段はSpringBootをKotlinで書いています AndroidをJavaで書いてた Luceneのパッチを書いてSolrに組み込む JavaでSpringBootやSeasar2を書いていた ログラスでSpringBootとKotlinを書いている 2017〜2018 2018〜2019 2019〜2021 2022〜
3 ©2023 Loglass Inc. ログラスについて Loglassは経営データを正確かつ迅速に可視化/分析す ることで、柔軟/高精度な事業推進を実現する経営管理 クラウドサービス です。 企業価値を向上する経営管理クラウド
4 ©2023 Loglass Inc. ログラスについて
5 5 ©2023 Loglass Inc. 目次 1. Javaにおけるエラーハンドリング 2. Kotlinにおける例外処理
3. Kotlinでのエラーハンドリング 4. よりメンテナブルなエラーハンドリングに
6 ©2023 Loglass Inc. Javaにおけるエラーハンドリング
7 ©2023 Loglass Inc. 7 例外のtry-catch Javaにおけるエラーハンドリング
8 ©2023 Loglass Inc. Kotlinの例外処理
9 ©2023 Loglass Inc. Kotlinにおける例外 Kotlinの例外処理 Javaの検査例外をthrowしてもコンパイルエラーにならない
10 ©2023 Loglass Inc. Kotlinにおける例外 Kotlinの例外処理 try-catch式 runCatching
11 ©2023 Loglass Inc. Kotlinにおける例外 Kotlinの例外処理 • 検査例外がないので例外を無視してもコンパイルエラーにならない • throwsも無いので例外のチェックを強制するような設計は
絶対できないようになっている • 呼び出し階層の中で例外を投げる処理を書くと ハンドリング忘れで意図しないエラーが発生する可能性がある
12 ©2023 Loglass Inc. Kotlinにおける例外 Kotlinの例外処理 設計レベルでなんとかできないかな? • 設計標準に例外ハンドリングについて定義する? •
ArchUnitでアーキテクチャテストを書く?
13 ©2023 Loglass Inc. Kotlinでのエラーハンドリング
14 ©2023 Loglass Inc. 例外のtry-catchに代わるハンドリング Kotlinでのエラーハンドリング • 代数的データ構造で Result型を設計する •
パターンマッチでokとerrorをハンドルして値を安全に取り出す
15 ©2023 Loglass Inc. 代数的データ構造とは Kotlinでのエラーハンドリング 代数的データ型(だいすうてきデータがた、英 : algebraic data
type)とは プログラミング、特に関数型プログラミングや型システムにおいて使われ るデータ型である。それぞれの代数的データ型の値には、 1個以上のコ ンストラクタがあり、各コンストラクタには 0個以上の引数がある。 代数的 データ型の値(データ)の感覚的な説明としては、引数で与えられた他の データ型の値を、コンストラクタで包んだようなもの、である。コンストラク タに引数がある代数データ型は複合型(他のデータ型を組み合わせて形 成する型)である。 Wikipediaより引用: https://ja.wikipedia.org/wiki/代数的データ型
16 ©2023 Loglass Inc. 代数的データ構造とは Kotlinでのエラーハンドリング • パラメータの組み合わせが和や積など、 代数的に表現できるためそう呼ばれている ?
• 厳密的な定義はなさそう ?
17 ©2023 Loglass Inc. 直積型 Kotlinでのエラーハンドリング
18 ©2023 Loglass Inc. 直積型 Kotlinでのエラーハンドリング data error String null
null String null null String String 2 * 2の直積でパターンが表される
19 ©2023 Loglass Inc. 直和型 Kotlinでのエラーハンドリング Resultの型はOkかErrorなので、直和のパターン数で表される
20 ©2023 Loglass Inc. 直和型 Kotlinでのエラーハンドリング
21 ©2023 Loglass Inc. 余談: こういうのも直和 Kotlinでのエラーハンドリング
22 ©2023 Loglass Inc. 余談: こういうのも直和 Kotlinでのエラーハンドリング
23 ©2023 Loglass Inc. 直和型によるエラーハンドリング Kotlinでのエラーハンドリング ::doSomethingはinterfaceを返却する
24 ©2023 Loglass Inc. 直和型によるエラーハンドリング Kotlinでのエラーハンドリング パターンマッチによるデータの取り出し
25 ©2023 Loglass Inc. 直和型によるエラーハンドリング Kotlinでのエラーハンドリング パターンの欠損はコンパイルエラーになる
26 ©2023 Loglass Inc. Javaでの直和型の実装 Kotlinでのエラーハンドリング instanceof によるパターンマッチ
27 ©2023 Loglass Inc. Javaでの直和型の実装 Kotlinでのエラーハンドリング Java 19 third preview(Record
Patterns, pattern matching for switch)
28 ©2023 Loglass Inc. よりメンテナブルな エラーハンドリングに
29 ©2023 Loglass Inc. 言語機能の限界 よりメンテナブルなエラーハンドリングに
30 ©2023 Loglass Inc. 言語機能の限界 よりメンテナブルなエラーハンドリングに Resultがネストするとかなり可読性が下がる
31 ©2023 Loglass Inc. 言語機能の限界 よりメンテナブルなエラーハンドリングに • 直和型とパターンマッチは特に関数型言語にしばしば見られる概念である • Kotlinは関数型ではない
• もう一歩関数型に踏み込む必要がある
32 ©2023 Loglass Inc. 他の言語のパラダイムを確認する : Rust よりメンテナブルなエラーハンドリングに
33 ©2023 Loglass Inc. 他の言語のパラダイムを確認する : Scala よりメンテナブルなエラーハンドリングに
34 ©2023 Loglass Inc. and_thenの実装 よりメンテナブルなエラーハンドリングに • 関数の合成はシンタックス的に難しそう • Rustではand_then,
ScalaではflatMapがある • どちらも同じ動きをしている • これらを模倣してみると良さそう
35 ©2023 Loglass Inc. and_thenの実装(1/3) よりメンテナブルなエラーハンドリングに • out: Kotlinにおける共変を表す •
Nothing: 存在しない値を表す型
36 ©2023 Loglass Inc. and_thenの実装(2/3) よりメンテナブルなエラーハンドリングに • 拡張関数: fun Result.funName()
{} と宣言することで、 クラスにメソッドが生えているかのような書き方ができる • 引数部分は関数渡し 図の場合、引数は Function<T, Result<U, E>>と同等
37 ©2023 Loglass Inc. and_thenの実装(3/3) よりメンテナブルなエラーハンドリングに
38 38 ©2023 Loglass Inc. Nothing型 よりメンテナブルなエラーハンドリングに • Any型の反対 •
全てのクラスを継承したクラス • Nothingはインスタンスを生成することができない • ex) 必ず例外を送出するようなメソッド • ex) 型引数が省略できないとき Nothingを指定する
39 39 ©2023 Loglass Inc. 必ず例外を送出するメソッド よりメンテナブルなエラーハンドリングに • fail() とかも適していそう
• ロギング + 例外送出 • etc…
40 ©2023 Loglass Inc. 型引数が省略できないとき よりメンテナブルなエラーハンドリングに • Resultの型引数はTとEを取る • OkはTだけでいいし、ErrorはEだけでいい
• しかし型引数は省略できないので Nothingを使う
41 ©2023 Loglass Inc. kotlin-resultの紹介 よりメンテナブルなエラーハンドリングに • サンプルコードをいくつかご紹介しました • kotlin-resultというライブラリを利用すると、
これまでのことが一瞬でできるようになります ◦ https://github.com/michaelbull/kotlin-result implementation("com.michael-bull.kotlin-result:kotlin-result:1.1.16" )
42 ©2023 Loglass Inc. kotlin-resultの紹介 よりメンテナブルなエラーハンドリングに kotlin-resultのGitHubページより引用
43 ©2023 Loglass Inc. kotlin-resultの紹介 よりメンテナブルなエラーハンドリングに
44 ©2023 Loglass Inc. まとめ
45 ©2023 Loglass Inc. 今回のサマリ まとめ 1. Kotlinに検査例外は無い 2. エラーハンドリングをする際は直和型
+ パターンマッチで Result型を設計すべし 3. kotlin-resultを導入すると、Result型をすぐに使い始められる
46 46 ©2023 Loglass Inc. 参考文献 まとめ • 代数的データ型 ◦
https://ja.wikipedia.org/wiki/代数的データ型 • kotlin-result ◦ https://github.com/michaelbull/kotlin-result • KotlinでResult型使うならkotlin-resultを使おう ◦ https://note.com/yasukotelin/n/n6d9e352c344c • Rust By Example ◦ https://doc.rust-jp.rs/rust-by-example-ja/error/opti on_unwrap/and_then.html • Scala の Option, Either とエラー処理 ◦ https://engineering.mobalab.net/2020/09/24/scala -error-handling-option-either
47