Slide 1

Slide 1 text

例外を投げるな、値を返せ DroidKaigi.collect{ #1@Tokyo }

Slide 2

Slide 2 text

話している人 • 奥澤(@okuzawats) • Chatwork株式会社(2022年9月〜) • ビジネスチャット「Chatwork」Android版のアーキテクチャ改善業、技術負債返済業をやっています。 • 好きなKotlinのスコープ関数はwithです。

Slide 3

Slide 3 text

今日話したいこと • 例外を投げるべきでない100の理由 • 例外を投げる代わりに値を返す、たったひとつの冴えたやり方

Slide 4

Slide 4 text

例外は2種類に分けられる。 • 回復不能な例外 • 回復可能な例外

Slide 5

Slide 5 text

例外は2種類に分けられる。 • 回復不能な例外 • 回復可能な例外←

Slide 6

Slide 6 text

例外を投げるべきでない100の理由 1. 参照透過性が失われる 2. 型安全でない • 型は例外について何も語らない • コンパイラも例外の処理を呼び出し元に強制しない (Paul Chiusano, Rúnar Bjarnason, (2015)) 👉例外を投げる代わりに値を返すようにする。

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

͜͏͍͏͜ͱΛݴ͍͍ͨͷͰ͸ͳ͍ ݹ͖ྑ͖C-style🕺

Slide 9

Slide 9 text

例外を投げる代わりに値を返す、 たったひとつの冴えたやり方

Slide 10

Slide 10 text

正常・異常の直和を表現できる型を使う 1. 独自の型を定義する 2. `kotlin.Result` を使う Kotlin 1.3〜。Kotlinを使っていれば使えるのがメリット。 3. `arrow.core.Either` を使う 高機能。arrow-ktを入れる必要があるのがデメリット。

Slide 11

Slide 11 text

kotlin.Result

Slide 12

Slide 12 text

arrow.core.Either

Slide 13

Slide 13 text

所感 1. `arrow.core.Either` は、例外の型も関数のシグネチャに含められる点が強い。`kotlin.Result` はそれができない分少し弱い。 2. とはいえ、`arrow.core.Either` はarrow-ktの一機能に過ぎず、arrow-ktを入れるとそれ以外にも大量に入ってしまう。 3. 関数型に目覚めるのでなければ `kotlin.Result` で済ませるか、必要最小限の機能を持ったEitherを自分で書くくらいが落としどころかもしれない(そんなに難しいことではない)。

Slide 14

Slide 14 text

まとめ 1. 回復可能な例外は値を返したい 2. 値を返すと言っても、 `return -1` ではない 3. 正常・異常を直和で表現できる型を使う 4. 独自に型を定義してもいいが、既に存在する `kotlin.Result` や `arrow.core.Either` を使う手もある

Slide 15

Slide 15 text

参考文献 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