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
950
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
コンテキストの使い捨てをやめる — ビジネスルール駆動開発と miko —
ioki
0
140
ふつうのFeature Flag実践入門
irof
7
3.6k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
130
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
450
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.5k
Agentic UI
manfredsteyer
PRO
0
110
PHPで使える日時の表現と、その知り方 #frontend_phpcon_do
o0h
PRO
0
190
dRuby over BLE
makicamel
2
320
Copilot CLI の継戦能力を高める コンテキスト管理
nozomutu
1
1.2k
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
150
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
4.4k
OSもどきOS
arkw
0
460
Featured
See All Featured
sira's awesome portfolio website redesign presentation
elsirapls
0
270
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
240
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
200
VelocityConf: Rendering Performance Case Studies
addyosmani
333
25k
Making the Leap to Tech Lead
cromwellryan
135
9.9k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
380
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
240
The Curious Case for Waylosing
cassininazir
1
380
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
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