いまどきの分析設計パターン10選
#ソフトウェア設計 #値オブジェクト #ドメイン駆動設計(DDD) #イベントソーシング #宣言的プログラミング
#共有する
https://speakerdeck.com/masuda220/jjug_ccc_2024_spring
基礎編 この辺はいつもの論
値の種類
事業活動を観測して「値の種類」を特定しましょう。
そして「独自の型」として定義してビジネスルールを正確に記述しましょう。
単位と、範囲と、関係に着目する。
- 値の単位は、値の種類を分類する最も重要な手がかり。単位が変われば型も変わる
- 値の範囲はビジネスルールで決まる。範囲が変わるなら型も変わる。計算結果にも範囲がある。
- 値の関係はメソッドにより表現される。引数と戻り値を独自型で守る。
範囲
範囲を判定する際に比較演算子を使わず「範囲型」を定義してビジネスルールをカプセル化する。
金額範囲、日付範囲型などがある。
階段型
範囲型の拡張。電気料金の2段階制などが好例。
enum型で境界と適用を定義し、map型で範囲と適用を導出できるようにする。
うれしいこと:
- If文で条件を書かなくて済む
- ビジネスルールの変更がenumの定義変更で済む(ロジックを変更する必要がない)
中級編 分析パターンというより設計パターン?
状態遷移
ある状態からある状態への遷移可否判定を設計で担保する。
基本的には階段型で示したenumとmapの組み合わせ。
enumで状態とアクションを定義して、mapに展開して遷移可否を導出できるようにする。
入出金履歴と残高 ステートソーシングとイベントソーシング
p.34のイベントソーシングの例にある残高は「残高() メソッド」。導出するということ。
list型によるSnapshotからのリプレイ機能の実装例。
未来在庫 イベントソーシング②
実績(過去)と予定(未来)を別のコレクションで管理する。
また、入庫予定の確度と出庫予定の優先度を考慮すべき。(実績は事実なので考慮不要)
上級編 もはや実装例
スキルマッチング Set演算
streamのcontainsで比較演算
比例配分 割合と端数処理
割合による金額の分配を厳密に行うにあたり、割合と金額を同じロジックで処理する。
(計算を抽象化して対象を注入する)
https://scrapbox.io/files/66d41afc5aa422001c254af6.png
複合条件 デシジョンテーブル
制御文や演算子に代わって型を使う。
貨物の特性に応じたコンテナを割り当て、相応の運賃を設定する。
複数の決定因子(貨物・コンテナ)から適用(運賃)を導出する。
決定因子が単一ならenumとmapで対応していたが、複数因子では論理演算が必要。
「うれしいこと」はenum+map例と同じ。認知負荷低減と変更容易性向上。
「宣言的に書く」とはこういうことか。
経路探索 ネットワーク構造の表現と計算
隣接ペアと隣接リスト。
ユースケースがあまり思い浮かばないが、SCMネットワークなどで使うんだろうか。