【DDD】ドメイン駆動設計【エリック・エヴァンス】
第1部 ドメインモデルを機能させる
ドメイン駆動設計におけるモデルの有用性
ソフトウェアの核心
第1章 知識をかみ砕く
効果的なモデリングの要素
知識のかみ砕き
継続的学習
知識豊富な設計
例1.1——隠された概念を引き出す
深いモデル
第2章 コミュニケーションと言語の使い方
ユビキタス言語(UBIQUITOUS LANGUAGE)
例2.1——貨物輸送プログラムを完成させる
声に出してモデリングする
1つのチームに1つの言語
ドキュメントと図
書かれた設計ドキュメント
実行可能な基盤
説明のためのモデル
例2.2——輸送業務と経路
第3章 モデルと実装を結びつける
モデル駆動設計(MODEL-DRIVEN DESIGN)
モデリングパラダイムとツールによるサポート
例3.1——手続き型からモデル駆動へ
骨格を見せる:なぜモデルがユーザにとって重要なのか?
実践的モデラ(HANDS ON MODELERS) 大雑把に言うと、クラス名やメソッド名、変数名を使って仕事の会話を
しましょうと言うだけ。その逆も然り、それで違和感を感じたら設計や
用語を見直す。 バリューオブジェクトやエンティティとかリポジトリィとかは単なる設計/実装テクニック。 >>30
>クラス名やメソッド名、変数名を使って仕事の会話をしましょうと言うだけ。
根本的に間違ってるだろ ビューモデル、データモデルとドメインモデルとの相互変換がめんどくさすぎる
バリューオブジェクトと集約ルートの考え方のせいで自動マッピング全然効かなくなるし 正直O/Rマッパーで取ってきたデータの入れ物をこねくり回す方が100倍楽なんだが、
大規模プロジェクトや長期のメンテが必要な場合以外でDDD使うケースってどれぐらいあるんだろ? お前らががO/Rマッパーの中身を作ったことがあるならいいけど
そうじゃないと、その便利なO/Rマッパーに自分の技術者としての
存在価値を食い殺されることになるから気をつけろ。
DIY: 1度は作れ。最初から既存の便利なものは買うな、取り寄せるな。
DRY: 同じモノは2度も作るな。
つまり「自分の力で1度だけ作れ。」
0回もダメ, 2回以上同じモノを何度も作るのもダメ。 DDDってこんな感じじゃん?
画面: 集約ルートのメソッドのパラメータを入力させる
コントローラ: 入力をVOに変換してサービスに投げる
サービス: リポジトリから集約ルートとってくる & 集約ルートのメソッド呼び出す ; 集約ルートをリポジトリに保存する
でもユーザーが求めてるものってこれじゃないんだよね
画面: テーブル(データそのもの)を自由に編集 & 入力に間違いあれば警告 & 入力サポート処理
コントローラ: データ層に丸投げ
データ層: 受け取ったデータをそのまま保存する & 場合によりSQLでビジネスロジックを実行して結果を保存
ユーザーはこういうアプリケーションが大好き
とにかくひとつの画面に関連ありそうなものが全部見えて全部入力できないと気が済まない
集約ルートとか関係なしにぶら下がってるエンティティも直接編集したい
理想像はエクセルを機能拡張したようなもの
そのかわり入力に間違いがないようにバリデーションだけは異様にしっかりする
DDDはユーザーが求めてるものとは違うんだよ
エレガントなアプリを作りたいっていう開発者の都合でユーザーの求めているものとは全く異なるものを作ったら、優秀な技術者じゃなくて、ニーズが読めない二流って評価されちまう
MicrosoftもそれがわかってるからASP.NET MVCやEFのようなフレームワークを作った
ビューモデル、データモデルは振る舞いを持たない素朴なデータの集合の方がわかりやすいし楽だと割り切った
そして検証の工数を下げるために属性バリデーションが発達した
これは他の言語でもだいたい同じ
世界のトップレベルの開発者たちがDDDを否定して貧血ドメイン+強力な検証というパターンを選択した 今の仕事ドメインもどきの実装になってる
サービスは細かく区切ってあるけど
おのおの自分の担当データの整合性が保たれることだけを保証する
読み出しは自由 >>38
どこでどう勘違いしたらそんな理解になるの? 論理的推論(ろんりてきすいろん、英: logical reasoning)は、
論理学において演繹、帰納、アブダクション(仮説形成)の3種類に区別されうる。
「前提条件」(precondition)、「結論」(conclusion)、
そして「『前提条件』は『結論』を含意する」という
「規則」(rule)があるとすると、それら3種の推論は次の仕方で説明されうる。
演繹
演繹は「結論」を規定することを意味する。この推論は
「規則」と「前提条件」を用いて「結論」を導くことである。
例えば、「雨がふると芝生は湿る。雨がふっている。したがって、芝生は湿っている。
」数学者は通常、この種の推論にかかわっている。
帰納
帰納は「規則」を規定することを意味する。この推論は「前提条件」の次に起こる
「結論」の諸事例の一部から「規則」を学ぶことである。
例えば、「これまで、雨がふるといつも芝生は湿ってきた。
したがって、雨がふると芝生は湿る。」
科学者は通常、この種の推論にかかわっている。
アブダクション(仮説形成)
アブダクション(仮説形成)は過去事象についての「前提条件」
を推定することを意味する。この推論は現在確定される
「結論」と「規則」を用いて「ある『前提条件』が『結論』を
説明することができるだろう」ということを裏づけることである。
例えば、「芝生が湿っている。雨がふると芝生が湿る。
したがって、雨がふったに違いない。」
歴史科学者や診断専門医、探偵は通常、この種の推論にかかわっている。
https://ja.wikipedia.org/wiki/%E8%AB%96%E7%90%86%E7%9A%84%E6%8E%A8%E8%AB%96 反論はないということですね
やっぱりDDDはアンチパターンなんだ 貧血ドメインごとに専用のサービスクラスを作るのはトランザクションスクリプト? >>43
DDDの提唱者ですら言ってるよ
ビジネスロジックが複雑でないドメイン、例えばただのCRUDみたいに、
DBのUIでしかないようなアプリはDDDでやる意味ないって >>45
その複雑なドメインってのがそもそも現実的じゃないんだよ
すべてのアプケーションはDDDなしでの高生産で作れるんだし >>44
それ分ける意味って何なの?
わざわざ実装散らしてメンテする人に嫌がらせしたいの? >>47
Entity Frameworkが使えるよ
DBからエンティティクラスを自動生成できるのさ
トランザクションスクリプトの弱点は機能が重複することだから
エンティティごとにサービスクラス作ればその弱点を補える
現実的な落としどころとして最高だと考えるわけだが >>48
既存DB前提のCRUDアプリならわかるけど、それ以外の場合はどうすんの?
インピーダンスミスマッチもない前提?
DB用に正規化されたデータがUIまで貫通するの? >>49
EntityFramework使ったことない人? >>50
使ったことない前提でいいから質問に回答が欲しい >>51
正規化されたテーブルとEntityは必ずしも1:1にはならないし、そのEntityをUIでそのまま使うのはアンチパターン。 >>52
>>48でDBから自動生成する話してるのに1:1じゃないの?
コードファーストの話してるならならわかるんだけど。 >>38
>理想像はエクセルを機能拡張したようなもの
スマートUIの方が作りやすいが変更に弱い
>世界のトップレベルの開発者たちがDDDを否定して
いやこれは違うぞ
欧米ではDDDのようなドメインモデルを選択してる
日本がガラパゴスで遅れてるだけ >>45>>46
CRUDならDB+スマートUIで良いが
複雑なドメインや変更が多いアプリはDDDが向く
>すべてのアプケーションはDDDなしでの高生産で作れる
これは違う
スマートUIやトランザクションスクリプトの方が作りやすいが
変更に弱いので長期的には保守が大変で行き詰まってくる >>53
自動生成したものをそのまま使うんならそうだね。普通はそんなことあまりしないけど。 >>54
それホントなの?
外人が書いた技術書見てもトランザクションスクリプトは大抵の場合うまく行くって書いてあるよ
ドメインモデルは大抵の場合大失敗するって UIでエンティティをそのまま使うってめちゃくちゃなこと言ってそれを批判する自作自演論法を駆使してる人を見て頑張り屋さんだなあと思うなど ジャパニーズはドメインモデルを天皇か何かだと思っているのではないかと思うなど 天皇ってキーワードが引っ掛かったんじゃね
俺もいろいろ書き込みしてるが
決まって煽ろうとしたときだけ
なんか変ないろんなルールに引っ掛かる
実際はAIが仕込まれていて
都合の悪い書き込みだけルールをこじつけてはじいているのでは 日本人のDDDに対する信仰はいったいなんなんだろうな?
DDDを取り入れてない企業の若者ほどDDDに傾倒してる気がする
お前らDDDやったことないやろwww データと振る舞いが分離して処理があちこちにばらまかれるって言う奴がいるけど
それって設計が雑でレビューもしてないだけだよね
普通に作ればトランザクションスクリプトでも疎結合高凝集になるし ぶっちゃけ並み以上のスキルと統制力があればDDDでも貧血ドメイントランザクションスクリプトでもうまくいく
そしてそれはシステムの複雑度とは関係ない
それを踏まえて考えるとモダンなフレームワークの恩恵を受けにくいDDDは現代ではアンチパターンなんだな
フレームワークが未成熟な時代に考えられたアイデアだし時間が経って陳腐化するのは仕方がないけど >>65
フレームワークのロックインを避けて移植性を高めたい場合は? トランザクションスクリプト推しとの議論スレにじゃなくて、DDDをうまくやる方法を語れるスレになってほしいな
なんでOO系のスレってアンチが粘着しがちなんだろう >>66
移植する予定が出てきてから考えればいいよ
現実的な線で言うとDDDにするコストより地道に移植するコストのほうが安いけどな >>67
本当に優れた手法なら批判的な意見を正論で叩き潰せるはず
俺はそれを見てみたいんだよ
実は俺はDDDアンチじゃなく信者だからね
他人の意見は上司を説得して業務に取り入れるための参考になる
はやく論破してくれ >>69
論破っていうけどさ、
> 現実的な線で言うとDDDにするコストより地道に移植するコストのほうが安いけどな
みたいな、根拠も示さない意見を論破する労力なんて誰も割きたくないでしょw
いや、うちはDDDで移植のコストは下がったけどな、って返せばいいの? >>70
移植先のフレームワークも似たような機能が揃ってるから大した手間にならん
フレームワークに沿って高生産の仕事を2回やるだけ
しかもフレームワークは似てるので2回目はさらに簡単
生産性をあげるのがフレームワークだ
それに逆らってDDDをやっても生産性を下げるだけ
移植するときにもまた他のフレームワークに逆らうことになり生産性を下げざるをえない
苦痛を2回も強いられる まず、DDDはフレームワークに逆らっている、というのがよくわからん
具体的にはどういうこと? >>72
フレームワークを使った開発ではプレーンなオブジェクトに属性を付けて不変条件を守るスタイルが優勢
DDDは余計なメンバを公開しないしインフラから切り離すので属性にも依存したくない
フレームワークの利点を潰してしまう 具体的なフレームワーク名も挙げずに何言ってんのこいつ >>74
最近のフレームワークはどれも同じようなものって言ってるだろ
なら具体的にあげる意味はないね サービス層とMVCのコントローラは何が違うのか
情弱の俺に教えてくれよ。 >>78
サービスって言葉は色んな意味で使われるから分かりにくい
特定のクラスに属するとマズイ処理を実装するところだと理解してるけど
MVCのCはそのまんまUIとモデルの橋渡しでしょ ドメインモデルっていうくらいなんだから
サービスドメインはモデルでしょうな >>63
その割にはドメインに対する理解とかには全然注力しない印象。
業務系だったら、簿記や会計の勉強したりとか。 >>67
>OO系のスレってアンチが粘着しがち
OOが難しいから否定したいんだろう
関数型のスレにもいるだろ >>78
似てるけど微妙に違う
Mにドメイン層とインフラ層が一緒になってるのは分かるよな
サービス(アプリ)層はCとMの一部が一緒になってる >>84
リクエストとレスポンスのインタラクションは
コントローラ
データの「加工」「変換」「検索」「演算」「結合」
ここらへんが絡む物はサービス?
DBMSのコネクションの利用はモデルじゃなくてサービスかな
モデルはただ単に「属性」を持っているだけでいい。
それと最低限のゲッターとセッター
こんなところだろうか??
バリデーションや業務ルールのチェックはモデル??サービス?? 考えるな 感じるんだ
じゃなくて
周りに合わせるんだ
どんなくそ設計でも検証通ったコードと一貫性が保たれてるほうが品質高い
サービスだとおもいます 他人が構築したドメイン構造を把握するスキルも
重要なのかな?
日本のSIlerの場合常駐先がしょっちゅう変わったりする
んだからそうなるとドメインを構築しようとか
どんなドメインなのかの把握が面倒になってしまう。 >>86
いろんな考え方があるけど一番シンプルなのは
DDDではドメインが一番大事だからドメインと他を切り分けること
UIとDBは明らかに分かると思うからそれをどけて
残るのはアプリ(サービス)層とドメイン層の区別
両者は混同されやすくサービスの肥大化がよく起こるので
リファクタリングを続けて継続的に
ドメインの知識はドメイン層へと移動させていく
>バリデーションや業務ルールのチェック
たしかにこれはどっちに置くか難しいけど
私ならドメインの知識になってるかどうかで考える
たとえばよくある例では日付でうるう年の判定などは
明らかにドメインの知識だからドメイン層に置く バリデーションはエラーメッセージ、UIの強調表示なども絡むからどう考えたってプレゼンテーション層でしょ
ビューモデル(プレゼンテーションの都合であるモノ)のプロパティ属性にバリデーションルールを書くことが標準的になっている点からもこの事実は明らか >>90
ASP.NETだけどビューにバリデーション書いたとしてjavascriptゴニョゴニョされてバリデーション突破されたら怖いからコントローラにもチェック入れてる
設計的に正しいのかは解らない 目的が違えば両方あってもいいんじゃね?ユーザーの利便のためか自衛のためか。 >>91
ASP.NETって、ビューモデルのバリデーションをクライアント側のJSで突破できちゃうの? >>94
そう書いたらそうなる
普通はControllerでチェックする >>90
クライアントのJSで検証したらサーバー側のコントローラで検証しなくても良いと?
んなわけねーだろ普通両方やるわ プレゼンテーション層でチェック
クライアントでチェックする
一緒にしてる奴がいるね
ちなみにコントローラーもプレゼンテーション層な >>98
Controlerってアプリケーション層じゃ無いんだ
出典無いから自信無いけど セキュリティとか悪意のある攻撃を想定すると
話が厄介になるね
セキュリティ考慮でなければ、情報の源泉に近い
JSでバリデーション1本だけで十分だろう。
セキュリティとか認証が絡むとこういったレイヤの層分け
が狂う要因になるのだろうか? >>101
仕事で使うなら想定しないケースも希だと思うけど DIのフレームワークとDDDって共存できるの
DDDってMVCみたいなレイヤードアーキテクチャからドメイン抜き出したもの程度しか認識ない人間だけど >>103
MVCはレイヤードアーキテクチャじゃないよ >>104
モデルビューコントローラはレイヤじゃ無いのか
そう言えばモデル層とか聞かないね validationとormがDDDのボトルネック
要するに机上の空論 UIの要求が強すぎるとうまくいかんのだわ
ドメインクラスをフロントとバックの両方に書くはめになる
Node.jsだとそのへんうまくいくのかな お前ら設計書ってどうしてる?
仕事でやる以上は設計書出せと言われたら書かなきゃならない
設計書がレビュー通らなきゃコーディングは始められない
バリューオブジェクトの設計書とかあまりにも馬鹿馬鹿しいんだけど何百個も書かなければならない >>108
なんて言ってほしいのかわからない
仕事なんだからやれって言われたらヤるしないって立場なんでしょ?
じゃあやるしかないじゃん
バリューオブジェクト数百個っていったらそれなりの規模のシステムだろうから
バリューオブジェクトを使わなかったとしてもどうせ大量の設計書を書かないといけないし、
今となってはそういう仕事を受けたのを悔やむことぐらいしかできないのでは? 設計書なんで実装終わったときに揃ってれば良いだろ
どうせ開発中にコロコロ仕様変わるなんてよくある話だ レビューがあるから先に設計書を書かないとダメ
でも設計書で設計するとグダグダになる
設計書から目をそらす以外にうまくいく方法があるなら教えてくれ テキトーに書いておく
レビューする側に解ってる人がいるのは稀だからタイテーはこれで何とかなる 先にユニットテスト済みのコードを書く
doxygenで設計書生成
レビューしてOKを貰う
コーディングしてるふりして1日サボる
コードをプッシュ >>114
doxygenってExcel方眼紙出せたっけ? >>116
使いたかないけどさ。
たぶん >>108 にそんな自由はない。 Excelに貼り付けるテキストを自作ツールで出力。 ビジネスロジック層と永続化層の違いについて聞きたいんだが
「ビジネスロジック」は「犬」とか「リンゴ」とかいうクラスを作る層で
「永続化層」は「犬テーブルを操作するオブジェクト」を定義するクラス
を作る(というかPDOとかActive Recordとかが用意している)という
認識でいいのか? ざっくり言うとデータベースに関係あるのがインフラ層 僕の知り合いの知り合いができたパソコン一台でお金持ちになれるやり方
役に立つかもしれません
グーグルで検索するといいかも『ネットで稼ぐ方法 モニアレフヌノ』
Q3XKO ゲーム開発でDDDは使えますか?
その場合のドメインとドメインエキスパートとは例えば何、誰を指すでしょうか?