Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
EN
Uploaded by
増田 亨
16,173 views
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動設計で、モデリングをどうやっているか、それをどう実装に結びつけているかの事例紹介。 RDRA+ICONXをベースに、より機敏なやり方への挑戦。実践的なオブジェクト指向設計。
Software
◦
Related topics:
Object-Oriented Programming
•
Read more
39
Save
Share
Embed
Embed presentation
Download
Downloaded 301 times
1
/ 103
2
/ 103
Most read
3
/ 103
4
/ 103
Most read
5
/ 103
6
/ 103
7
/ 103
8
/ 103
9
/ 103
10
/ 103
11
/ 103
12
/ 103
13
/ 103
14
/ 103
15
/ 103
16
/ 103
17
/ 103
18
/ 103
19
/ 103
20
/ 103
Most read
21
/ 103
22
/ 103
23
/ 103
24
/ 103
25
/ 103
26
/ 103
27
/ 103
28
/ 103
29
/ 103
30
/ 103
31
/ 103
32
/ 103
33
/ 103
34
/ 103
35
/ 103
36
/ 103
37
/ 103
38
/ 103
39
/ 103
40
/ 103
41
/ 103
42
/ 103
43
/ 103
44
/ 103
45
/ 103
46
/ 103
47
/ 103
48
/ 103
49
/ 103
50
/ 103
51
/ 103
52
/ 103
53
/ 103
54
/ 103
55
/ 103
56
/ 103
57
/ 103
58
/ 103
59
/ 103
60
/ 103
61
/ 103
62
/ 103
63
/ 103
64
/ 103
65
/ 103
66
/ 103
67
/ 103
68
/ 103
69
/ 103
70
/ 103
71
/ 103
72
/ 103
73
/ 103
74
/ 103
75
/ 103
76
/ 103
77
/ 103
78
/ 103
79
/ 103
80
/ 103
81
/ 103
82
/ 103
83
/ 103
84
/ 103
85
/ 103
86
/ 103
87
/ 103
88
/ 103
89
/ 103
90
/ 103
91
/ 103
92
/ 103
93
/ 103
94
/ 103
95
/ 103
96
/ 103
97
/ 103
98
/ 103
99
/ 103
100
/ 103
101
/ 103
102
/ 103
103
/ 103
More Related Content
PDF
正しいものを正しく作る塾-設計コース
by
増田 亨
PDF
ドメイン駆動設計 分析しながら設計する
by
増田 亨
PDF
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
PDF
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
by
A AOKI
PDF
マイクロサービス 4つの分割アプローチ
by
増田 亨
PDF
ドメイン駆動設計のための Spring の上手な使い方
by
増田 亨
PDF
世界でいちばんわかりやすいドメイン駆動設計
by
増田 亨
PDF
ドメイン駆動設計 本格入門
by
増田 亨
正しいものを正しく作る塾-設計コース
by
増田 亨
ドメイン駆動設計 分析しながら設計する
by
増田 亨
ドメイン駆動設計サンプルコードの徹底解説
by
増田 亨
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
by
A AOKI
マイクロサービス 4つの分割アプローチ
by
増田 亨
ドメイン駆動設計のための Spring の上手な使い方
by
増田 亨
世界でいちばんわかりやすいドメイン駆動設計
by
増田 亨
ドメイン駆動設計 本格入門
by
増田 亨
What's hot
PDF
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
PDF
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
PDF
ドメイン駆動設計に15年取り組んでわかったこと
by
増田 亨
PDF
ドメイン駆動設計 失敗したことと成功したこと
by
BIGLOBE Inc.
PDF
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
PDF
ドメイン駆動設計の正しい歩き方
by
増田 亨
PDF
ドメインオブジェクトの設計ガイドライン
by
増田 亨
PDF
3週連続DDDその1 ドメイン駆動設計の基本を理解する
by
増田 亨
PDF
ドメイン駆動設計(DDD)の実践Part2
by
増田 亨
PDF
ドメイン駆動設計 コアドメインを語り合ってみよう
by
増田 亨
PDF
Tackling Complexity
by
Yoshitaka Kawashima
PDF
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
by
増田 亨
PDF
ドメイン駆動設計 の 実践 Part3 DDD
by
増田 亨
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
PDF
ドメイン駆動設計 ( DDD ) をやってみよう
by
増田 亨
PDF
シリコンバレーの「何が」凄いのか
by
Atsushi Nakada
PDF
ドメイン駆動設計という仕事の流儀
by
増田 亨
PDF
ドメイン駆動設計 基本を理解する
by
増田 亨
PDF
ビジネスルールの複雑さに立ち向かう
by
増田 亨
PDF
3週連続DDDその3 ドメイン駆動設計 戦略的設計
by
増田 亨
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
by
Koichiro Matsuoka
ドメイン駆動設計のためのオブジェクト指向入門
by
増田 亨
ドメイン駆動設計に15年取り組んでわかったこと
by
増田 亨
ドメイン駆動設計 失敗したことと成功したこと
by
BIGLOBE Inc.
強いて言えば「集約どう実装するのかな、を考える」な話
by
Yoshitaka Kawashima
ドメイン駆動設計の正しい歩き方
by
増田 亨
ドメインオブジェクトの設計ガイドライン
by
増田 亨
3週連続DDDその1 ドメイン駆動設計の基本を理解する
by
増田 亨
ドメイン駆動設計(DDD)の実践Part2
by
増田 亨
ドメイン駆動設計 コアドメインを語り合ってみよう
by
増田 亨
Tackling Complexity
by
Yoshitaka Kawashima
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
by
増田 亨
ドメイン駆動設計 の 実践 Part3 DDD
by
増田 亨
SPAセキュリティ入門~PHP Conference Japan 2021
by
Hiroshi Tokumaru
ドメイン駆動設計 ( DDD ) をやってみよう
by
増田 亨
シリコンバレーの「何が」凄いのか
by
Atsushi Nakada
ドメイン駆動設計という仕事の流儀
by
増田 亨
ドメイン駆動設計 基本を理解する
by
増田 亨
ビジネスルールの複雑さに立ち向かう
by
増田 亨
3週連続DDDその3 ドメイン駆動設計 戦略的設計
by
増田 亨
Similar to ドメイン駆動で開発する ラフスケッチから実装まで
PPT
ドメインロジックの実装方法とドメイン駆動設計
by
Tadayoshi Sato
PDF
ドメイン駆動設計入門
by
増田 亨
PDF
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
by
Fumiyasu Sumiya
PPTX
20100324 勉強会資料(ドメイン駆動)
by
Masayuki Kanou
PDF
「ドメイン駆動設計」の複雑さに立ち向かう
by
増田 亨
PDF
Python におけるドメイン駆動設計(戦術面)の勘どころ
by
Junya Hayashi
PDF
ドメイン駆動設計とは何か 【入門編】
by
増田 亨
PDF
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
by
増田 亨
PDF
私がドメイン駆動設計をやる理由
by
増田 亨
PDF
ドメイン駆動設計という設計スタイル
by
増田 亨
PDF
ScalaMatsuri 2016
by
Yoshitaka Fujii
PDF
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
by
Junichiro Kazama
PPTX
ドメイン駆動設計入門
by
KenjiroUehara
PDF
ドメイン駆動設計を実践するプログラマーの悩み
by
haljik Seiji
PDF
DDD 20121106 SEA Forum November
by
増田 亨
PDF
20130202 ドメイン駆動設計読書会at名古屋のお誘い
by
Ryo RKTM
PDF
実践に向けたドメイン駆動設計のエッセンス
by
GuildWorks
PDF
実践に向けたドメイン駆動設計のエッセンス
by
増田 亨
PDF
RDRA DDD Agile
by
増田 亨
PDF
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
ドメインロジックの実装方法とドメイン駆動設計
by
Tadayoshi Sato
ドメイン駆動設計入門
by
増田 亨
【JJUG CCC 2016 Fall 公開版】ドメイン駆動設計とscala 〜既存プロジェクトへの適用〜
by
Fumiyasu Sumiya
20100324 勉強会資料(ドメイン駆動)
by
Masayuki Kanou
「ドメイン駆動設計」の複雑さに立ち向かう
by
増田 亨
Python におけるドメイン駆動設計(戦術面)の勘どころ
by
Junya Hayashi
ドメイン駆動設計とは何か 【入門編】
by
増田 亨
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
by
増田 亨
私がドメイン駆動設計をやる理由
by
増田 亨
ドメイン駆動設計という設計スタイル
by
増田 亨
ScalaMatsuri 2016
by
Yoshitaka Fujii
JSUG 20141127 「Spring Bootを用いたドメイン駆動設計」
by
Junichiro Kazama
ドメイン駆動設計入門
by
KenjiroUehara
ドメイン駆動設計を実践するプログラマーの悩み
by
haljik Seiji
DDD 20121106 SEA Forum November
by
増田 亨
20130202 ドメイン駆動設計読書会at名古屋のお誘い
by
Ryo RKTM
実践に向けたドメイン駆動設計のエッセンス
by
GuildWorks
実践に向けたドメイン駆動設計のエッセンス
by
増田 亨
RDRA DDD Agile
by
増田 亨
ドメイン駆動設計をゲーム開発に活かす
by
増田 亨
More from 増田 亨
PDF
ソフトウェア開発のやり方の改善
by
増田 亨
PDF
事業活動モデル・システム機能モデル・ビジネスロジックの記述
by
増田 亨
PDF
オブジェクト指向プログラミングの現在・過去・未来
by
増田 亨
PDF
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
by
増田 亨
PDF
プロダクトづくりのためのソフトウェア設計スタイル
by
増田 亨
PDF
ソフトウェア設計の学び方を考える
by
増田 亨
PDF
ソフトウェアの核心にある複雑さに立ち向かう
by
増田 亨
PDF
DDD sample code explained in Java
by
増田 亨
PDF
アジャイルなソフトウェア設計を目指して
by
増田 亨
PDF
SoR 2.0 summary
by
増田 亨
PDF
毎日が越境だ!
by
増田 亨
PDF
SoR 2.0 基幹システムの再定義と再構築
by
増田 亨
PDF
越境する情シス:進化可能なアーキテクチャを手に入れる
by
増田 亨
PDF
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
by
増田 亨
PDF
現場で役立つシステム設計の原則
by
増田 亨
ソフトウェア開発のやり方の改善
by
増田 亨
事業活動モデル・システム機能モデル・ビジネスロジックの記述
by
増田 亨
オブジェクト指向プログラミングの現在・過去・未来
by
増田 亨
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
by
増田 亨
プロダクトづくりのためのソフトウェア設計スタイル
by
増田 亨
ソフトウェア設計の学び方を考える
by
増田 亨
ソフトウェアの核心にある複雑さに立ち向かう
by
増田 亨
DDD sample code explained in Java
by
増田 亨
アジャイルなソフトウェア設計を目指して
by
増田 亨
SoR 2.0 summary
by
増田 亨
毎日が越境だ!
by
増田 亨
SoR 2.0 基幹システムの再定義と再構築
by
増田 亨
越境する情シス:進化可能なアーキテクチャを手に入れる
by
増田 亨
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
by
増田 亨
現場で役立つシステム設計の原則
by
増田 亨
ドメイン駆動で開発する ラフスケッチから実装まで
1.
ドメイン駆動で開発する 初期のラフスケッチから実装まで 2016年10月31日 ギルドワークス 増田 1
2.
ドメイン駆動設計の効果 役に立つソフトウエアを 確実に 効率的に ドメイン駆動設計でやらないと… 2
3.
設計の善し悪し 3
4.
拙い設計 • コードが重複しまくっている • 条件分岐の密林があちこちにある •
どこに何が書いてあるかわからない • 変更した時にどこで何が起きるか推測できない • やっていることは解読できるが、なぜ、そこでそ の処理が必要か意味がわからない • パッケージ名/クラス名/メソッド名/変数名/コメン トが嘘だらけ • でも動いてる 動いていなければ、ろくでもない設計であることは誰でもわかるのに… 4
5.
善い設計 • コードの重複がなくなる • 条件分岐の密林がなくなる •
どこに何が書いてあるかわかりやすくなる • 変更した時に影響範囲を限定しやすくなる • 処理の意図がすぐわかる • パッケージ名/クラス名/メソッド名/変数名が わかりやすく正確になる – コメントはむしろノイズ 5 ドメイン駆動設計を実践すると、自然にこうなっていく
6.
ドメイン駆動設計を 支える技法 6
7.
オブジェクト指向 インクリメンタルな設計 データクラス+機能クラスの世界から、ドメインオブジェクトの世界へ 「設計不要」でもなく「上流工程で設計する」でもない世界へ (JPA,Active Record,Entity Framework…) 技術的にはこの2つ越境が、ドメイン駆動設計を実践するブレークポイント 7 二つはコインの裏表
8.
ドメイン駆動設計の学習曲線と 2つのブレークポイント オブジェクト指向設計 インクリメンタルな設計 パラダイムシフトに3ヵ月から半年くらい 実プロジェクトでいっしょにやりながら パラダイムシフトに半年から数年 8
9.
オブジェクト指向 9 判断/加工/計算の ロジックを整理する技法 ロジックとデータをまとめて 一つのプログラミング単位にする 人間にわかりやすい単位に プログラムを分割して整理する クラス インスタンス変数 メソッド パッケージ クラス メソッド 名前 わかったつもりでもなかなかできない オブジェクト指向らしいロジックの整理のしかたを体で覚える
10.
インクリメンタルな設計 10 最初から良い設計は手に入らない コードを書いて動かしてみれば わかることがたくさんある 経験から学んだことを反映して 設計の改善を続ける 仕様の抜け漏れ 要求の勘違い 拙い設計 毎日、 知識を広げ 理解を深め コードに反映 どうしてもきれいな答えを最初から見つけたくなる 設計を少しずつ改善するスピード感を体で覚える
11.
ドメイン駆動設計の 手ごたえとハードル 11
12.
ドメイン駆動設計の手ごたえ • 対象領域の業務を学びながらソフトウェア 開発する面白さ • ソフトウェアが育っていく楽しさ •
対象領域の知識とコードが一致している 時のコードのわかりやすさ • 変更が楽で安全になる気持ちよさ • 正しい仕事をしている安心感 12
13.
ドメイン駆動設計のハードル • 発想の転換 – 「動いた」駆動から「善い設計」駆動へ –
「技術」駆動から「ドメイン」駆動へ • 「善い設計」の判断基準の変化 • 設計・開発手法の切り替え – オブジェクト指向へ – インクリメンタルな設計へ • 実装の制約との戦い – フレームワークやプログラミング言語の制約 13 ここらへんの 実践経験を紹介します
14.
ドメイン駆動設計 14
15.
ドメイン駆動設計の基本の活動 知識をかみ砕く 言葉を活用する モデルと実装を一致させる 第1章 第2章 第3章 15
16.
基本の活動 ドメインの オブジェクト モデル 利用者の 「重要な関心事」を 鋭く説明する 選び抜かれた 重要な関心事を コードで表現する 会話を繰り返して 「要点」を選び抜く 重要な「言葉」の解釈を チームで合意する 1章 2章 3章 16 第1章 ドメインの知識をかみ砕く 第3章 モデルと実装を結びつける 第2章 言葉を使った意図の伝達
17.
プロジェクトを始めてみたものの… 17
18.
開発者が対象業務を知らない 言葉がばらばら、思いもばらばら ふわっとしてあやしげな要望 どうすればよいか? 18
19.
どうすればよいか? 19
20.
リレーションシップ駆動 要件分析(RDRA) ・コンテキストモデル ・業務フローモデル ・イベント/状態モデル ICONIX ・ドメインオブジェクトの発見 ・ドメインモデルの育て方 ・ロバストネス分析 問題領域を把握する技法 初期のドメインモデルを 2時間以内で描く モデル間を関連づけて 整合性と網羅性を確保 ユースケースと実装の ギャップを埋める 20
21.
こんな感じでやってみた 21
22.
ドメイン駆動の開発プロセス 業務フロー モデルの改良 要約、骨格 画面・帳表ユースケース 属性の追加モデルの洗練 イベント 状態遷移 データモデル 初期の ラフスケッチ コンテキスト図 手がかかり ドメインオブジェクトの設計と実装 ロバストネス分析 必要ならシーケンス図 操作追加 Java ソース 基盤クラス追加 DDL/SQL ソース 問題領域の把握 構造化用語集 22
23.
最初にやっていたやり方 • モデルの作成に時間をかけた – モデリングツールの利用(Enterprise
Architect) – クラス図 – ユースケース記述 – ロバストネス図 – ER図 • 慣れて来たら、なんでもかんでも図にすることはなく なった – 複雑になるところだけ – しっかり設計したいところだけ • 設計ドキュメントの作成が一段落してからコードを書い ていた 23
24.
がんばって設計したつもりなのに あいかわらず修正や拡張は たいへんだった コード 汚い /
変更 やっかい 24
25.
汚いコードと格闘しながら いろいろ勉強してみた 25 オブジェクト指向 エクササイズ インクリメンタルな設計 抽象データ型 契約による設計 シームレスな開発 コードで意図を 表現する 既存のコードの 設計を改善する ドメインロジックの 設計パターン 言葉たいせつ モデルと実装の一致 通読した本は一冊もない そのかわり何回も何十回も拾い読みしている
26.
• オブジェクト指向がだんだん体になじんできた – 人間の関心事の表現と、ロジックの整理の単位(クラ ス)が一致してきた •
インクリメンタルな設計の良さがだんだんわかっ てきた • ドメイン駆動設計って、もともとそういう本だよね、 そういえば – オブジェクト指向ソフトウエアの開発者向けに書いた – 設計と開発プロセスの議論の基礎としてエクストリー ムプログラミングを使用する 26
27.
オブジェクト指向 インクリメンタルな設計 データクラス+機能クラスの世界から、ドメインオブジェクトの世界へ 「設計不要」でもなく「上流工程で設計する」でもない世界へ (JPA,Active Record,Entity Framework…) ドメイン駆動設計を支える技法 27 二つはコインの裏表
28.
ドメイン駆動設計の学習曲線と 2つのブレークポイント オブジェクト指向設計 インクリメンタルな設計 パラダイムシフトに3ヵ月から半年くらい 実プロジェクトでいっしょにやりながら パラダイムシフトに半年から数年 28私自身は、孤独な戦いの中で、ここまでに数年かかった
29.
近頃は こんなやり方で やっています 29
30.
ドメイン駆動で開発する 初期のラフスケッチから実装まで 事例紹介 30
31.
実際にやっていることを お伝えするための 前置き オブジェクト指向を体で覚える 技術方式の選択 ドメインオブジェクトの設計パターン この話が40ページくらい続きます ご了承ください 31
32.
オブジェクト指向設計を 体で覚える まずはここから ドメイン駆動設計のために 32
33.
体で覚える オブジェクト指向設計 33 頭でわかっているつもりではだめ オブジェクト指向らしい設計が 直観的にわかり オブジェクトらしいコードに 自然に手が動くように
34.
実践的に練習する オブジェクト指向エクササイズ ソフトウェア設計を改善する9つのルール リファクタリング 既存のコードの設計を改善する 34
35.
オブジェクト指向 エクササイズ オブジェクト指向の良さを生み出す9つのルール 35
36.
9つのルール 1. 一つのメソッドでインデントは一段階 2. else
句は使わない 3. すべてのプリミティブ型と文字列をラップする 4. 一行につきドットは1つまで 5. 名前を省略しない 6. すべてのエンティティを小さくする 7. 一つのクラスのインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter, setter, プロパティを使わない 36
37.
名前をつける 1. 一つのメソッドでインデントは一段階 2. else
句は使わない 3. すべてのプリミティブ型と文字列をラップする 4. 一行につきドットは1つまで 5. 名前を省略しない 6. すべてのエンティティを小さくする 7. 一つのクラスのインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter, setter, プロパティを使わない 37 パッケージ クラス メソッド 小さい単位で 名前をつける
38.
データとロジックを凝集させる 1. 一つのメソッドでインデントは一段階 2. else
句は使わない 3. すべてのプリミティブ型と文字列をラップする 4. 一行につきドットは1つまで 5. 名前を省略しない 6. すべてのエンティティを小さくする 7. 一つのクラスのインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter, setter, プロパティを使わない 38 値オブジェクト ファーストクラス コレクション データとロジックを別の場所におかない
39.
複数の関心事を持たない 1. 一つのメソッドでインデントは一段階 2. else
句は使わない 3. すべてのプリミティブ型と文字列をラップする 4. 一行につきドットは1つまで 5. 名前を省略しない 6. すべてのエンティティを小さくする 7. 一つのクラスのインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter, setter, プロパティを使わない 39 ルールに違反している時は、複数の関心事が混在している
40.
オブジェクト指向エクササイズ 9つのルールで、1000行くらい書いてみると オブジェクト指向らしい設計を体感できる 既存のコードから9つのルールの適用例を探し、 値オブジェクトやファーストクラスコレクションを 実際に作ってみると before/afterでオブジェクト指向設計を体感できる 40
41.
リファクタリング オブジェクト指向の良さを生み出す設計改善のガイドライン 41
42.
いやな臭い • コードが重複している • メソッドが長い •
クラスが大きい • 引数が多い • データとロジックの置き場所が別のクラスに 分かれている 42
43.
設計の改善 • 名前の変更 – 業務の関心事と実装を一致させる •
メソッドの抽出 – 手続きに名前をつける • クラスの抽出 – 手続きのグループに名前を付ける • メソッドの移動/フィールドの移動 – データとロジックの置き場所を同じクラスにする 43
44.
リファクタリング 既存のコードで、いやな臭いを見つける これを繰り返しているうちに ・いやな臭いに敏感になる ・最初から短いメソッド/小さなクラスを書きはじめる リファクタリングを適用して 設計改善のbefore/afterを体感する 44
45.
技術方式はたいせつ ドメイン駆動設計を実践するには 45
46.
レイヤ構造 • 三層構造ではなく、 三層+ドメイン層 • O-Rマッピング –
データクラス+機能クラス(手続き型)になりがち なツールは避ける • JPA, Active Record, Entity Framework、… – オブジェクトが主役の軽量のツールを選ぶ • myBatis, Spring JDBCTemplate, … 46
47.
プログラミング言語 • 静的な型付き言語 • 独自の型の定義 –
標準ライブラリの型(クラス)は汎用的すぎる – 目的特化の型をどんどん作る • 型名を明記して意図を表現する – メソッドの返す型、メソッドの引数の型 – インスタンス変数の型 – ローカル変数の型 • 型の設計変更に強い – リファクタリングを楽に安全に 47
48.
技術方式 わたしたちの選択 Java, Spring Boot 48
49.
プレゼンテーション層と ドメインオブジェクト 49 問題領域の オブジェクトモデル
50.
基本方針 • ドメインオブジェクトをそのまま使う • 画面 –
ドメインオブジェクトをHTMLにマッピング – HTTPリクエストをドメインオブジェクトにマッピング – Spring MVC/Thymeleaf • API – JSON<-> ドメインオブジェクトの自動マッピング – Spring MVC RestController / Jackson 50
51.
簡単にマッピングできない時 • ビュークラスを間にはさむ • 出力 –
ビュークラスのコンストラクタにドメインオブジェクトを渡す • 入力 – 入力データからビュークラスを生成する – そのビュークラスにドメインオブジェクトのファクトリメソッド を用意する • ビュークラスは判断/加工/計算のロジックを持つ – DTOではない • 安易にビュークラスを導入しない – ドメインの関心事の表現(ドメインオブジェクト)とインタ フェースが不一致なのはおかしい 51
52.
データソース層と ドメインオブジェクト 52 問題領域の オブジェクトモデル
53.
基本方針(構造) • アプリケーションクラスにデータソースクラスをイ ンジェクションする • Repositoryインタフェースを使って、データソース 層のクラスを隠ぺいする @Service class
OrderService { @Autowired OrderRepository repository; void register( Order order ) { repository.register(order); } } 53
54.
基本方針 • 軽量の O-R
マッピングを使う ドメイン層をO-Rマッピングの仕組みで汚染しない – myBatis – Spring JDBCTemplate • JPAなど重量級のツールを使う場合 – データの入れ物クラス(@Entity)は、データソース層のクラ スとして宣言する – データソース層で、ドメインオブジェクトと@Entityクラスを 変換する – ドメインオブジェクトには、O-R マッピングのアノテーション を持ち込まない 54
55.
ドメイン層 問題領域の オブジェクトモデル 55
56.
ドメインオブジェクトの 設計パターン ドメインオブジェクトの候補を見つけ ドメインオブジェクトを実装を楽にする指針 56
57.
関心事を表現する基礎部品 ドメインオブジェクトの設計パターン • 値オブジェクト • 識別オブジェクト •
ファーストクラスコレクション • 区分オブジェクト • How ではなくWhatを表現する • パッケージ 57
58.
値オブジェクト (ドメインロジックの置き場所の基本) 58
59.
値オブジェクト • 業務の関心事の基本語彙 – 日付、期間、数量、金額、単位、名称、備考、… •
ロジックの置き場所 – インスタンス変数として一つか二つの基本データ 型(文字列/数値/日付)を持つ – そのインスタンス変数を使った、判断・計算・加工 のロジックを一箇所に集める – コードの重複がなくなり、変更が楽になる 59
60.
値オブジェクト • ドメイン固有のString – PersonName,
MailAddress, Telephone, … • ドメイン固有のint/long/BigDecimal – Money, Quantity, Rate, … • ドメイン固有のLocalDate – DueDate, ExpireDate, DateRange, … データの用途を明確にする(ドメインの言葉に一致させる 扱うデータの範囲を業務に合わせて限定する データの扱い方(メソッド)を業務に合わせて限定する 60
61.
値オブジェクト String List<String> BigDecimal Integer … LocalDate Long 起算日 InitialDate 期限 DueDate 有効期間
ValidTerm 金額 Money 数量 Quantity 単位 Unit 品名 ProductName 備考 Remarks 摘要 Abstract 言語で用意された「型」 (汎用) 独自に定義した「型」 (目的特化) 61
62.
値オブジェクトの設計 • 完全コンストラクタ – すべてのインスタンス変数は、生成時に設定 •
不変 – setter を書かない(状態を変えない) – 値を変更する時は、別のオブジェクトを生成して返す – 不変による「安定」 • ロジックの置き場所 – インスタンス変数を使った、判断・加工・計算 – 何もしないで素のデータを返す getter はNG 62
63.
識別オブジェクト (関心事の特定方法) 63
64.
識別オブジェクト • 関心事を特定する • 人は何で特定するか –
名前 – 生年月日 – メールアドレス … • コンピュータは何で特定するか – 一意の管理番号 – equals() • 両方の目的に使えるオブジェク トを作る 64
65.
ファーストクラスコレクション (主要な関心事とロジックの置き場所) 65
66.
ファーストクラスコレクション • ListやSetをラップしたドメインオブジェクト • PurchaseHistory •
MailBox • SkillSet • 「一覧」や「履歴」という関心事の表現 – 「一覧」は利用者の関心事が集中する場所 – 「一覧」の議論は、重要な関心事の発見の良い機会 • コレクションの操作はコードがごちゃごちゃしや すく、変更の副作用が多い • クラスとして独立させ、そのクラスに閉じ込める 66
67.
ファーストクラスコレクション コレクション List<Item>だけを持つクラス コレクション操作のロジックを集める場所 外部にコレクションを公開しない 正しい状態を保証する コレクション操作のロジックがあちこちのクラ スに散らばらない/重複しない Item の件数制限や、合算方法に変更があっ ても他のクラスに波及しない Itemの一覧画面に関する変更は、まずここを 見れば良い ロジックを集める感覚を体で覚える 関心事とクラスを一致させる感覚を体で覚える
67
68.
区分オブジェクト (場合ごとのビジネスロジックの表現) 68
69.
区分オブジェクト • 振る舞いを持った Enum •
Java言語使用に組み込まれた Strategy/Stateパターン + • 区分ごとのロジックを多態で記述 場合ごとのビジネスルールの表現 69
70.
区分オブジェクトの効果 • 複雑な if文記述の解消 –
区分ごとの分岐記述( if文,switch文 )は一箇所に なる – 場合によっては、まったく書かなくてよい • どこに何が書いてあるかわかりやすくなる – 区分ごとのロジックをクラス単位で表現 • 区分の追加や削除をした時の、変更の副作 用が少ない(範囲を限定しやすい) 70
71.
How より What (意図の明確なインタフェース) 71
72.
expireDate.add(-1); expireDate.previousDay(); expireDate.dayOfFinalAlert (); 業務要件:期限切れの前日にアラートメールを送る How より
What 業務の関心事を明示的に表現する 72
73.
課金ポリシー 適用する() シーズン料金 レート() 夏料金 レート() 冬料金 レート() 料金 計算() <<interface>> 計算方法(How)を表現 料金区分(What)をクラスで表現 計算()メソッドに埋もれ、 暗黙化する業務知識 シンプルな設計に見えるが、 ルールの変更・追加のたびに 計算()メソッドが肥大化し、 if 文が増殖する 業務知識をそのまま、クラスとして表現 複雑に見えるが、ルール変更・追加が、 楽で安全になる ロジックをクラスで表現する 73
74.
パッケージ (重要なモデリング要素) 74
75.
パッケージ • 利用者の関心事の「境界」を表現する手段 – 関連するドメインオブジェクト(の型)のグループ –
プログラミング単位 – テスト単位 • 新しい発見とともに、積極的にパッケージ名 /パッケージ構成を変更し育てていく • 「第4部 戦略的設計」の主要ツール 75
76.
パッケージ図を使った ロジックの置き場所の俯瞰 76 与信限度額を考慮するとどうなるか? 発注と仕入れまで視野を広げるとどうなるか? 矢印で示した一方向の依存関係で正しく実装しているか/実装できるか?
77.
実際にやっていることを お伝えするための 前置き オブジェクト指向を体で覚える 技術方式の選択 ドメインオブジェクトの設計パターン ようやく前置きの終わり 77
78.
ドメインのラフスケッチから実装まで 事例 : アソビュー 78
79.
サービスの会社が 業務システムに取り組む話 • アソビュー • 全国のレジャー・遊び・体験が探せる日本最大 級の検索・予約サイト •
バックオフィス業務は必要最小限、かつ人間系 でがんばっているが… • 事業のさらなら発展のためには • バックオフィスのシステム充実が必須 • ただし、 • ビジネスモデルや業務フローは変わり続ける 79
80.
電子チケットサービス • ネット上で電子チケットの購入 • 入場時に、電子チケットの提示と「もぎり」 80
81.
「もぎり」電子チケットの購入 81
82.
電子チケットサービス • アソビューの挑戦 – 金流の変更 •
before : 主催会社にお金が入り、手数料を請求 • after: アソビューにお金が入り、主催会社に支払い – バックオフィス業務の複雑化 – 確実性や迅速性の要求 – バックオフィスシステムの開発経験不足 82
83.
そこで ドメイン駆動設計 83
84.
業務を理解する 関係者の言葉と思いを合わせる 実装可能なモデルを手に入れる 84
85.
ドメイン駆動設計 ドメインの オブジェクト モデル 利用者の 「重要な関心事」を 鋭く説明する 選び抜かれた 重要な関心事を コードで表現する 会話を繰り返して 「要点」を選び抜く 重要な「言葉」の解釈を チームで合意する 1章 2章 3章 85 第1章 ドメインの知識をかみ砕く 第3章 モデルと実装を結びつける 第2章 言葉を使った意図の伝達
86.
ドメインオブジェクトの 候補を見つける インクリメンタルに設計する 86
87.
インクリメンタルに設計する ざくっとラフスケッチをしてみる コードで書いて、動かしてみる リファクタリングをする 行き詰まったら 絵に描いてみる 会話をしてみる 結果をコードに反映する そうやって設計を改善し続ける それがもっとも確実で効率的 87
88.
ドメインオブジェクトの 候補を見つけるために ザクッとラフスケッチ 88
89.
サービスの概要と用語の洗い出し 89 初日にやったラフスケッチ キックオフミーティングに参加する前の予習
90.
チケット販売システムの 目的/背景をチームで確認 90
91.
業務の流れを追いかける 91 UXデザイナもこれを参考に ワイヤーを起こし始める 営業企画がこれを参考に 利用案内の準備を始める
92.
関心事をざくっと整理する 92
93.
インクリメンタルな設計 • このくらいの状態でコードを書き始める • 基本オブジェクトでロジックの置き場所を決める –
値オブジェクト – ファーストクラスコレクション – 区分オブジェクト – 識別オブジェクト • アーキテクチャはテンプレートを使う – Spring Boot – 基本のレイヤ構造 presentation/application/domain/infrastructure 93
94.
仕様を固めつつ リファクタリングしつつ コードを書くのに行き詰まったら 94
95.
絵を描きながら会話する 95 重要な概念をクラスに抽出 ロジックの置き場所の発見 ファーストクラス コレクション 第16章の 知識レベル
96.
絵を描きながら会話する 96 クラスを整理する パッケージ構成の改善 最初のラフスケッチ
97.
ラフスケッチには登場しない ドメインオブジェクトの例 • Rate – 値オブジェクト –
料率の計算ロジック • Amount – 値オブジェクト – 金額の四則演算 • DateRange – 値オブジェクト – 有効期間の設定と判定 • ValidType – 区分オブジェクト – チケットの状態区分と有効性の判定 最初から コードで書いて 成長させている 97
98.
やってみた結果 • 2か月での迅速なリリース • その後、事業もシステムも順調に成長中 •
企画部門や経営者から「チケットのような作り 方」に高い評価 • IT戦略としてのドメイン駆動設計の推進 98
99.
本日のまとめ 99
100.
ドメイン駆動設計の効果 役に立つソフトウエアを 確実に 効率的に 100
101.
オブジェクト指向 インクリメンタルな設計 データクラス+機能クラスの世界から、ドメインオブジェクトの世界へ 「設計不要」でもなく「上流工程で設計する」でもない世界へ (JPA,Active Record,Entity Framework…) ドメイン駆動設計を支える技法 101 二つはコインの裏表
102.
オブジェクト指向を体で覚える オブジェクト指向エクササイズ ソフトウェア設計を改善する9つのルール リファクタリング 既存のコードの設計を改善する 102
103.
インクリメンタルに設計する ざくっとラフスケッチをしてみる コードで書いて、動かしてみる リファクタリングをする 行き詰まったら 絵に描いてみる 会話をしてみる 結果をコードに反映する そうやって設計を改善し続ける それがもっとも確実で効率的 103
Download