DroidKaigi.collect{ #1@Tokyo }(2023年3月31日)での発表資料です。
例外を投げるな、値を返せDroidKaigi.collect{ #1@Tokyo }
View Slide
話している人• 奥澤(@okuzawats)• Chatwork株式会社(2022年9月〜) • ビジネスチャット「Chatwork」Android版のアーキテクチャ改善業、技術負債返済業をやっています。• 好きなKotlinのスコープ関数はwithです。
今日話したいこと• 例外を投げるべきでない100の理由• 例外を投げる代わりに値を返す、たったひとつの冴えたやり方
例外は2種類に分けられる。• 回復不能な例外• 回復可能な例外
例外は2種類に分けられる。• 回復不能な例外• 回復可能な例外←
例外を投げるべきでない100の理由1. 参照透過性が失われる2. 型安全でない • 型は例外について何も語らない • コンパイラも例外の処理を呼び出し元に強制しない(Paul Chiusano, Rúnar Bjarnason, (2015))👉例外を投げる代わりに値を返すようにする。
͜͏͍͏͜ͱΛݴ͍͍ͨͷͰͳ͍ݹ͖ྑ͖C-style🕺
例外を投げる代わりに値を返す、たったひとつの冴えたやり方
正常・異常の直和を表現できる型を使う1. 独自の型を定義する2. `kotlin.Result` を使うKotlin 1.3〜。Kotlinを使っていれば使えるのがメリット。3. `arrow.core.Either` を使う高機能。arrow-ktを入れる必要があるのがデメリット。
kotlin.Result
arrow.core.Either
所感1. `arrow.core.Either` は、例外の型も関数のシグネチャに含められる点が強い。`kotlin.Result` はそれができない分少し弱い。2. とはいえ、`arrow.core.Either` はarrow-ktの一機能に過ぎず、arrow-ktを入れるとそれ以外にも大量に入ってしまう。3. 関数型に目覚めるのでなければ `kotlin.Result` で済ませるか、必要最小限の機能を持ったEitherを自分で書くくらいが落としどころかもしれない(そんなに難しいことではない)。
まとめ1. 回復可能な例外は値を返したい2. 値を返すと言っても、 `return -1` ではない3. 正常・異常を直和で表現できる型を使う4. 独自に型を定義してもいいが、既に存在する `kotlin.Result` や `arrow.core.Either` を使う手もある
参考文献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