メインコンテンツまでスキップ

基本

  • 状況・状態の網羅性を コンパイラ に確認させよう
    • 人間の目 で確認することを可能な限り避けよう
  • 不整合な状況・状態を、作成不可能にしよう
    • プロパティの中身で指している状況・状態が変わったり、不整合が起きえることを避けよう
      • 絶対ではない

例題

ID:5 の投稿の内容更新の結果のハンドリング

  • 要件1: 結果によって、返すレスポンス文字列を変える
  • 要件2: バリデーションエラーメッセージは List<String> で表現
  • 要件3: 状況・状態は独立しており、 重複することはない とする
  • 要件4: 結果の種類は下記の表に記述
番号結果失敗理由失敗例レスポンス例
1失敗ID: 5 の投稿が見つかったが、権限がなかった他のユーザーの投稿だった"401: 投稿(ID: 5)の更新権限がありません"
2失敗ID: 5 の投稿が見つからなかった削除済みだった"404: 投稿(ID: 5)は見つかりませんでした"
3失敗更新内容のバリデーションエラーテキストが長すぎる"422: テキストが長すぎます"
4成功--"200: 成功です"

コード記述

Not Good
  • 状況・状態の網羅性は、 人の目 で確認する
  • 不整合なデータを 作れてしまう
    • 2つの is〇〇 フラグが両方 true なデータを 作れてしまう
data class UpdatePostResult(
val validationErrorMessages: List<String>, // 長さが 1以上であれば、バリデーションエラー
val userId: Int, // 使わなくても常に入れておく
val isUnauthorized: Boolean, // true なら権限無しエラー
val isNotFound: Boolean, // true ならNotFoundエラー
)

/**
* 投稿の更新の結果によって返すStringを変更したい
*/
fun handleUpdatePostResult(result: UpdatePostResult): String {
if (result.isUnauthorized) {
return "401: 投稿(ID: ${result.userId})の更新権限がありません"
}
if (result.isNotFound) {
return "404: 投稿(ID: ${result.userId})が見つかりませんでした"
}
if (result.validationErrorMessages.isNotEmpty()) {
return "422: ${result.validationErrorMessages!!.joinToString(",")}"
}
return "200: 成功です"
}