読書感想「図解でなっとく！トラブル知らずのシステム設計　エラー制御・排他制御編」

# 書籍
著：野村総合研究所
日経BP社

# 読もうと思った動機
仕事で排他制御の話があり、それについて理解を深めたいので本書を選びました。


# 印象に残った部分


## エラーチェックの種類 p17 p25

エラーチェックは大別して
単項目チェック、複数項目関連チェック、業務タイミング、その他とある。

PL:Presentation Logic
BL:Buisiness Logic



```plantuml
@startuml シーケンス図_サンプル
title  エラーの種類
autonumber

participant gui as "GUI"
box PL
 participant PL_main as "receive_request\nor\nsend_response"
 participant "simple_item\ncheck"  #lightgreen
endbox

box BL
 participant "multiple_item\nrelated_check" #lightgreen
 participant "buisiness\ncheck"  #lightgreen
 participant BL as "Business\nLogic"
endbox

database DB

gui --> PL_main:send request
activate PL_main
PL_main --> "simple_item\ncheck":execute\nsimple itemcheck

' 分岐
alt#Gold #LightBlue simple item check in PL\nSuccessful case
"simple_item\ncheck" --> "multiple_item\nrelated_check":call BL class and\nexcute multiple_item\nrelated_check
else #Pink Failure
"simple_item\ncheck" --> gui:display error message
end

alt#Gold #LightBlue multiple item check in BL\nSuccessful case
"multiple_item\nrelated_check" --> "buisiness\ncheck":execute \nbuisiness check
else #Pink Failure
"multiple_item\nrelated_check" --> gui:display error message
end

alt#Gold #LightBlue buisiness check in BL\nSuccessful case
"buisiness\ncheck" --> BL:execute buisiness logic
else #Pink Failure
"buisiness\ncheck" --> gui:display error message
end
BL --> DB:Excute SQL
activate BL
DB --> BL:send SQL Result
BL --> PL_main
deactivate BL
PL_main --> gui:send Response
deactivate PL_main
@enduml
```


ライフライン名|説明|実装方法
------------|---|---
GUI|ブラウザで表示される部分|""
receive_reqeust(略)|PLでリクエスト、レスポンスを処理する部分|""
単項目チェック</br>(simple_item_check)|PLで実行 </br>入力項目ごとに、入力規則通りかをチェックする処理</br>型、桁数、書式、必須、文字コードなどが入力規則通りであること|""
複数項目関連チェック</br>multiple_item_related_check|BLで実行</br>関連のある複数項目間の整合性チェックする処理</br> 画面内項目間の入力内容の整合性が保たれていること|""
業務チェック</br>buisiness check|BLで実行</br>業務のチェック、他システム連携、データベース連携|""
DB|RDBMS。ストアドにBL使うならより詳細に書く必要あり|""




## エラー後挙動の３パターン p60


名称|説明|単項目チェック?|複数項目関連チェック?|業務チェック?|その他
----|---|-------------|-------------------|-----------|-----
再入力パターン|利用者が入力誤りを訂正して再実行することで、エラーを解決できるパターン|◯|◯|◯|最も多いパターン
やり直しパターン|単純な再入力では解決できず、エラーの起点処理に戻ってやり直すことで解決するパターン|☓|☓|☓|セッションタイムや排他エラーで使われる
お手上げパターン|利用者では解決できない問題が発生したパターン|☓|☓|☓|システムダウンやネットワークエラー



## 排他制御の種類 楽観 or 悲観
・排他制御とは、システムを複数の利用者が同時に操作するような場合一貫して、処理するために必要な制御機構

・楽観的ロック：対象のテーブルにロックキーという属性を加え、データを更新するたびにロックキーを更新する。

・ロックキーについて、タイムスタンプよりバージョンキーにしたほうが良い。タイムスタンプの最小単位が１秒、１分の場合エラーになる場合がある。

todo 楽観ロックされる様子をアクティビティ図かシーケンス図で書く

## 楽観ロックの実装方法  p169
バージョン比較、タイムスタンプ比較、全列データ比較


# 実践できること or 感想
業務システムのシステム設計の本です。初心者向けです。
この本とても良いですね。何が良いって業務システム開発でつまづきやすい箇所（エラー設計、排他処理設計）が書かれているという点が良いですね。あと分かり易くするため工夫が随所に盛り込まれてるのも良きですね。正直言ってこの本に感動しました。

惜しいと思う箇所は、参考書籍が紹介されていないことです。
もっと掘り下げたい項目の関連書籍があれば尚良かったです。

今の自分に難しかったのは複数画面のエラー処理と、悲観ロック以降は難しかったですね。
後で再チャレンジしたいですね。

## 実践すること
本の内容を全部頭に叩き込んでおきたいです。

### 検証環境を作って簡単な再現デモをできる状態にしておく
さっと見せられるような再現デモを用意しときたいですね。
HTML+JSでDocker無し簡単な
腐りにくそうな知識で、作っとけば何回も再利用できそうだからやる価値は有ると思います。

### エラー処理再現デモについて
・シーケンス図とアクティビティ図を書く
・エラー発生後の挙動３パターンを実装する
・htmlファイル（HTML＋JS）で再現する。動作環境をブラウザのみにする。

### 楽観ロック再現デモについて
・シーケンス図とアクティビティ図を書く
・楽観ロックの実装パターンを実際に作って検証する
・動作環境はとりあえず、素のphp+postgres(Docker)　
　DBあるからやっぱりDocker必要になるかな。SQLiteで代用できるか？？？
  docker使わない方法はないだろうか

### 悲観ロックについて
上の楽観ロックできるようになってから考えます。