Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Kotlinにおける型の世界と エラーハンドリング / Type World and Erro...

Kotlinにおける型の世界と エラーハンドリング / Type World and Error Handling in Kotlin

mako_makok

March 07, 2023
Tweet

More Decks by mako_makok

Other Decks in Programming

Transcript

  1. 2 2 ©2023 Loglass Inc. 小林 允(Makoto Kobayashi) 自己紹介 @mako_makok

    mako-makok 所属: 株式会社ログラス 好きな言語: Java, Kotlin, TypeScript 普段はSpringBootをKotlinで書いています AndroidをJavaで書いてた Luceneのパッチを書いてSolrに組み込む JavaでSpringBootやSeasar2を書いていた ログラスでSpringBootとKotlinを書いている 2017〜2018 2018〜2019 2019〜2021 2022〜
  2. 5 5 ©2023 Loglass Inc. 目次 1. Javaにおけるエラーハンドリング 2. Kotlinにおける例外処理

    3. Kotlinでのエラーハンドリング 4. よりメンテナブルなエラーハンドリングに
  3. 11 ©2023 Loglass Inc. Kotlinにおける例外 Kotlinの例外処理 • 検査例外がないので例外を無視してもコンパイルエラーにならない • throwsも無いので例外のチェックを強制するような設計は

    絶対できないようになっている • 呼び出し階層の中で例外を投げる処理を書くと ハンドリング忘れで意図しないエラーが発生する可能性がある
  4. 15 ©2023 Loglass Inc. 代数的データ構造とは Kotlinでのエラーハンドリング 代数的データ型(だいすうてきデータがた、英 : algebraic data

    type)とは プログラミング、特に関数型プログラミングや型システムにおいて使われ るデータ型である。それぞれの代数的データ型の値には、 1個以上のコ ンストラクタがあり、各コンストラクタには 0個以上の引数がある。 代数的 データ型の値(データ)の感覚的な説明としては、引数で与えられた他の データ型の値を、コンストラクタで包んだようなもの、である。コンストラク タに引数がある代数データ型は複合型(他のデータ型を組み合わせて形 成する型)である。 Wikipediaより引用: https://ja.wikipedia.org/wiki/代数的データ型
  5. 18 ©2023 Loglass Inc. 直積型 Kotlinでのエラーハンドリング data error String null

    null String null null String String 2 * 2の直積でパターンが表される
  6. 34 ©2023 Loglass Inc. and_thenの実装 よりメンテナブルなエラーハンドリングに • 関数の合成はシンタックス的に難しそう • Rustではand_then,

    ScalaではflatMapがある • どちらも同じ動きをしている • これらを模倣してみると良さそう
  7. 36 ©2023 Loglass Inc. and_thenの実装(2/3) よりメンテナブルなエラーハンドリングに • 拡張関数: fun Result.funName()

    {} と宣言することで、 クラスにメソッドが生えているかのような書き方ができる • 引数部分は関数渡し 図の場合、引数は Function<T, Result<U, E>>と同等
  8. 38 38 ©2023 Loglass Inc. Nothing型 よりメンテナブルなエラーハンドリングに • Any型の反対 •

    全てのクラスを継承したクラス • Nothingはインスタンスを生成することができない • ex) 必ず例外を送出するようなメソッド • ex) 型引数が省略できないとき Nothingを指定する
  9. 41 ©2023 Loglass Inc. kotlin-resultの紹介 よりメンテナブルなエラーハンドリングに • サンプルコードをいくつかご紹介しました • kotlin-resultというライブラリを利用すると、

    これまでのことが一瞬でできるようになります ◦ https://github.com/michaelbull/kotlin-result implementation("com.michael-bull.kotlin-result:kotlin-result:1.1.16" )
  10. 45 ©2023 Loglass Inc. 今回のサマリ まとめ 1. Kotlinに検査例外は無い 2. エラーハンドリングをする際は直和型

    + パターンマッチで Result型を設計すべし 3. kotlin-resultを導入すると、Result型をすぐに使い始められる
  11. 46 46 ©2023 Loglass Inc. 参考文献 まとめ • 代数的データ型 ◦

    https://ja.wikipedia.org/wiki/代数的データ型 • kotlin-result ◦ https://github.com/michaelbull/kotlin-result • KotlinでResult型使うならkotlin-resultを使おう ◦ https://note.com/yasukotelin/n/n6d9e352c344c • Rust By Example ◦ https://doc.rust-jp.rs/rust-by-example-ja/error/opti on_unwrap/and_then.html • Scala の Option, Either とエラー処理 ◦ https://engineering.mobalab.net/2020/09/24/scala -error-handling-option-either
  12. 47