moNo’s note

最近読んだ本,観た映画など,気ままにメモします.

ドメイン駆動設計入門 ボトムアップでわかる! ドメイン駆動設計の基本/成瀬允宣(Masanobu Naruse)

オブジェクト指向プログラミングにおける設計手法の一つ,ドメイン駆動設計の入門書. 解決したい課題の環境=Domainとそれを構成する要素=Domain objectを基本単位として,アプリケーションをボトムアップ的に組み上げていく. キモは,Domain objectが,どういった性質やルールをもつのかという知識,つまり抽象度の高い概念を集約し,その他の抽象度の低い実装上のあれこれとは切り分ける点. 提唱されたのは2003年頃らしい(p.14). 本の構成としては,ユーザー管理アプリケーションを題材として,Domain objectから出発し,デザインパターンを道具としてボトムアップに改善していく. ドメイン駆動開発設計の雰囲気を知るのに向いていて,本格的に知りたい場合には物足りない程度.

個人的には,オブジェクト指向のあれこれを再認識しつつ,ドメイン駆動開発の雰囲気を知れる一冊だった. 結城浩さんのデザインパターン入門に出てきたもの,出てこなかったものもあり.

基本要素:Domain object, Domain Service, Repository

value object

性質 1. 不変(メモリに書き込まれた値は変更されることはない) 2. 交換可能(メモリの参照先を変えることで値が変わる) 3. 等価性によって比較(属性の値で比較)

作成基準 1. ルールが存在しているか?(名前,なら性+名,など) 2. 単体で扱いたいか?

Entity

性質 1. 可変 2. 同じ属性であっても区別される(固有IDのイメージ) 3. 同一性により区別される

作成基準 * ライフサイクルがある(例=ユーザー)

Domain Service

  • ドメインオブジェクト」を扱うサービス.アプリケーション層と区別

作成基準 * 迷いが生じたらまずはEntityかvalue object.なるべく利用しない

Repository

  • 保存・復元を担うbridge役
  • SQL, InMemoryなどを柔軟に切り替え

(なんとなく)分かったこと

  • domain objectを外部から操作されたくなければ,Application Serviceのみ公開.objectを値のみを持たせたData Transfer Objectを返すなど.
  • タスク依頼時はcommand objectを渡すことで,値の組み合わせ事にmethodを分割せず,単一メソッドの中で場合分け,集約できる
  • エラーは処理続行OK,例外は処理を止める
  • 凝縮度の計算方法Lack Of Cohesion in Methods:全ての属性がメソッドで使われてる状態が最もよく,メソッドごとに属性が独立なら分けることを検討する.
  • 依存関係逆転の原則(Dependency Inversion Principle)
    1. 上位レベルのモジュールは下位レベルのモジュールに依存してはならない.どちらのモジュールも抽象に依存すべきである
    2. 抽象は,実装の詳細に依存してはならない.実装の詳細が抽象に依存するべきである →できていないなぁ...
  • ファクトリの検討:コンストラクタ内で他オブジェクトを生成する
  • アーキテクチャ:レイヤード(上から下へ), ヘキサゴナル(adapterの用意),クリーン(ヘキサゴナル+Port実装の具体化あり)
  • 実務の人々との対話・ユビキタス言語:共通語・共通認識,が結局は重要

分かっていないこと

  • デメテルの法則 メソッドを呼び出すオブジェクト:オブジェクト自身,引数として渡されたオブジェクト,インスタンス変数,直接インスタンス化したオブジェクト → 飲み込み切れてない
  • transaction:lockとの違い不明
  • singleton vs static:ポリフォーリズム(継承元のクラスに継承先クラスが代入できる?)の恩恵を受けたければsingleton

使用したことがない

  • Optional型:基本はクラスTだが,nullを含む可能性があることを明示
  • 遅延実行(IEnumerable型?):オブジェクトを実体化させるべき時点まで処理しない