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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
okuzawats
March 31, 2023
Programming
8.2k
9
Share
例外を投げるな、値を返せ
DroidKaigi.collect{ #1@Tokyo }(2023年3月31日)での発表資料です。
okuzawats
March 31, 2023
More Decks by okuzawats
See All by okuzawats
Androidアプリのモジュール分割における:x:commonを考える
okuzawats
1
480
「Chatwork」Android版アプリを 支える単体テストの現在
okuzawats
0
450
カンファレンス参加をいかに正当化するか
okuzawats
0
370
「勉強になった」で終わらせない、ストロングスタイルの勉強会
okuzawats
0
450
10年モノのAndroidアプリのコード品質を改善していく、3つの取り組み
okuzawats
0
1.4k
Androidアプリ開発におけるSonarCloudの活用
okuzawats
0
1.3k
何故、UseCaseは1メソッドなのか
okuzawats
3
2.3k
GitHub ActionsでAndroidアプリのテストを回しまくってたら全プロジェクトのCI/CDが完全停止する寸前だった件
okuzawats
0
710
Kotlinのifを愛でる
okuzawats
0
1.2k
Other Decks in Programming
See All in Programming
Talking to terminals (and how they talk back) (KotlinConf 2026)
jakewharton
PRO
1
140
RailsTokyo 2026#4: AI様があれば、 Hotwireの弱点は消えるか?
naofumi
5
1k
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
200
Composerを使ったサプライチェーン攻撃の様子を眺めてみる #phpstudy
o0h
PRO
2
170
TypeSpec で繋ぐ複数プロダクトの型安全
maroon8021
1
260
誰も頼んでない機能を出荷した話
zekutax
0
140
分析エージェント精度向上における データアナリストの役割
oura_shoya
0
130
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
130
AI駆動開発勉強会 広島支部 第一回勉強会 AI駆動開発概要とワークショップ
hayatoshimiu
0
400
OSもどきOS
arkw
0
250
色即是空、空即是色、データサイエンス
kamoneggi
1
200
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
270
Featured
See All Featured
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Agile that works and the tools we love
rasmusluckow
331
21k
Designing for Timeless Needs
cassininazir
1
230
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
540
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
120
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
190
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
460
Agile Actions for Facilitating Distributed Teams - ADO2019
mkilby
0
200
エンジニアに許された特別な時間の終わり
watany
107
240k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Test your architecture with Archunit
thirion
1
2.2k
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