【DDD】ドメイン駆動設計【エリック・エヴァンス】

1デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:39:06.49ID:jO+jDbIG
第1部 ドメインモデルを機能させる

   ドメイン駆動設計におけるモデルの有用性
   ソフトウェアの核心

第1章 知識をかみ砕く
   効果的なモデリングの要素
   知識のかみ砕き
   継続的学習
   知識豊富な設計
      例1.1——隠された概念を引き出す
   深いモデル

第2章 コミュニケーションと言語の使い方
   ユビキタス言語(UBIQUITOUS LANGUAGE)
      例2.1——貨物輸送プログラムを完成させる
   声に出してモデリングする
   1つのチームに1つの言語
   ドキュメントと図
      書かれた設計ドキュメント
      実行可能な基盤
   説明のためのモデル
      例2.2——輸送業務と経路

第3章 モデルと実装を結びつける
   モデル駆動設計(MODEL-DRIVEN DESIGN)
   モデリングパラダイムとツールによるサポート
      例3.1——手続き型からモデル駆動へ
   骨格を見せる:なぜモデルがユーザにとって重要なのか?
   実践的モデラ(HANDS ON MODELERS)
2017/10/24(火) 19:40:39.31ID:vrotHuwu
>>1
いきなり目次って
ここ読書スレ?
3デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:40:53.73ID:jO+jDbIG
第2部 モデル駆動設計の構成要素

第4章 ドメインを隔離する
   レイヤ化アーキテクチャ(LAYERED ARCHITECTURE)
      例4.1——オンラインバンキングの機能をレイヤに分割する
      レイヤを関係づける
      アーキテクチャフレームワーク
   ドメイン層はモデルが息づく場所
   利口なUI「アンチパターン」(SMART UI メANTI-PATTERNモ)
   その他の隔離
4デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:41:31.02ID:jO+jDbIG
第5章 ソフトウェアで表現されたモデル
   関連
      例5.1——証券取引口座における関連
   エンティティ(ENTITIES)(別名 参照オブジェクト(REFERENCE OBJECTS))
      エンティティをモデル化する
      同一性のための操作を設計する
   値オブジェクト(VALUE OBJECTS)
      値オブジェクトを設計する
      例5.2——値オブジェクトを使ってデータベースをチューニングする
      値オブジェクトを含む関連を設計する
   サービス(SERVICES)
      サービスと隔離されたドメイン層
      粒度
      サービスへのアクセス
   モジュール(MODULES)(別名 パッケージ(PACKAGES))
      アジャイルモジュール
      例5.3——Javaにおけるパッケージのコーディング規約
      インフラストラクチャ駆動パッケージングの落とし穴
   モデリングパラダイム
      なぜオブジェクトパラダイムが主流なのか?
      オブジェクトの世界におけるオブジェクトではないもの
      パラダイムを混在させる際にはモデル駆動設計に忠実であること
5デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:42:12.50ID:jO+jDbIG
第6章 ドメインオブジェクトのライフサイクル
   集約(AGGREGATES)
      例6.1——購入注文の整合性
   ファクトリ(FACTORIES)
      ファクトリとその場所を選択する
      コンストラクタがあればよい場合
      インタフェースを設計する
      不変条件のロジックはどこへ置くべきか?
      エンティティファクトリ対値オブジェクトファクトリ
      格納したオブジェクトを再構成する
   リポジトリ(REPOSITORIES)
      リポジトリに対して問い合わせる
      クライアントのコードはリポジトリの実装を無視するが、開発者はそうではない
      リポジトリを実装する
      フレームワークの範囲内で作業する
      ファクトリとの関係
   関係データベースに合わせてオブジェクトを設計する
6デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:42:47.43ID:jO+jDbIG
第7章 言語を使用する:応用例
   貨物輸送システムを導入する
   ドメインを隔離する:アプリケーションの導入
   エンティティと値オブジェクトを区別する
      役割とその他の属性
   輸送ドメインの関連を設計する
   集約の境界
   リポジトリを選択する
   シナリオをウォークスルーする
      サンプルアプリケーションの機能:貨物の荷出し地を変更する
      サンプルアプリケーションの機能:リピータへの対応
   オブジェクトの生成
      貨物用のファクトリとコンストラクタ
      荷役イベントを追加する
   リファクタリングのために立ち止まる:貨物集約についてのもう1つの設計
   輸送モデルにおけるモジュール
   新機能を導入する:配分チェック
      2つのシステムを接続する
      モデルを強化する:ビジネスのセグメント化
      パフォーマンスチューニング
   最後に
7デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:43:20.05ID:jO+jDbIG
第3部 より深い洞察へ向かうリファクタリング

   リファクタリングのレベル
   深いモデル
   深いモデル/しなやかな設計
   発見のプロセス

第8章 ブレイクスルー
   ブレイクスルーの話
      悪くないモデルなのだが…
      ブレイクスルー
      さらに深いモデル
      冷静な意思決定
      結末
   好機
   基本への集中
   エピローグ:新しい洞察の連鎖
8デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:43:49.53ID:jO+jDbIG
第9章 暗黙的な概念を明示的にする
   概念を掘り出す
      言葉に耳を傾ける
      例9.1——輸送モデルに欠けている概念を聞き分ける
      ぎこちなさを精査する
      例9.2——利息を得る 難しい方法
      矛盾について熟考する
      文献を読む
      例9.3——利息を得る 文献を用いた場合
      何度でも挑戦すること
   それほど明白でない概念をモデル化する方法
      明示的な制約
      例9.4——再考:オーバーブッキングポリシー
      ドメインオブジェクトとしてのプロセス
   仕様(SPECIFICATION)
      仕様の適用と実装
      例9.5——化学製品倉庫での格納
      例9.6——倉庫内格納サービスの、実際に動作するプロトタイプ
9デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:44:14.81ID:jO+jDbIG
第10章 しなやかな設計
   意図の明白なインタフェース(INTENTION-REVEALING INTERFACES)
      例10.1——リファクタリング:塗料混合アプリケーション
   副作用のない関数(SIDE-EFFECT-FREE-FUNCTIONS)
      例10.2——リファクタリング:塗料混合アプリケーション再考
   表明(ASSERTIONS)
      例10.3——塗料の混合に戻る
   概念の輪郭(CONCEPTUAL CONTOURS)
      例10.4——発生の輪郭
   独立したクラス(STANDALONE CLASSES)
   閉じた操作(CLOSURE OF OPERATIONS)
      例10.5——コレクションから選択する
   宣言的な設計
      ドメイン特化言語
   設計の宣言的スタイル
      宣言的スタイルで仕様を拡張する
      例10.6——コンポジット仕様を実装する他の方法
   攻める角度
      サブドメインを切り取る
      可能な場合には、確立された形式主義を活用する
      例10.7——パターンを統合する:シェア算
10デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:44:34.64ID:jO+jDbIG
第11章 アナリシスパターンを適用する
      例11.1——利息を得る 勘定を用いた場合
      例11.1(続き)——夜間バッチについての洞察
      アナリシスパターンは活用すべき知識である

第12章 デザインパターンをモデルに関係づける
   ストラテジー(STRATEGY)(別名 ポリシー(POLICY))
      例12.1——経路検索ポリシー
   コンポジット(COMPOSITE)
      例12.2——経路で構成された輸送経路
   なぜ、フライウェイトではないのか?

第13章 より深い洞察へ向かうリファクタリング
   開始
   探究チーム
   先達の技
   開発者のための設計
   タイミング
   好機となる危機
11デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:45:17.29ID:jO+jDbIG
第4部 戦略的設計

第14章 モデルの整合性を維持する
   境界づけられたコンテキスト(BOUNDED CONTEXT)
      例14.1——予約コンテキスト
      境界づけられたコンテキスト内での分派を認識する
   継続的な統合(CONTINUOUS INTEGRATION)
   コンテキストマップ(CONTEXT MAP)
      例14.2——輸送アプリケーションにおける2つのコンテキスト
      コンテキストの境界で行うテスト
      コンテキストマップを構成してドキュメント化する
   境界づけられたコンテキスト間の関係
   共有カーネル(SHARED KARNEL)
   顧客/供給者の開発チーム(CUSTOMER/SUPPLIER DEVELOPMENT TEAMS)
      例14.3——収益分析と予約
   順応者(CONFORMIST)
   腐敗防止層(ANTICORRUPTION LAYER)
      腐敗防止層のインタフェースを設計する
      腐敗防止層を実装する
      例14.4——レガシー予約アプリケーション
      訓話
12デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:45:38.94ID:jO+jDbIG
   別々の道(SEPARATE WAYS)
      例14.5——保険プロジェクトの縮小化
   公開ホストサービス(OPEN HOST SERVICE)
   公表された言語(PUBLISHED LANGUAGE)
      例14.6——化学のための公表された言語
   象のモデルを統一する
      モデルコンテキスト戦略を選択する
      チームでの意思決定と、より上層での意思決定
      コンテキストに自らの身を置く
      境界を変換する
      変更できないものを受け入れる:外部システムの輪郭を描く
      外部システムとの関係
      設計中のシステム
      別のモデルで特殊な要求を満たす
      デプロイ
      トレードオフ
      すでにプロジェクトが進行中の場合
   変換
      コンテキストをマージする:別々の道 → 共有カーネル
      コンテキストをマージする:共有カーネル → 継続的な統合
      レガシーシステムを段階的に廃止する
      公開ホストサービス → 公表された言語
13デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:46:02.22ID:jO+jDbIG
第15章 蒸留
   コアドメイン(CORE DOMAIN)
      コアを選択する
      誰がこの作業をやるのか?
   蒸留の拡大
   汎用サブドメイン(GENERIC SUBDOMAINS)
      例15.1——2つのタイムゾーンの物語
      汎用とは再利用可能という意味ではない
      プロジェクトのリスク管理
   ドメインビジョン声明文(DOMAIN VISION STATEMENT)
   強調されたコア(HIGHLIGHTED CORE)
      蒸留ドキュメント
      コアにフラグを立てる
      プロセスツールとしての蒸留ドキュメント
   凝集されたメカニズム(COHESIVE MECHANISMS)
      例15.2——組織図におけるメカニズム
      汎用サブドメイン対凝集されたメカニズム
      メカニズムがコアドメインの一部である場合
      例15.3——一巡:組織図がメカニズムを再び吸収する
   蒸留して宣言的スタイルにする
   隔離されたコア(SEGREGATED CORE)
      隔離されたコアを作成するコスト
      チームの意思決定を進化させる
      例15.4——貨物輸送モデルのコアを隔離する
   抽象化されたコア(ABSTRACT CORE)
   深いモデルの蒸留
   リファクタリングの対象を選ぶ
14デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:46:30.33ID:jO+jDbIG
第16章 大規模な構造
   進化する秩序(EVOLVING ORDER)
   システムのメタファ(SYSTEM METAPHOR)
      「素朴なメタファ」とそれを必要としない理由
   責務のレイヤ(RESPONSIBILITY LAYERS)
      例16.1——深く掘り下げる:輸送システムをレイヤ化する
      適切なレイヤを選択する
   知識レベル(KNOWLEDGE LEVEL)
      例16.2——従業員の給料と年金(1)
      例16.3——従業員の給料と年金(2)知識レベル
   着脱可能コンポーネントのフレームワーク(PLUGGABLE COMPONENT FRAMEWORK)
      例16.4——SEMATECH CIMフレームワーク
   構造による制約をどの程度厳しくするべきか?
   ふさわしい構造へのリファクタリング
      ミニマリズム
      コミュニケーションと自己規律
      再構成によってしなやかな設計がもたらされる
      蒸留によって負荷が軽減される
15デフォルトの名無しさん
垢版 |
2017/10/24(火) 19:46:47.01ID:jO+jDbIG
第17章 戦略をまとめ上げる
   大規模な構造と境界づけられたコンテキストを組み合わせる
   大規模な構造と蒸留を組み合わせる
   まず評価する
   誰が戦略を策定するのか?
      アプリケーション開発から現れる構造
      顧客に焦点を合わせたアーキテクチャチーム
   戦略的設計上の意思決定を行うために欠かせない6つのこと
      同じことが技術的なフレームワークにも当てはまる
      マスタプランに注意すること

結論

   エピローグ
   展望
16デフォルトの名無しさん
垢版 |
2017/10/25(水) 19:04:27.51ID:44Xm0aVs
「境界づけられたコンテキスト」が
何のことかよくわからないので教えてください。
2017/10/25(水) 19:08:44.29ID:aatZ8FSF
>「境界づけられたコンテキスト」
ユビキタス言語の文脈が変わる境界のこと

たとえば「アカウント」は
金融なら口座だけど
Webサービスなら登録情報とか
18デフォルトの名無しさん
垢版 |
2017/10/25(水) 19:31:11.15ID:44Xm0aVs
>17
その境界はパッケージとかディレクトリとかで判断せよ
みたいな感じ?
2017/10/25(水) 19:49:21.67ID:aatZ8FSF
>>18
DDDなら最初にまずドメインで判断すべき
どこまでが開発するドメインの範囲なのかって

Webサービスで通販やんないから
お金や口座は絡まないけど
ログインするタイプのサービスだとか
20デフォルトの名無しさん
垢版 |
2017/10/25(水) 20:12:30.45ID:44Xm0aVs
>>19
あーそうか、
Webサービスの場合、コンパイルしてバイナリ化しないから、
PHPの場合配備するAppはディレクトリ構造まんまになるんだけど、
システムの境界はどうやって判断するの?
設計図上でしか判断し得ないの?
サーバマシンの区切り? ディレクトリの区切り? URLのドメイン名の
区切り? その「DDDのあるドメイン」って実際のファイルシステム上では
どのように区切るの?
2017/10/25(水) 20:15:43.64ID:aatZ8FSF
>>20
コンテキストの境界をシステムで表現する際には
(Javaなら)パッケージとその名前空間を使う

でもあくまでビジネスのドメインが先にあって
それにシステムを合わせるのであって
システムだけで判断したらダメだからね
2017/10/25(水) 21:51:00.68ID:0GYD+24d
「境界づけられたコンテキスト」は組織構造やシステム構成でも変わりうるよ
特に組織構造への依存度は高いのでそれに応じたいくつかの戦略パターンが解説されてる

受注チームと出荷チームでは「商品」という言葉の意味が違ったり
レガシーシステムと新システムでは「商品」の属性やの振る舞いが違ったりするみたいなこと
一つの境界の中ではそういう違いは許されない

企業全体で統一された一つのモデルや用語集を作ろうとするのではなく
コンテキスト境界に閉じた中でモデルや語彙を明確にしようというのがDDDの考え方
23デフォルトの名無しさん
垢版 |
2017/10/27(金) 20:24:53.95ID:BY+fhh/f
実装とか物理設計の話になってすまないけど、
DBMSの「テーブルが所属するDB名の境界」が
上記の「境界づけられたコンテキストの」「境界」
に当たるのだろうか。
24デフォルトの名無しさん
垢版 |
2017/10/27(金) 20:35:29.16ID:NaPnvd1g
コンテキストとDBインスタンスを一致させてる
2017/10/28(土) 00:06:52.32ID:EvuLUtue
>>23
一般的には当たらないことのほうが多いと思う
>>22の例で受注と出荷で違うコンテキストだったとしても
同じDBに属するテーブルを使うことはよくあるし
逆に複数のDBがひとつのコンテキストに属することもある

モデルやユビキタス言語のスコープが境界づけられたコンテキスト
境界は自然に決まるものじゃないから設計者がドメイン分析の過程で決めていくしかない
2017/10/29(日) 22:40:08.05ID:CrDMqcML
ドメインて何ですか
2017/10/29(日) 22:58:36.50ID:RyqL6Q1z
問題領域
2017/10/30(月) 12:05:58.95ID:5RpC60IR
何が問題なんですか?
2017/10/30(月) 12:06:24.63ID:5RpC60IR
トラブルエリアじゃ駄目なんですか?
2017/11/03(金) 08:47:57.76ID:0WQ4WnED
大雑把に言うと、クラス名やメソッド名、変数名を使って仕事の会話を
しましょうと言うだけ。その逆も然り、それで違和感を感じたら設計や
用語を見直す。
2017/11/03(金) 08:53:45.98ID:0WQ4WnED
バリューオブジェクトやエンティティとかリポジトリィとかは単なる設計/実装テクニック。
2017/11/03(金) 09:43:41.21ID:Ro85MhDs
>>30
>クラス名やメソッド名、変数名を使って仕事の会話をしましょうと言うだけ。

根本的に間違ってるだろ
2017/11/03(金) 10:22:22.91ID:wXWM393A
根本的な正解をヨロシク
34デフォルトの名無しさん
垢版 |
2017/11/03(金) 10:33:38.13ID:BtRYOGnT
俺も宜しく。
35デフォルトの名無しさん
垢版 |
2017/11/03(金) 14:11:54.12ID:CsNI9L5l
ビューモデル、データモデルとドメインモデルとの相互変換がめんどくさすぎる
バリューオブジェクトと集約ルートの考え方のせいで自動マッピング全然効かなくなるし
36デフォルトの名無しさん
垢版 |
2017/11/04(土) 03:13:26.11ID:b5UX6G3j
正直O/Rマッパーで取ってきたデータの入れ物をこねくり回す方が100倍楽なんだが、
大規模プロジェクトや長期のメンテが必要な場合以外でDDD使うケースってどれぐらいあるんだろ?
37デフォルトの名無しさん
垢版 |
2017/11/04(土) 05:04:45.77ID:7D9PjzRB
お前らががO/Rマッパーの中身を作ったことがあるならいいけど
そうじゃないと、その便利なO/Rマッパーに自分の技術者としての
存在価値を食い殺されることになるから気をつけろ。
DIY: 1度は作れ。最初から既存の便利なものは買うな、取り寄せるな。
DRY: 同じモノは2度も作るな。
つまり「自分の力で1度だけ作れ。」
0回もダメ, 2回以上同じモノを何度も作るのもダメ。
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況