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
例外を投げるな、値を返せ
Search
okuzawats
March 31, 2023
Programming
9
7.4k
例外を投げるな、値を返せ
DroidKaigi.collect{ #1@Tokyo }(2023年3月31日)での発表資料です。
okuzawats
March 31, 2023
Tweet
Share
More Decks by okuzawats
See All by okuzawats
「勉強になった」で終わらせない、ストロングスタイルの勉強会
okuzawats
0
250
10年モノのAndroidアプリのコード品質を改善していく、3つの取り組み
okuzawats
0
1k
Androidアプリ開発におけるSonarCloudの活用
okuzawats
0
750
何故、UseCaseは1メソッドなのか
okuzawats
3
1.3k
GitHub ActionsでAndroidアプリのテストを回しまくってたら全プロジェクトのCI/CDが完全停止する寸前だった件
okuzawats
0
350
Kotlinのifを愛でる
okuzawats
0
260
Say good-bye to Kotlin Android Extensions
okuzawats
0
190
KDoc in a nutshell
okuzawats
0
260
Other Decks in Programming
See All in Programming
君たちはどうコードをレビューする (される) か / 大吉祥寺.pm
utgwkk
15
8.5k
CSC307 Lecture 09
javiergs
PRO
1
500
SDCon2024: Enabling DevOps and Team Topologies thru architecture: architecting for fast flow
cer
PRO
0
780
スクラムマスターって孤独じゃないですか?
yoshitaroyoyo
1
140
feature環境をGitHub ActionsとCloudFormationでいい感じに管理する
nealle
2
310
しくじり先生 Image Matching Challenge 2024 編
goosehaaan
0
810
【Go言語】golangci-lintの使い方
tomo1227
0
270
CSC307 Lecture 08
javiergs
PRO
0
330
さきがけから振り返るアーキテクチャ刷新 / Reflecting on the Architectural Renewal from the Vanguard
nrslib
2
770
英語
s_shimotori
1
220
Composing an API the *right* way (Droidcon Berlin 2024)
zsmb
1
450
Mastering Developer Experience: A Roadmap for Success 【開発生産性Conference 2024】
findyinc
1
380
Featured
See All Featured
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
129
32k
Documentation Writing (for coders)
carmenintech
63
4.2k
StorybookのUI Testing Handbookを読んだ
zakiyama
15
4.9k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
360
22k
Navigating Team Friction
lara
181
13k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
502
140k
How To Stay Up To Date on Web Technology
chriscoyier
784
250k
The Straight Up "How To Draw Better" Workshop
denniskardys
229
130k
Leading Effective Engineering Teams 2024
addyosmani
3
300
Principles of Awesome APIs and How to Build Them.
keavy
124
16k
Making the Leap to Tech Lead
cromwellryan
127
8.7k
Producing Creativity
orderedlist
PRO
340
39k
Transcript
例外を投げるな、値を返せ DroidKaigi.collect{ #1@Tokyo }
話している人 • 奥澤(@okuzawats) • Chatwork株式会社(2022年9月〜) • ビジネスチャット「Chatwork」Android版のアーキテクチャ改善業、技術負債返済業をやっています。 • 好きなKotlinのスコープ関数はwithです。
今日話したいこと • 例外を投げるべきでない100の理由 • 例外を投げる代わりに値を返す、たったひとつの冴えたやり方
例外は2種類に分けられる。 • 回復不能な例外 • 回復可能な例外
例外は2種類に分けられる。 • 回復不能な例外 • 回復可能な例外←
例外を投げるべきでない100の理由 1. 参照透過性が失われる 2. 型安全でない • 型は例外について何も語らない • コンパイラも例外の処理を呼び出し元に強制しない (Paul
Chiusano, Rúnar Bjarnason, (2015)) 👉例外を投げる代わりに値を返すようにする。
None
͜͏͍͏͜ͱΛݴ͍͍ͨͷͰͳ͍ ݹ͖ྑ͖C-style🕺
例外を投げる代わりに値を返す、 たったひとつの冴えたやり方
正常・異常の直和を表現できる型を使う 1. 独自の型を定義する 2. `kotlin.Result<T>` を使う Kotlin 1.3〜。Kotlinを使っていれば使えるのがメリット。 3. `arrow.core.Either<Throwable,
T>` を使う 高機能。arrow-ktを入れる必要があるのがデメリット。
kotlin.Result<T>
arrow.core.Either<Throwable, T>
所感 1. `arrow.core.Either<Throwable, T>` は、例外の型も関数のシグネチャに含められる点が強い。`kotlin.Result<T>` はそれができない分少し弱い。 2. とはいえ、`arrow.core.Either<Throwable, T>` はarrow-ktの一機能に過ぎず、arrow-ktを入れるとそれ以外にも大量に入ってしまう。
3. 関数型に目覚めるのでなければ `kotlin.Result<T>` で済ませるか、必要最小限の機能を持ったEitherを自分で書くくらいが落としどころかもしれない(そんなに難しいことではない)。
まとめ 1. 回復可能な例外は値を返したい 2. 値を返すと言っても、 `return -1` ではない 3. 正常・異常を直和で表現できる型を使う
4. 独自に型を定義してもいいが、既に存在する `kotlin.Result<T>` や `arrow.core.Either<Throwable, T>` を使う手もある
参考文献 1. arrow.core.Either, retrieved from https://arrow-kt.io/docs/apidocs/arrow-core/arrow.core/-either/ 2. kotlin.Result, https://kotlinlang.org/api/latest/jvm/stdlib/kotlin/-result/ 3.
Paul Chiusano, Rúnar Bjarnason, (2015), Scala関数型デザイン&プログラミング, インプレス 4. Keishin Yokomaku, (2023), KotlinでEitherしたい, retrieved from https://speakerdeck.com/keithyokoma/either-in-kotlin