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における型の世界と エラーハンドリング / Type World and Erro...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
960
Slack_API_Wrapper_BoltでBotを爆速開発.pdf
makomakok
0
360
退屈なことはバッチにやらせよう
makomakok
1
650
Firebase + BoltではじめるSlackアプリ開発
makomakok
0
15k
Other Decks in Programming
See All in Programming
LaravelLive Japan の裏方のすべて — 第188回 PHP勉強会@東京 (2026-06-24)
suguruooki
2
130
Vite+ Unified Toolchain for the Web
naokihaba
0
360
どこまでゆるくて許されるのか
tk3fftk
0
270
はてなアカウント基盤 State of the Union
cockscomb
1
980
その問い、本当に正しいですか?AI時代のエンジニアに必要な哲学と認知科学 / ai-philosophy-cognitive-science
minodriven
14
6.4k
Agentic UI
manfredsteyer
PRO
0
200
AIで効率化できた業務・日常
ochtum
0
150
才能?センス?知らん、 続けたもん勝ちだ。-- 結婚・出産・癌を越えてなお、私がプロダクトを創り続ける理由
16bitidol
1
540
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
370
Datadog × OpenTelemetry 入門と実践のあいだ
kn_to_maxpno
1
180
Mujeres en SEO Summit 2026 - Greatest Disaster Hits en Web Performance
guaca
0
210
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.1k
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
440
It's Worth the Effort
3n
188
29k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
230
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
750
Code Review Best Practice
trishagee
74
20k
WCS-LA-2024
lcolladotor
0
660
The Cost Of JavaScript in 2023
addyosmani
55
10k
Optimizing for Happiness
mojombo
378
71k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
350
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
10k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
290
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