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

B2B SaaSあるある! 一括処理のエラーハンドリングをKotlinで関数型的に処理する / Kotlin Functional Multi Error Handling

B2B SaaSあるある! 一括処理のエラーハンドリングをKotlinで関数型的に処理する / Kotlin Functional Multi Error Handling

YuitoSato

June 23, 2023
Tweet

More Decks by YuitoSato

Other Decks in Technology

Transcript

  1. 1
    ©2023 Loglass Inc.
    B2B SaaSあるある!
    一括処理のエラーハンドリングをKotlinで関
    数型的に処理する
    2023.06.23 佐藤有斗(Yuiiitoto) 株式会社ログラス

    View full-size slide

  2. 2
    ©2023 Loglass Inc.
    自己紹介
    佐藤有斗(Yuiiitoto)
    ログラス エンジニア
    前回の発表

    View full-size slide

  3. 3
    ©2023 Loglass Inc.
    ログラスについて
    企業価値を向上する

    経営管理クラウド


    View full-size slide

  4. 4
    ©2023 Loglass Inc.
    ログラスについて(5秒)
    企業価値を向上する

    経営管理クラウド


    View full-size slide

  5. 5
    ©2023 Loglass Inc.
    CSVで1000件ほど一括でデータを投入したい!
    その時に不正なデータがある場合は、複数まとめて
    表示してくれ!
    本日の要求

    View full-size slide

  6. 6
    ©2023 Loglass Inc.

    View full-size slide

  7. 7
    ©2023 Loglass Inc.
    複数行でエラーがある

    View full-size slide

  8. 8
    ©2023 Loglass Inc.
    複数行でエラーがある
    3行目: メールアドレスが空です
    4行目: 性別にひらがなを利用することはできません

    View full-size slide

  9. 9
    ©2023 Loglass Inc.
    一つの行でも複数エラーがある

    View full-size slide

  10. 10
    ©2023 Loglass Inc.
    一つの行でも複数エラーがある
    5行目: ユーザー名が空です
    5行目: メールアドレスは100文字以下で入力してください
    5行目: 性別「漢」は不正な値です

    View full-size slide

  11. 11
    ©2023 Loglass Inc.
    非常にめんどくさい

    View full-size slide

  12. 12
    ©2023 Loglass Inc.
    例外は一括処理が苦手
    ● 最初の不正なデータに出会ったら呼び出し元に戻ってしまう
    ● Kotlinには検査例外がないのでコンパイルフェーズでエラーハンドリングを強制できない

    View full-size slide

  13. 13
    ©2023 Loglass Inc.
    どうするか?

    View full-size slide

  14. 14
    ©2023 Loglass Inc.
    関数型エラーハンドリングで解決しよう

    View full-size slide

  15. 15
    ©2023 Loglass Inc.
    関数型エラーハンドリングとは
    ● いわゆるScalaのEitherやRustにおけるResult
    ● 例外ではなく型でエラーを表現する

    View full-size slide

  16. 16
    ©2023 Loglass Inc.
    詳しくはこちら(同僚のやつ)

    View full-size slide

  17. 17
    ©2023 Loglass Inc.
    Kotlinで一括処理を
    エラーハンドリングする場合は
    Arrow.ktのEitherがおすすめ
    今日特に頭の片すみに覚えてほしいこと

    View full-size slide

  18. 18
    ©2023 Loglass Inc.
    Arrow.kt

    View full-size slide

  19. 19
    ©2023 Loglass Inc.
    実際のコードをみていくぞ!
    (詳しく説明する時間はない!)

    View full-size slide

  20. 20
    ©2023 Loglass Inc.
    ユーザーの作成処理

    View full-size slide

  21. 21
    ©2023 Loglass Inc.
    ユーザーの作成処理
    ● 失敗したら複数のエラー( List)
    ● 成功したらユーザーインスタンス( User)

    View full-size slide

  22. 22
    ©2023 Loglass Inc.
    これを再現する
    5行目: ユーザー名が空です
    5行目: メールアドレスは100文字以下で入力してください
    5行目: 性別「漢」は不正な値です

    View full-size slide

  23. 23
    ©2023 Loglass Inc.
    ユーザーの作成処理(ここは雰囲気理解でダイジョブ)

    View full-size slide

  24. 24
    ©2023 Loglass Inc.
    ユーザーの作成処理(ここは雰囲気理解でダイジョブ)
    ● 各フィールドに対してバリデーション処理

    View full-size slide

  25. 25
    ©2023 Loglass Inc.
    ユーザーの作成処理(ここは雰囲気理解でダイジョブ)
    ● バリデーション結果をつかってインスタンス作成

    View full-size slide

  26. 26
    ©2023 Loglass Inc.
    各バリデーションの処理
    ● 各バリデーションは失敗したら一つのエラー、成功したら値オブジェクトを返す

    View full-size slide

  27. 27
    ©2023 Loglass Inc.
    詳しくはjskmtさんのこちら(この次に発表するらしいです)

    View full-size slide

  28. 28
    ©2023 Loglass Inc.
    複数ユーザーの保存処理

    View full-size slide

  29. 29
    ©2023 Loglass Inc.
    複数ユーザーの保存処理

    View full-size slide

  30. 30
    ©2023 Loglass Inc.
    複数ユーザーの保存処理
    ● 複数の入力から複数のユーザーを作成
    ● 行番号をエラー文に埋め込みながら、エラーの内容を更新

    View full-size slide

  31. 31
    ©2023 Loglass Inc.
    複数ユーザーの保存処理
    ● 型をちょちょいってやる
    ● 最後の最後は例外として投げる( SpringBootでよしなに処理させるため)

    View full-size slide

  32. 32
    ©2023 Loglass Inc.
    これを再現する
    3行目: メールアドレスが空です
    4行目: メールアドレスは100文字以下で入力してく
    ださい

    View full-size slide

  33. 33
    ©2023 Loglass Inc.
    話せなかったおまけ(あとで話しましょう)
    ● ログラスだと似た感じのライブラリの kotlin-result を使っている
    ● kotlin-resultだと zipOrAcummulateがなくて絶妙に使いにくい

    View full-size slide