IT実装と代数の関係 ― これだけわかれば設計ミスは半分になる
IT実装と代数の関係
― これだけわかれば設計ミスは半分になる
業務システムの設計ミスの多くは、
ロジックの誤りではありません。
例えば――
・UIイベントに業務ロジックを書きすぎて誰も直せなくなった
・トランザクションの外でDBを触って不整合が出た
・「とりあえずロック」でデッドロック地獄になった
心当たりがあるなら、それは技術不足ではありません。
扱っている構造を間違えているだけです。
本記事では、UI・トランザクション・ロック・DB設計といった
一見バラバラに見える IT 実装要素を、
代数構造(半群・モノイド・群) という一本の軸で整理します。
なぜ設計は破綻するのか
よくある設計破綻は、だいたい次のどれかです。
- UIイベントのロジックが肥大化する
- トランザクション境界が曖昧
- ロックが増えて理由が分からなくなる
- DB 更新が不可逆になり破綻する
これらはすべて
「副作用地帯」と「代数的に扱える世界」を混同している」
ことが原因です。
副作用地帯という考え方
UI・IO・ネットワーク・ユーザー操作は、
- 時間
tに依存する - 同じ操作でも結果が変わる
- 再現性がない
つまり 数学的に閉じていない世界 です。
これを本記事では 副作用地帯 と呼びます。
半群・モノイド・群で見る IT 実装
半群(Semigroup)
- 演算は合成できる
- 単位元・逆元はない
例:
- UIイベント
- イベントハンドラ
- ViewModel
- 集計処理
👉 副作用を減衰させ、「扱える演算だけ」にする層
※「合成できる」というのは
「処理を小さく分けても、順番に積める」という意味です。
モノイド(Monoid)
- 半群 + 単位元
例:
- Repository
- トランザクション単位の処理
- 空操作(No-op)
👉 操作を「まとめられる」ようになる層
※ 単位元がある=
「何もしない」を安全に表現できる、ということです。
群(Group)
- 単位元
- 逆元
- 閉包性
例:
- 群として扱うと宣言されたテーブル
- 可逆な更新
- 論理削除 + 履歴
👉 数学的に最も安定し、壊れにくい層
※ テーブルは自動的に群になるわけではありません
群として扱う制約を宣言したときにだけ群になります
トランザクションとは何か
トランザクションの定義は驚くほどシンプルです。
操作全体の時間を 0 とみなすことで、
現実世界が時間tに依存することを
その操作対象について打ち消す宣言
言い換えると、
「途中経過が観測できない世界を作る」ための宣言です。
つまり:
- 中間状態を見せない
- 一瞬の写像として扱う
これは実装技法ではなく、構造の射影です。
ロックとは何か
ロックは「排他制御」ではありません。
群の境界を一時的に閉鎖する宣言
- この集合に対する演算は、今は私だけが行う
- 群の閉包性を壊さないための装置
楽観ロックは
「境界を閉じず、事後に群条件を検証する」
というだけの違いです。
IT実装と代数構造の対応表
以下は、実務でよく出てくる概念を
「代数構造として何をしているのか」で整理した対応表です。
| IT実装・概念 | 代数的対応 | 説明 |
|---|---|---|
| UI / IO | 副作用地帯 | 時間依存・非決定 |
| UIイベント | 非閉集合 | 再現性なし |
| イベントハンドラ | 半群 | 合成は可能 |
| ViewModel | 半群 | ノイズ除去 |
| 集計処理 | 可換半群 | 順序不変 |
| Repository | モノイド | 単位元あり |
| Transaction | 時間射影 | 時間を潰す |
| Commit / Rollback | 射影確定 / 破棄 | 現実反映 |
| Lock | 群境界閉鎖 | 構造保護 |
| 楽観ロック | 事後検証 | 境界非閉鎖 |
| テーブル(素) | 集合 | まだ不安定 |
| 群として宣言されたテーブル | 群 | 可逆・閉包 |
| 破壊的 UPDATE | 群破壊 | 逆元消失 |
| 物理 DELETE | 定義域破壊 | 構造崩壊 |
| デッドロック | 境界閉鎖循環 | 演算不能 |
これを知っていると防げること
- UIに業務ロジックを書かなくなる
- トランザクション境界が自然に決まる
- ロックが「なぜ必要か」説明できる
- DB設計で不可逆操作を避けられる
つまり、
設計ミスの半分は、構造を正しく選ぶだけで消える
おわりに
この考え方は、
- 言語に依存しない
- フレームワークに依存しない
- 時代に依存しない
一度理解すれば、
同じ設計ミスを二度としなくなるはずです。
もし
「なんとなく正しい設計」に違和感を感じてきたなら、
その違和感はたぶん正しい。
構造を疑ってみてください。
Discussion