t0mmy

2020年12月30日に参加

学習履歴詳細

現場で役立つシステム設計の原則

やったこと

現場で役立つシステム設計の原則 4章 途中まで

学んだこと

ドメインオブジェクトの見つけ方

大前提

最初から、必要なドメインオブジェクトをすべて発見することはできない。
開発を進めながら、必要なドメインオブジェクトを見つけつつ、ドメインモデルに加えていく。

見つけ方

  • 重要な関心事や関係性に注目する
  • 業務の関心事を分離してみる
    • コトに注目する

■重要な関心事に注目する

やみくもに探すのではなく、業務にとって重要な関心事から発見してく。

■業務の関心事を分離してみる

業務の関心事を ヒト/モノ/コトに分離する

  • ヒト : 行動の主体
    • 個人、企業、担当者など
  • モノ : ヒトが業務を遂行する時の、関心の対象
    • 商品、サービス、店舗、場所、権利、義務 など
  • コト : 業務活動において発生する事象。記録や通知の対象
    • 予約、注文、支払い、出荷、キャンセルなど

コトを表現するオブジェクトは、以下の一般的な属性を持つ。

  • 対象 : 何についての発生した事象か
  • 種別 : どういう種類の事象か
  • 時点 : いつ発生した事象か

■コトに注目すると全体の関係を整理しやすい

コトは、業務の専門家であれば、無意識によって一連の事象を把握している可能性が高い。

  • コトは、ヒトとモノとの関係として出現する
  • コトは時間軸に沿って明確な前後関係を持つ
  • 専門家が当たり前だと思っている、隠れている業務ルールが発見できる
    • 業務ルールの正確な理解が、業務知識を正確に反映したドメインモデルの形成につながる

アプローチ

部品を特定し、その部品ごとに独立したクラスを設計する。

設計したクラスを組み合わせて、小さな業務ロジックを構築する。

  • 組み合わせる中で、部品の調整や、不足していた部品の追加設計を行う
  • 初めから全業務ロジックを扱わない

ドメインオブジェクトの設計パターン

■ドメインオブジェクトの基本の設計パターン

  • 値オブジェクト
    • 数値、日付、文字列をラッピングしてロジックを整理する
  • コレクションオブジェクト
    • コレクションをラッピングしてロジックを整理する
  • 区分オブジェクト
    • 区分の定義と区分ごとのロジックを整理する
  • 列挙型の集合操作
    • 状態遷移ルールなどを列挙型の集合として整理する

■業務の関心事パターン

  • 口座パターン
    • 現在の値を表現し、妥当性を管理する
    • 関心の対象を「口座」として用意する
    • 数値の増減の「予定」を記録する
    • 数値の増減の「実績」を記録する
    • 現在の口座の「残高」を算出する
  • 期日パターン
    • 約束の期日と判断を表現する
    • 約束を実行すべき期限を設定する
    • 設定した期限までに約束が適切に実行されることを監視する
    • 期限切れの危険性について事前に通知する
    • 期限までに実行されなかったことを検知する
    • 期限切れの程度を判断する
  • 方針パターン
    • 様々なルールが複合する、複雑な業務ロジックを表現する
    • ルールの集合を持ったコレクションオブジェクトを作る
  • 状態パターン
    • 状態と、状態遷移 [ 可能/不可能 ] を表現する

ドメインオブジェクトの改善

  • クラス名やメソッド名の変更
  • ロジックの移動
    • 方針 : ドメインオブジェクトを使用する側のコードが、シンプルになるよう改良を続ける
  • 取りまとめ役のクラスの導入

プログラムの自己文書化

ソースコードにて、業務の要求仕様を表現すること。

  • パッケージ名 / クラス名 / メソッド名 / 変数名に、業務の用語を使用する

プログラムの意図が明確になり、どこに何が記述されているのかわかりやすくなる。

ドメインモデル設計 まとめ

ドメインモデルの設計とは ...

  1. 業務を学びながら、業務知識を増やし、より深く理解してく
  2. 学んだことをコードで表現し、ドメインオブジェクトの設計に反映させていく

業務を学びながら、早い段階から実際にコードを書き、業務知識への理解とともに段階的にコードを成長させること。

設計

2022年04月24日(日)

2.0時間