<< ドメイン駆動設計に分析パターンを利用する | main | 分析パターン : これだけは覚えておこう >>

分析パターンはドメイン駆動設計のヒント

昨日の記事、自分で読み返した。「分析パターン」をネガティブに書きすぎた。
自分は、もっと、分析パターンを積極的に使っている。

そういう前向き(?)な内容で、改めて、分析パターンの利用について。

Entities パターンのヒント


Domain-Driven Design(DDD)の Entities パターンで実現するドメインオブジェクトって、もうちょっと具体的に言うと、何があるんだろう?

・エンタープライズアプリケーションで、「識別」したいものは何?
・識別の単位は?(みじんぎり、それとも、どーんとひとかたまり?)

初期のモデルのネタ探しとか、開発中に、モデルに違和感がでてきた時の、別案さがしとかに、分析パターン本は、役に立つ。

クラス名のヒント集として使える。

Hruby の「ビジネスパターンによるモデル駆動設計」


Entity を、さらに三種類に分けている。

Resource, Event, Agent の三つ。 ( REA パターン )

Resourceは、経済的に価値がある何か。当然、ビジネスでは「管理」する対象。
「製品」「サービス」「お金」「労働力」「ツール」など。

Agent は、経済活動をする主体。
「顧客」「ベンダー」「従業員」「企業」など。

Event は、リソースの価値が増減したことの記録。
「販売」「出荷」「支払」「入金」とか。

重要なビジネスの関心ごとなので、それぞれのオブジェクトに「識別情報」をつけて、追跡する必要がある。

Agent が、Resource を対象に、何かアクションを起こす ( Event )。

これをデータ化して、追跡するのが、エンタープライズアプリケーションの基本構造、という考え方。
本の中では、もっと具体的に、

・注文、出荷、返品、...
・融資、保険、賃貸、保証、...
・生産、輸送
・サービス提供(サービスの生産と消費)
・人の管理
・教育、税金
・マーケティングと宣伝
・廃棄物
・電力
...

など、いろいろな問題領域を、 REA モデルで表現するパターンを取り上げている。

それぞれの領域の

・使用する Resource オブジェクトの例
・登場する Agent オブジェクトの例
・発生する Event オブジェクトの例

がいろいろ載っている。

DDD のEntities パターンに対応するパターンとして、「Identification(識別) パターン」がでてきます。「名前」による識別、識別番号の発行、外部発行の識別番号の利用、などが説明されている。

「識別」がビジネスの重要な関心事である、という点、中身の具体的な議論も、かなり近い。
(ビジネスパターンの筆者は、本を書くにあたって、DDD を参考にしたことを明言しています)。

ファウラーの「アナリシスパターン」


Entities パターンに直接対応するのは、5章の「(ドメイン)オブジェクトへの参照」ですね。
内容はとうぜん「識別」です。「名前」とか、識別体系の考え方のヒントがいろいろある。

第2章「責任関係」は、ビジネスパターンの Agent (経済活動の主体)として、「企業」、「部門」、「個人」などを Entity の候補として説明している。

Hruby の「ビジネスパターン」にも「責任パターン」がでてきます。問題意識はいっしょですね。

面白いのは、「役職」オブジェクトの導入。「個人」ではなく「営業部長」というオブジェクトを作ると解決する問題もいろいろあるよ、という内容。

こういう感じで、

第4章「企業財務の観測」
第6章「在庫管理と会計」
第7章「会計モデルの利用」
第8章「計画」
第9章「金融商品の取引」
第10章「金融派生商品」

など、それぞれの問題領域ごとに、Entity の候補になる「モノ」とか「コト」を表すパターンの説明が続く。

Hruby の「ビジネスパターン」は、会計モデルがベースなので、ファウラーの「アナリシスパターン」の4章、6章、7章と、問題意識は同じ。
問題の捉え方とか、モデルでの表現は、共通するところと、全くことなるところがあって、なかなか興味深い。

「アナリシスパターン」は、章のタイトルだけ見ると、特殊な問題領域に見えても、読んでみる価値はある。

例えば、10章の「オプション取引」は、「予約」とか、「権利の取得」と「権利の行使」という、いろいろな問題領域に登場し、ちょっと扱いにくそうなテーマのドメインオモデリングのヒントがいろいろ載っている。

ニコラの「ストリームラインオブジェクトモデリング」


この本は、Entity は、7種類だけ、という、だいたんな、モデリング論。
ビジネスの関心事は、突き詰めると、7つだけ、という考え方。

・人
・場所
・モノ
・モノの集合体
・トランザクション
・トランザクションの集合体
・前のトランザクションをフォローするトランザクション

Hruby の「ビジネスパターン」だと、Agent が、人。
Resource は、場所、モノ、モノの集合体。
Event が、トランザクション、という対応ですね。

それぞれのオブジェクト間の関係(協調パターン)も、12種類に限定できる、と言い切っている。

7種類の Entity (ドメインオブジェクト)を、12種類の協調パターンで関係づければ、良いドメインモデル が簡単(?)に、できるよ、というモデリング論ですね。

パターンカタログというより、モデリングの方法論であり哲学、という感じ。
私の使い方は、パターンカタログであり、ヒント集です...

DDD の Conceptual Contours (概念の輪郭)パターン


DDD の9章では、このパターンの実践方法は、主に、業務の専門家との対話とリファクタリングになっている。

分析パターン本は、ビジネスの概念・関心事は、こういうオブジェクトで表現する、というネタが満載。

Hruby の「ビジネスパターン」だと、主に「会計」を切り口にした「ドメインオブジェクト」を具体的にいろいろ説明している。

「期日」「説明」「通知」「転記」「分類」など、エンタープライズアプリケーションの基本課題についての、ドメインモデリングのネタがいろいろ登場する。

ファウラーの「アナリシスパターン」も、先ほどの「役職」そのものをドメインオブジェクトにするとかのネタがあちこちにちりばめられている。

ニコラの「ストリームラインオブジェクトモデル」は、ビジネスの概念の形は、7種類の Entity と、12種類の協調パターンで、表現できるよ、というところまで振り切っちゃっている。

「ビジネスパターン」も「アナリシスパターン」も「ストリームライン」も、エンタープライズアプリケーション分野での経験・知見をかき集めて、整理してものだから、ビジネスドメインの「概念の輪郭」をシャープに描いたオブジェクトが満載されている。

DDD の Conceptual Contours(概念の輪郭)パターンのヒントの宝庫ですね。

あと、Value Objects パターンの実践ネタとして、「アナリシスパターン」の付録Aの「基本型」(Money, Date, DateRange, ... ) は、参考になります。

ただし、分析パターンは、汎用的に抽象化されているので、注意が必要。
今、開発しているソフトウェアの問題領域には「最適」ではない。

パターン本で見つけたヒントを手がかりに、現在の問題領域に「特殊化」したモデリング、設計・実装が必要ですね。

DDD 9章 Making Implicit Concepts Explicit (あいまいな概念を明確にする)


エバンスがDDD で「どうやってオブジェクトにすればよいか、わかりにく概念」として「制約」とか「手順」とをあげている。

DDD では、どうやって、モデリングし、設計・実装するかの具体例がほとんど書いてない。

分析パターン本は、あたりまえだけど、ビジネスのルール、制約や業務手順のモデリングのヒントが満載。

Hruby の「ビジネスパターン」


この本では「制約」を「方針レベル」として9つのパターンで説明している。

・Policy (決め事を表現するオブジェクト)
・Type, Group, Linkage, Responsibility, Custoday (オブジェクト間を関連づける概念のオブジェクト化)
・Commitment, Contract, Schedule ( 将来の行動についての制約を表すオブジェクト)

また、業務の手順というか、ビジネス活動の行動を「振舞パターン」として12のパターンでモデル化している。

・識別する、分類する
・場所の指定、期日の指定
・転記、勘定、請求権、照合 (会計活動)
・説明、注釈、価値の表現
・通知

こういうビジネス活動の振舞を、どんなドメインオブジェクトで表現するかのパターン集です。

ファウラーの「アナリシスパターン」


「手順」については、第8章の「計画」で、さまざまなモデリングパターンが登場する。

・予定した行動
・実施された行動
・実施されなかった行動

という視点で、「ビジネス活動」をモデリングするパターンをいろいろ取り上げている。

制約の実装については、14章で、触れている。

ニコラの「ストリームラインオブジェクトモデル」


ビジネスルールを、オブジェクト間の関係として、分類。

これも、5種類に類型化

・型ルール
・多重度ルール
・プロパティルール
・状態ルール
・競合ルール

この本の考え方は、こういう「オブジェクト間の関係」に関するルールも、すべて、Entity オブジェクトのロジックとして記述することが特徴。

例えば、「顧客」と「注文トランザクション」と「商品」に関する、ビジネスルールは、オブジェクトを生成して参照を保持するときに、お互いオブジェクトが、その妥当性をチェックする、という実装スタイル。(どういう関係パターンの時、どのルールは、どちらのオブジェクトの責務にすべきか、ということも、パターンとしてひとつの表にまとまっている)

・型は妥当か
・多重度は妥当か
・値の範囲とか形式は妥当か

DDD でいうところの Services パターンは、使わない。必ず、Entity に持たせる。
Value Objects パターンにあたる、考え方もないですね。

「関連」とビジネスルール


多くのビジネスルール(制約)は、オブジェクト間の「関係」についてのルールだといえる。

ファウラーは「アナリシスパターン」で、関係のモデリングと実装についても詳しく論じている

14章の1節「関連の実装」は、「関連」をオブジェクトの参照として実装する方法がテーマ。
方向性、多重度の違いによって、どんな実装方法があるかを分類して解説している。

15章「関連パターン」は、「関連」を「ドメインオブジェクト」としてモデリング・実装する、いろいろなパターンの解説。

Hruby は、主に「方針レベル」の9つの構造パターンとして、「関係」を表現するドメインオブジェクトを説明している。 DDD だと、Services パターンとも関係する。

ニコラの「ストリームラインオブジェクトモデル」は、関連オブジェクトを使わない方法に振り切った考え方。

個人的には、関連自体をドメインオブジェクトにして、そこにいろいろなドメインの知識をおくほうが、わかりやすいことが多いと思っている。「関心事の分離」の原則とか、「疎結合」の原則にあうことが多い。

ニコラの「ストリームラインオブジェクトモデル」は、パターンの整理とか、ヒントとしては、とても参考になる。

でも、制約を、すべて、Entity オブジェクトにカプセル化する、という実装方法には、かなり違和感がある。

ニコラの本には、サンプルコードもたくさんのっているんだけど、ロジックが直感的にわかりにくいし、変更があった時も、安全で簡単だとは思えないんですよね。

Hruby の「ビジネスパターン」を「アスペクト指向」でのサンプルコードが詳しく載っている。
こちらも、コードを読んでも、わかりやすいとも、変更しやすいとも思えなかった。

両方とも、パターン本としては、良いヒント集だと思うけど、実装コードの例としては、私には、ぴんとこないコードが多い。

ヒントだけど、「答え」ではない


この記事で取り上げた3冊の分析パターン本は、私は、ヒント集として、現場でかなり使っています。
いろいろな問題にぶつかると、読み直す。
読み落としていたことを発見したり、当時は理解できなかったことが、いつのまにか理解できるようになっていることも多い。

ヒント集としては、ほんとうに重宝している。手放せない。

でも、あくまでも「ヒント」であって「答え」ではないんですよね。

コメント
コメントする









この記事のトラックバックURL
トラックバック
calendar
   1234
567891011
12131415161718
19202122232425
2627282930  
<< November 2017 >>
システム設計日記を検索
プロフィール
リンク
システム開発日記(実装編)
有限会社 システム設計
twitter @masuda220
selected entries
recent comment
  • 番号より名前。 ニーモニックコードより名前。 【パターン】
    師子乃 (03/10)
  • Smart UI が優れている?
    masuda220 (03/10)
  • Smart UI が優れている?
    kagehiens (03/09)
  • オブジェクト指向プログラミングの教え方?
    masuda220 (12/05)
  • オブジェクト指向プログラミングの教え方?
    ZACKY (12/04)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (08/14)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    kompiro (08/14)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (06/13)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    JHashimoto (06/13)
  • 「オブジェクトの設計力」 スキルアップ講座やります
    masuda220 (02/28)
recent trackback
categories
archives
others
mobile
qrcode
powered
無料ブログ作成サービス JUGEM