$30 off During Our Annual Pro Sale. View Details »

例外を投げるな、値を返せ

okuzawats
March 31, 2023

 例外を投げるな、値を返せ

DroidKaigi.collect{ #1@Tokyo }(2023年3月31日)での発表資料です。

okuzawats

March 31, 2023
Tweet

More Decks by okuzawats

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. 例外は2種類に分けられる。

    • 回復不能な例外
    • 回復可能な例外

    View Slide

  5. 例外は2種類に分けられる。

    • 回復不能な例外
    • 回復可能な例外←

    View Slide

  6. 例外を投げるべきでない100の理由

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

    View Slide

  7. View Slide

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

    View Slide

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

    View Slide

  10. 正常・異常の直和を表現できる型を使う

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

    View Slide

  11. kotlin.Result

    View Slide

  12. arrow.core.Either

    View Slide

  13. 所感

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

    View Slide

  14. まとめ

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

    View Slide

  15. 参考文献

    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

    View Slide