
t0mmy
2020年12月30日に参加
学習履歴詳細
現場で役立つシステム設計の原則
やったこと
現場で役立つシステム設計の原則 4章 途中まで
学んだこと
ドメインオブジェクトの見つけ方
大前提
最初から、必要なドメインオブジェクトをすべて発見することはできない。
開発を進めながら、必要なドメインオブジェクトを見つけつつ、ドメインモデルに加えていく。
見つけ方
- 重要な関心事や関係性に注目する
- 業務の関心事を分離してみる
- コトに注目する
■重要な関心事に注目する
やみくもに探すのではなく、業務にとって重要な関心事から発見してく。
■業務の関心事を分離してみる
業務の関心事を ヒト/モノ/コトに分離する
- ヒト : 行動の主体
- 個人、企業、担当者など
- モノ : ヒトが業務を遂行する時の、関心の対象
- 商品、サービス、店舗、場所、権利、義務 など
- コト : 業務活動において発生する事象。記録や通知の対象
- 予約、注文、支払い、出荷、キャンセルなど
コトを表現するオブジェクトは、以下の一般的な属性を持つ。
- 対象 : 何についての発生した事象か
- 種別 : どういう種類の事象か
- 時点 : いつ発生した事象か
■コトに注目すると全体の関係を整理しやすい
コトは、業務の専門家であれば、無意識によって一連の事象を把握している可能性が高い。
- コトは、ヒトとモノとの関係として出現する
- コトは時間軸に沿って明確な前後関係を持つ
- 専門家が当たり前だと思っている、隠れている業務ルールが発見できる
- 業務ルールの正確な理解が、業務知識を正確に反映したドメインモデルの形成につながる
アプローチ
部品を特定し、その部品ごとに独立したクラスを設計する。
設計したクラスを組み合わせて、小さな業務ロジックを構築する。
- 組み合わせる中で、部品の調整や、不足していた部品の追加設計を行う
- 初めから全業務ロジックを扱わない
ドメインオブジェクトの設計パターン
■ドメインオブジェクトの基本の設計パターン
- 値オブジェクト
- 数値、日付、文字列をラッピングしてロジックを整理する
- コレクションオブジェクト
- コレクションをラッピングしてロジックを整理する
- 区分オブジェクト
- 区分の定義と区分ごとのロジックを整理する
- 列挙型の集合操作
- 状態遷移ルールなどを列挙型の集合として整理する
■業務の関心事パターン
- 口座パターン
- 現在の値を表現し、妥当性を管理する
- 関心の対象を「口座」として用意する
- 数値の増減の「予定」を記録する
- 数値の増減の「実績」を記録する
- 現在の口座の「残高」を算出する
- 期日パターン
- 約束の期日と判断を表現する
- 約束を実行すべき期限を設定する
- 設定した期限までに約束が適切に実行されることを監視する
- 期限切れの危険性について事前に通知する
- 期限までに実行されなかったことを検知する
- 期限切れの程度を判断する
- 方針パターン
- 様々なルールが複合する、複雑な業務ロジックを表現する
- ルールの集合を持ったコレクションオブジェクトを作る
- 状態パターン
- 状態と、状態遷移 [ 可能/不可能 ] を表現する
ドメインオブジェクトの改善
- クラス名やメソッド名の変更
- ロジックの移動
- 方針 : ドメインオブジェクトを使用する側のコードが、シンプルになるよう改良を続ける
- 取りまとめ役のクラスの導入
プログラムの自己文書化
ソースコードにて、業務の要求仕様を表現すること。
- パッケージ名 / クラス名 / メソッド名 / 変数名に、業務の用語を使用する
プログラムの意図が明確になり、どこに何が記述されているのかわかりやすくなる。
ドメインモデル設計 まとめ
ドメインモデルの設計とは ...
- 業務を学びながら、業務知識を増やし、より深く理解してく
- 学んだことをコードで表現し、ドメインオブジェクトの設計に反映させていく
業務を学びながら、早い段階から実際にコードを書き、業務知識への理解とともに段階的にコードを成長させること。
設計
2022年04月24日(日)
2.0時間