Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 ©2023 Loglass Inc. ログラスについて 企業価値を向上する
 経営管理クラウド


Slide 4

Slide 4 text

4 ©2023 Loglass Inc. ログラスについて(5秒) 企業価値を向上する
 経営管理クラウド


Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

6 ©2023 Loglass Inc.

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

18 ©2023 Loglass Inc. Arrow.kt

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

34