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
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
370
退屈なことはバッチにやらせよう
makomakok
1
650
Firebase + BoltではじめるSlackアプリ開発
makomakok
0
15k
Other Decks in Programming
See All in Programming
今さら聞けない .NET CLI
htkym
0
130
yield再入門 #phpcon
o0h
PRO
0
740
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
310
継続モナドとリアクティブプログラミング
yukikurage
3
640
Haskell/Servantを通してWebミドルウェアを捉え直す
pizzacat83
1
610
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
360
What's New in Android 2026
veronikapj
0
200
エンジニア向け会社紹介/Findy Company Profile
findyinc
6
360k
壊れたパーサから始める関数型設計と構成的なパーサ #fp_matsuri
raiga0310
2
400
AI がコードを書く時代における新卒エンジニアの仕事風景 (2026) / New Graduate Engineers in the Era of AI Coding (2026)
sushichan044
0
240
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
150
Foundation Models frameworkで画像分析
ryodeveloper
1
140
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.6k
KATA
mclloyd
PRO
35
15k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
200
Automating Front-end Workflow
addyosmani
1370
210k
Building an army of robots
kneath
306
46k
Prompt Engineering for Job Search
mfonobong
0
380
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
190
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
470
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.5k
My Coaching Mixtape
mlcsv
0
180
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
310
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