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

型だけでバグを減らそう! Kotlinの型パワーを使った実践タイプセーフエンジニアリング

YuitoSato
December 10, 2022

型だけでバグを減らそう! Kotlinの型パワーを使った実践タイプセーフエンジニアリング

Kotlin Fest 2022の登壇内容のスライドです。

YuitoSato

December 10, 2022
Tweet

More Decks by YuitoSato

Other Decks in Technology

Transcript

  1. 4 ©2022 Loglass Inc. 目次 • なぜ型を使いこなすことでバグが減るのか? • 型によってバグが減らせるパターン 1.

    標準の型をラップする 2. 認可処理などの特定の処理をパスしたことを型で示す 3. 型でデータの不整合をなくす • まとめ • 最後に: タイプセーフなポストモーテム
  2. 5 ©2022 Loglass Inc. 目次 • なぜ型を使いこなすことでバグが減るのか? • 型によってバグが減らせるパターン 1.

    標準の型をラップする 2. 認可処理などの特定の処理をパスしたことを型で示す 3. 型でデータの不整合をなくす • まとめ • 最後に: タイプセーフなポストモーテム
  3. 9 ©2022 Loglass Inc. ぬるぽ、ガッ!   Λ_Λ  \\   ( ・∀・)   | | ガッ  と    )   

    | |    Y /ノ    人     / )    <  >_Λ∩   _/し' //. V`Д´)/  (_フ彡        / ←>>1 NullPointerExceptionが起きる
  4. 14 ©2022 Loglass Inc. では、なぜKotlin? • Kotlinは型に関する機能が豊富 ◦ Generics ◦

    型推論 ◦ Smart Cast ◦ 代数的データ型 ◦ 高階関数やラムダ ◦ Delegation などなど
  5. 16 ©2022 Loglass Inc. 型によってバグが減らせるパターン • なぜ型を使いこなすことでバグが減るのか? • 型によってバグが減らせるパターン 1.

    標準の型をラップする 2. 認可処理などの特定の処理をパスしたことを型で示す 3. 型でデータの不整合をなくす • まとめ • 最後に: タイプセーフなポストモーテム
  6. 17 ©2022 Loglass Inc. 標準の型をラップする • なぜ型を使いこなすことでバグが減るのか? • 型によってバグが減らせるパターン 1.

    標準の型をラップする 2. 認可処理などの特定の処理をパスしたことを型で示す 3. 型でデータの不整合をなくす • まとめ • 最後に: タイプセーフなポストモーテム
  7. 34 ©2022 Loglass Inc. 認可処理などの特定の処理をパスしたことを型で示す • なぜ型を使いこなすことでバグが減るのか? • 型によってバグが減らせるパターン 1.

    標準の型をラップする 2. 認可処理などの特定の処理をパスしたことを型で示す 3. 型でデータの不整合をなくす • まとめ • 最後に: タイプセーフなポストモーテム
  8. 53 ©2022 Loglass Inc. コンストラクタの可視性を data classで制御する • インスタンスを作成できない interface

    AuthorizedTaskIdを定義する sealed を使えば同ファイルからしか継承できない
  9. 54 ©2022 Loglass Inc. コンストラクタの可視性を data classで制御する • コンストラクタ機能だけの data

    classをprivateで定義する private classは同ファイルからしか参照できない
  10. 61 ©2022 Loglass Inc. 型でデータの不整合をなくす • なぜ型を使いこなすことでバグが減るのか? • 型によってバグが減らせるパターン 1.

    標準の型をラップする 2. 認可処理などの特定の処理をパスしたことを型で示す 3. 型でデータの不整合をなくす • まとめ • 最後に: タイプセーフなポストモーテム
  11. 68 ©2022 Loglass Inc. sealed class を導入する • sealed class

    + object, data classのパターンはEnumのように扱える
  12. 69 ©2022 Loglass Inc. sealed class を導入する • Enumだとこうなる •

    objectはEnumとほぼ同じ扱いで、data classはEnum + 構造体というような振る舞い
  13. 77 ©2022 Loglass Inc. OSS: kotlin-resultの事例 • NGパターン: nullableな value

    と errorを持っているわけではないことに注意
  14. 79 ©2022 Loglass Inc. まとめ • なぜ型を使いこなすことでバグが減るのか? • 型によってバグが減らせるパターン 1.

    標準の型をラップする 2. 認可処理などの特定の処理をパスしたことを型で示す 3. 型でデータの不整合をなくす • まとめ • 最後に: タイプセーフなポストモーテム
  15. 81 ©2022 Loglass Inc. まとめ • 型によってバグが減らせるパターン 1. 標準の型をラップする →

    genericsで型の増加を抑制しよう 2. 認可処理などの特定の処理をパスしたことを型で示す → コンストラクタの可視性を data classを使ってコントロールしよう 3. 型でデータの不整合をなくす → sealed classでデータの不整合をなくそう
  16. 82 ©2022 Loglass Inc. 最後に: タイプセーフなポストモーテム • なぜ型を使いこなすことでバグが減るのか? • 型によってバグが減らせるパターン

    1. 標準の型をラップする 2. 認可処理などの特定の処理をパスしたことを型で示す 3. 型でデータの不整合をなくす • まとめ • 最後に: タイプセーフなポストモーテム
  17. 87