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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for YuitoSato YuitoSato
December 10, 2022

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

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

Avatar for YuitoSato

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