Submit Search
ドメインオブジェクトの見つけ方・作り方・育て方
May 25, 2016
70 likes
32,148 views
増田 亨
ドメイン駆動設計 のための オブジェクト指向設計 の基本と実装技法。
Read less
Read more
1 of 95
Download now
Downloaded 147 times
Recommended
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
関西DDD.java 勉強会 2016-3-5 (DDD Alliance 勉強会 2016-1-21 @東京の京都再演版)
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
Java/Spring Boot/MyBatis/Thymeleafを使った、ドメイン駆動設計のサンプルコード。ビジネスルールに焦点を合わせ、計算モデルで複雑さを整理し、型指向のプログラミングで実装する、その具体例。
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
ドメイン駆動設計 Domain-Driven Design ( DDD ) 準備 / スタートアップ / ブラッシュアップ / チャレンジ / 参考書籍 /
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
アジャイル札幌 ドメイン駆動設計 基本を理解する
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
java_ja java_ja_ddd 2013-3-22 発表。ドメイン駆動設計(DDD)の実践
ドメイン駆動設計 の 実践 Part3 DDD
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
2011/6/20 redajp
オブジェクト指向プログラミングのためのモデリング入門
オブジェクト指向プログラミングのためのモデリング入門
増田 亨
オブジェクト指向では、モデリング(分析)、設計、実装は、切れ目のない一体の活動。初期の分析は初期の設計であり、初期の実装。毎日分析し、毎日設計し、毎日実装しながら、一歩一歩、モデルも実装も進化させていく。
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
質問への回答(35件)を、ブログにまとめているのでこちらご覧ください https://little-hands.hatenablog.com/entry/2019/08/31/genba_de_ddd 「Mix Leap Study 特別編 - レガシーをぶっつぶせ。現場でDDD! コラボカンファレンス」登壇資料 ブログ:https://little-hands.hatenablog.com/ Twitter:https://twitter.com/little_hand_s 質問箱:https://peing.net/ja/little_hands
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
ドメイン駆動設計の要点は3つ。ビジネスルール・値オブジェクト・型
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
より詳細なCQRSに関する資料はこちら https://little-hands.hatenablog.com/entry/2019/12/02/cqrs 参考資料:http://little-hands.hatenablog.com/entry/jjug2017fall 社内新規プロダクトでDDD, CQRSの思想をベースとしたアーキテクチャを構築し、コマンド(更新系処理)ではSpring Data JPA(Hibernate)を、クエリ(参照系処理)ではjOOQを採用しました。 結果としてそれぞれのORMの良いところを生かした組み合わせのアーキテクチャが構築できたので、その経緯と得られた知見についてお話ししたいと思います。 以下のようなトピックを考えています。 ・CQRSの定義とメリットデメリット ・DDD,CQRSを検討するにあたってのORMの選定ポイント ・構築したアーキテクチャ CQRSはDDDと切り分けて単独でも適用することができるので、DDDについてご存知ない方もご覧いただけます。日本語の文献は意外と少ないので、この辺りの分野に興味がある人の参考になれば幸いです。
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
ドメイン駆動設計で、モデリングをどうやっているか、それをどう実装に結びつけているかの事例紹介。 RDRA+ICONXをベースに、より機敏なやり方への挑戦。実践的なオブジェクト指向設計。
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
ドメイン駆動設計の考え方、3原則、基本テクニック 1章から7章
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
増田 亨
第2シーズンに向けて、設計コースの内容と進め方について、説明会の資料
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
ドメイン駆動設計の考え方、ドメイン駆動設計を理解する三つのキーワード、エヴァンス本のススメ、レガシーに立ち向かう、マイクロサービスとドメイン駆動設計
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
増田 亨
ドメイン駆動設計
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
2021/11/24 「イミュータブルでゆこう」イベントの資料です。 データをリソースとイベントに場合分けして考えようという至極単純な話を1時間ほどしました。
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
ドメイン駆動設計の4つの基本活動、Springのプログラミングモデル、ドメイン駆動設計のためのSpringの使い方
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
エヴァンス本を読んだことがない人、ネット上の情報を聞きかじったことがある程度の人、そんな人たちを対象に、ドメイン駆動設計について、わかりやすく説明してみました。
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
ドメインロジックに焦点をあてる。 それが、ドメイン駆動設計の基本。 ドメイン駆動設計の考え方とやり方の説明と、実践基盤としての Spring Framework/Spring Boot を使った事例の紹介。
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
第1回 しょぼべん ( http://connpass.com/event/10849/ ) で話しした、イミュータブルデータモデル(世代編)です。
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】
増田 亨
前半は、ドメイン駆動設計を特徴づける4つのポイントを、後半は、エヴァンス本の構成を俯瞰しながら、解説してみました。 gunma.web #30 での発表資料。
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
PyCon JP 2017 発表資料です。
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
社内勉強会発表用 内容 ・モジュールの凝集度 ・モジュール結合度 ・オブジェクト指向 ・インタフェース
例外設計における大罪
例外設計における大罪
Takuto Wada
例外設計における大罪 Jun 27, 2012 @ java-ja
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2
増田 亨
#devlove0409 講演資料 DDD Domain-Driven Design 「ソフトウェア開発でもっとも重要な仕事はドメインモデルの設計である」
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
更新日時を排除していくことでそこそこのモデルを書けるようになる手法です。
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
ドメイン駆動設計やるならスモールオブジェクトプログラミング。オブジェクト指向の設計・実装の基本スタイル。
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
増田 亨
Devlove2012 カンファレンス 発表資料。 ドメイン駆動設計。アプリケーションアーキテクチャ、開発プロセス、設計スタイル。腕を磨く。
More Related Content
What's hot
(20)
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
ドメイン駆動設計の要点は3つ。ビジネスルール・値オブジェクト・型
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
より詳細なCQRSに関する資料はこちら https://little-hands.hatenablog.com/entry/2019/12/02/cqrs 参考資料:http://little-hands.hatenablog.com/entry/jjug2017fall 社内新規プロダクトでDDD, CQRSの思想をベースとしたアーキテクチャを構築し、コマンド(更新系処理)ではSpring Data JPA(Hibernate)を、クエリ(参照系処理)ではjOOQを採用しました。 結果としてそれぞれのORMの良いところを生かした組み合わせのアーキテクチャが構築できたので、その経緯と得られた知見についてお話ししたいと思います。 以下のようなトピックを考えています。 ・CQRSの定義とメリットデメリット ・DDD,CQRSを検討するにあたってのORMの選定ポイント ・構築したアーキテクチャ CQRSはDDDと切り分けて単独でも適用することができるので、DDDについてご存知ない方もご覧いただけます。日本語の文献は意外と少ないので、この辺りの分野に興味がある人の参考になれば幸いです。
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
ドメイン駆動設計で、モデリングをどうやっているか、それをどう実装に結びつけているかの事例紹介。 RDRA+ICONXをベースに、より機敏なやり方への挑戦。実践的なオブジェクト指向設計。
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
ドメイン駆動設計の考え方、3原則、基本テクニック 1章から7章
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
増田 亨
第2シーズンに向けて、設計コースの内容と進め方について、説明会の資料
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
ドメイン駆動設計の考え方、ドメイン駆動設計を理解する三つのキーワード、エヴァンス本のススメ、レガシーに立ち向かう、マイクロサービスとドメイン駆動設計
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
増田 亨
ドメイン駆動設計
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
2021/11/24 「イミュータブルでゆこう」イベントの資料です。 データをリソースとイベントに場合分けして考えようという至極単純な話を1時間ほどしました。
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
ドメイン駆動設計の4つの基本活動、Springのプログラミングモデル、ドメイン駆動設計のためのSpringの使い方
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
エヴァンス本を読んだことがない人、ネット上の情報を聞きかじったことがある程度の人、そんな人たちを対象に、ドメイン駆動設計について、わかりやすく説明してみました。
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
ドメインロジックに焦点をあてる。 それが、ドメイン駆動設計の基本。 ドメイン駆動設計の考え方とやり方の説明と、実践基盤としての Spring Framework/Spring Boot を使った事例の紹介。
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
第1回 しょぼべん ( http://connpass.com/event/10849/ ) で話しした、イミュータブルデータモデル(世代編)です。
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】
増田 亨
前半は、ドメイン駆動設計を特徴づける4つのポイントを、後半は、エヴァンス本の構成を俯瞰しながら、解説してみました。 gunma.web #30 での発表資料。
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
PyCon JP 2017 発表資料です。
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
社内勉強会発表用 内容 ・モジュールの凝集度 ・モジュール結合度 ・オブジェクト指向 ・インタフェース
例外設計における大罪
例外設計における大罪
Takuto Wada
例外設計における大罪 Jun 27, 2012 @ java-ja
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2
増田 亨
#devlove0409 講演資料 DDD Domain-Driven Design 「ソフトウェア開発でもっとも重要な仕事はドメインモデルの設計である」
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
更新日時を排除していくことでそこそこのモデルを書けるようになる手法です。
オブジェクト指向の設計と実装の学び方のコツ
オブジェクト指向の設計と実装の学び方のコツ
増田 亨
ドメイン駆動設計に15年取り組んでわかったこと
ドメイン駆動設計に15年取り組んでわかったこと
増田 亨
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
ドメインロジックの実装方法とドメイン駆動設計
ドメインロジックの実装方法とドメイン駆動設計
Tadayoshi Sato
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
3週連続DDDその1 ドメイン駆動設計の基本を理解する
3週連続DDDその1 ドメイン駆動設計の基本を理解する
増田 亨
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
増田 亨
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
実践に向けたドメイン駆動設計のエッセンス
実践に向けたドメイン駆動設計のエッセンス
増田 亨
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
イミュータブルデータモデル(世代編)
イミュータブルデータモデル(世代編)
Yoshitaka Kawashima
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】
増田 亨
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python におけるドメイン駆動設計(戦術面)の勘どころ
Junya Hayashi
モジュールの凝集度・結合度・インタフェース
モジュールの凝集度・結合度・インタフェース
Hajime Yanagawa
例外設計における大罪
例外設計における大罪
Takuto Wada
ドメイン駆動設計(DDD)の実践Part2
ドメイン駆動設計(DDD)の実践Part2
増田 亨
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
Similar to ドメインオブジェクトの見つけ方・作り方・育て方
(20)
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
ドメイン駆動設計やるならスモールオブジェクトプログラミング。オブジェクト指向の設計・実装の基本スタイル。
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
増田 亨
Devlove2012 カンファレンス 発表資料。 ドメイン駆動設計。アプリケーションアーキテクチャ、開発プロセス、設計スタイル。腕を磨く。
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
増田 亨
ドメイン駆動設計の実践 2nd version.
20100324 勉強会資料(ドメイン駆動)
20100324 勉強会資料(ドメイン駆動)
Masayuki Kanou
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
Tomoharu ASAMI
MaruLaboの浅海ゼミでの講座のスライドです。 https://www.marulabo.net/docs/asami26/ 作業分野「設計」についてアーキテクチャ設計、コンポーネント設計、ドメイン設計、UX/UI設計の順に 取り上げています。 今回はドメイン設計の4回目です。 前回ドメイン・オブジェクト設計について取り上げましたが、ドメイン・オブジェクトの実現のために少し深掘りの内容を解説しました。 ドメイン・エンティティの種別、ドメイン・エンティティとドメイン・バリューの関係について説明しています。
Jubatusでマルウェア分類
Jubatusでマルウェア分類
Shuzo Kashihara
機械学習×プログラミング勉強会 2012年5月11日
Tdd
Tdd
Takaya Kotohata
TDDs
ビッグデータ&データマネジメント展
ビッグデータ&データマネジメント展
Recruit Technologies
ビッグデータ&データマネジメント展での講演資料
ビッグデータ活用支援フォーラム
ビッグデータ活用支援フォーラム
Recruit Technologies
一人でも出来るコードリーディング
一人でも出来るコードリーディング
Taiyo Akashi
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
増田 亨
アジャイル札幌、DevLove仙台のジョイントイベントでお話させていただいた内容。
Big data解析ビジネス
Big data解析ビジネス
Mie Mori
Tokyo
ICDE2012勉強会:Social Media
ICDE2012勉強会:Social Media
Yuto Yamaguchi
ICDE2012勉強会
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
聡 中川
DDDモデリング勉強会 #6
DDDモデリング勉強会 #6
株式会社Jurabi
DDDモデリング勉強会#6 の発表資料 コンテキストマップの説明です
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Yuta Ohashi
Laravel/Vue.js 勉強会 #10
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
JavaScript 研修
JavaScript 研修
Yuki Ishikawa
2015年度 GX/MF エンジニア合同新人研修 3日目
【LiT Leaders】Android0309
【LiT Leaders】Android0309
Ryo Yamamoto
Android研修3月9日補足スライドです。
PHPフレームワーク入門
PHPフレームワーク入門
Sho A
ちいさなオブジェクトでドメインモデルを組み立てる
ちいさなオブジェクトでドメインモデルを組み立てる
増田 亨
ドメイン駆動設計という仕事の流儀
ドメイン駆動設計という仕事の流儀
増田 亨
DDD 20121106 SEA Forum November
DDD 20121106 SEA Forum November
増田 亨
20100324 勉強会資料(ドメイン駆動)
20100324 勉強会資料(ドメイン駆動)
Masayuki Kanou
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
設計/ドメイン設計(4) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第26回】
Tomoharu ASAMI
Jubatusでマルウェア分類
Jubatusでマルウェア分類
Shuzo Kashihara
Tdd
Tdd
Takaya Kotohata
ビッグデータ&データマネジメント展
ビッグデータ&データマネジメント展
Recruit Technologies
ビッグデータ活用支援フォーラム
ビッグデータ活用支援フォーラム
Recruit Technologies
一人でも出来るコードリーディング
一人でも出来るコードリーディング
Taiyo Akashi
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
増田 亨
Big data解析ビジネス
Big data解析ビジネス
Mie Mori
ICDE2012勉強会:Social Media
ICDE2012勉強会:Social Media
Yuto Yamaguchi
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
24時間でiOSアプリ-Twitterクライアント-の作成にチャレンジ ver1.1
聡 中川
DDDモデリング勉強会 #6
DDDモデリング勉強会 #6
株式会社Jurabi
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Vue.jsでFormをAtomic Designしてみた時のコンポーネント間のデータのやりとり
Yuta Ohashi
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
Tomoharu ASAMI
JavaScript 研修
JavaScript 研修
Yuki Ishikawa
【LiT Leaders】Android0309
【LiT Leaders】Android0309
Ryo Yamamoto
PHPフレームワーク入門
PHPフレームワーク入門
Sho A
More from 増田 亨
(20)
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
増田 亨
要件定義・仕様化・実装の継ぎ目をなくす開発手法。 ビジネスロジックを軸に組み立てる。 値の種類(型)に注目してモジュール化する
事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述
増田 亨
CCSR開発手法のための、分析設計パターンの概略
ドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドライン
増田 亨
ドメイン駆動設計の内輪の勉強会用に作ったドメインオブジェクトの設計ガイドラインを公開します。
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
1995年まで:イノベータとアーリーアダプターの時代; 1995-2005 : オブジェクト指向ブームと混乱の始まり; 2005-2015 : さらなる混乱と収束の兆し; 2015- ; 現在の状況とこれからの20年
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
増田 亨
ドメイン駆動設計に戦略的に取り組むための基本パターン「コアドメイン」について、4つの現場のインタビュー結果と、それをもとに、みんなで語り合ってみるワークショップ
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
Javaで学ぶ、オブジェクト指向プログラミングの基礎知識。型とカプセル化が腹落ちすると、びっくりするくらいオブジェクト指向プログラミングがわかようになる/できるようになる
ドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイル
増田 亨
設計スタイルの選択 ドメインロジックに焦点を合わせる 現場での実験結果と考察
プロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイル
増田 亨
正しいものを正しくつくる プロダクトづくりの不確実性と戦うためのソフトウェア設計 - 創発的な設計活動 - 柔軟なモジュール構造 - 20%に投資する
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
増田 亨
ソフトウェア設計の課題 ソフトウエア設計の品質 学習と成長 設計の初歩を学ぶ 中級者への道 上級者の挑戦
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
増田 亨
ドメイン駆動設計でなぜ作るのか? ドメイン駆動設計の考え方の核心 レガシーコードの改善にドメイン駆動設計が役に立つのか? ドメイン駆動設計でレガシーコードに立ち向かった8つのステップ 振り返りと展望
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨
ドメイン駆動設計でなぜ作るのか? ドメイン駆動設計の考え方 ドメイン駆動設計を実践するための6つの問い 事例研究 ドメイン駆動設計を現場に導入する 体験的に学ぶ エヴァンス本をちゃんと読む
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
アプリケーションの分割のアプローチ ●4つのアプローチ - ビジネスファンクション - 動詞/ユースケース - 名詞/リソース - 境界づけられたコンテキスト ● トランザクションの分割 - パイプライン化 (VETRO) - コーディネート (Saga) - 状態更新の非同期化 ( Event History - State Materialize - Domain Specific Query )
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
増田 亨
ビジネスルールのソフトウェア表現、現実世界のビジネスルール、ドメインモデルの俯瞰と構造化、事業モデルの俯瞰と枠組み 4つの領域をいったりきたりする。 広げながら掘り下げる。 役に立つソフトウェアを開発するスキルを磨いていく。
ソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かう
増田 亨
ドメイン駆動設計でなぜつくるのか? 「核心にある複雑さ」とは何か? その複雑さにどう立ち向かうか?
DDD sample code explained in Java
DDD sample code explained in Java
増田 亨
2019-02-18 #jsug ドメイン駆動設計サンプルコード徹底解説
アジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指して
増田 亨
変更を楽に安全にする4つの根底技法の紹介。
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
増田 亨
ドメイン駆動設計の基礎知識の説明と、ゲーム開発への活かし方。
SoR 2.0 summary
SoR 2.0 summary
増田 亨
事業環境と事業活動の変化に、柔軟に、迅速に、低コストで対応するためのアプローチの検討
毎日が越境だ!
毎日が越境だ!
増田 亨
エンジニアの学習と成長◆古い設計スタイルの呪縛を解く4つの合言葉◆「だいたいわかっている」の壁を突き抜ける5つの学習パターン
SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築
増田 亨
SoE, SoI の基盤となる次世代の SoR のあり方は何か? どこに着眼し、どういう方向を目指すか?
ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
増田 亨
事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述
増田 亨
ドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドライン
増田 亨
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
増田 亨
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
増田 亨
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
増田 亨
ドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイル
増田 亨
プロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイル
増田 亨
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
増田 亨
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
増田 亨
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
増田 亨
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
増田 亨
ソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かう
増田 亨
DDD sample code explained in Java
DDD sample code explained in Java
増田 亨
アジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指して
増田 亨
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
増田 亨
SoR 2.0 summary
SoR 2.0 summary
増田 亨
毎日が越境だ!
毎日が越境だ!
増田 亨
SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築
増田 亨
ドメインオブジェクトの見つけ方・作り方・育て方
1.
ドメインオブジェクトの 見つけ方・作り方・育て方 有限会社 システム設計 増田 亨 ドメイン駆動設計のための 2016-5-25
2.
ドメインオブジェクト どうやって見つけるか どうやって作るか どうやって育てるか 実際に、なにを考え、どうやっているのか
3.
オブジェクト指向設計の 考え方とやり方 オブジェクト指向エクササイズ 9つのルール モジュール性 5つの基準 抽象データ型 契約による設計 コードのいやな臭い その改善策1章 ドメインを学ぶ 2章 言葉を使う 3章
モデルと実装を結びつける 4章 ドメインを隔離する 5章 モデルを表現する部品 10章 しなやかな設計 4冊とも、想定読者はオブジェクト指向でコードを書く人 それぞれが関連している 今日は実践例として紹介してみたい
4.
ドメインオブジェクト 設計の基本 ・モジュール性 凝集と結合 ・オブジェクト指向によるモジュール性 見つけ方 ・ドメインを学ぶ ・とりあえずのひな型 ・ドメインオブジェクトの発見パターン 作り方 ・主役は値オブジェクト ・ドメインを隔離する ・オブジェクト指向エクササイズ 9つのルール 育て方 ・リファクタリング
いやな臭いと改善策 ・振る舞いを豊かにする7つの視点 ・しなやかな設計 6つのパターン
5.
4冊に共通する価値観 変化を続ける 変更容易性 複雑さと戦う そのための技法が、オブジェクト指向でありエクストリームプログラミング 4冊は、強調する点、抽象度、表現が異なるが、同じ考え方が底流にある
6.
オブジェクト指向の開発スタイル Iterative 小さく繰り返す Incremental +1
: 一度に少しずつ変化させる Interactive 意思の疎通を図りながら Synergy 3つの “I” の相乗効果 (足し算ではなく掛け算) 変更容易性を重視した設計技法の必然の開発スタイル 「変更」を予防する/管理する技法とは対照的な発想
7.
設計の基本 モジュール性 凝集と結合 オブジェクト指向によるモジュール性 ちょっとつまらない話になりますが…
8.
設計原則 モジュール性 凝集度 結合度 独立性の高い部品を組み合わせることで、複雑なソフトウェアを扱いやすくする技法 機能分割のモジュール性とオブジェクト指向のモジュール性は発想が別 「機能分割」のモジュール性と「オブジェクト指向」のモジュール性を いっしょくたに議論するからわかりにくい ? ? ?
9.
モジュール性の基準 凝集と結合を、もう少し整理したモジュール性の評価基準
10.
モジュール性の評価基準 基準 説明 分解しやすい Good NG 全体を部品にわけたとき、部品ごとに独立して開発できる 部品の開発に、他の部品の理解や参照が必要 組合せやすい Good NG 部品を、分解時の構造とは異なる組み合わせ方ができる 部品は、分解時の構造以外では使えない わかりやすい Good NG そのモジュールだけで、そのモジュールの用途を理解できる そのモジュールを理解するためには、そのモジュールを呼び出す 側、そのモジュールが呼び出す先を理解しないといけない 連続性 Good NG 仕様の変更の度合いとモジュールの変更の度合いが対応する 仕様の変更の度合いとモジュールの変更の度合いがばらつく 保護性 Good NG モジュールの障害が全体に波及しない モジュールの障害がシステム全体に伝播し増殖する 簡単に言えば 変更が楽で安全なのが良いモジュール性 変更がたいへんで危険なのが悪いモジュール性
11.
モジュール性:2つのアプローチ 機能クラス+データクラス 抽象データ型 Java は、クラスベースのオブジェクト指向言語 すべてのロジックとデータ構造は、クラスとして宣言する必要がある クラスの使い方で、大きく2つの方向に分かれる 機能分割 オブジェクト指向
12.
機能分割:機能クラスとデータクラス • C言語や COBOLの設計スタイルを、Java
に流用 • JavaBeans getter/setter – データの入れ物クラスの設計パターン – get する側のクラスに機能を記述する • JPA @Entity – Java Beans をテーブルとのマッピングに利用 (データモジュール) – 機能は、ロジッククラスに記述する (機能モジュール) • トランザクションスクリプト • ファットコントローラ/ファットサービス
13.
オブジェクト指向:抽象データ型 • メイヤー流の「型」重視のオブジェクト指向 • 使う側から見た抽象データ型 –
必要な判断・加工・計算を内部で実行して、その 「結果」を返してくれる – 内部をどのように実装しているかは非公開 • 抽象データ型の内部 – 具体的なデータ表現(非公開) – そのデータを使った、判断・加工・計算のロジック の記述
14.
抽象データ型の例 内部のデータ表現 公開メソッド(やってほしいこと) String char[]
value String substring() String[] split() String replace() … BigDecimal BigInteger intVal ( ⇒ int[] ) int scale BigDecimal add() BigDecimal[] divideAndRemainder() BigDecimal setScale() … LocalDate int year short month short day LocalDate plusDays() LocalDate minusMonths() boolean isBefore() … ArrayList Object[] elementData int size boolean add() boolean contains() …
15.
モジュール性の比較 基準 機能分割 機能クラス+データクラス オブジェクト指向 抽象データ型 分解しやすい ○ ○ 組合せやすい
× 分解時の構造に依存 ○ 分解時の構造に依存しない わかりやすい × 呼び出し元や呼び出し先を調べる 必要がある ○ 独立性が高い 連続性 × ひとつの変更が、複数個所に波及 する(コードの分散) ○ 関心事と実装の単位が整合している 保護性 × 呼び出し関係に沿って伝播する ○ 閉じ込めやすい 簡単に言えば 変更が楽で安全なのがオブジェクト指向 変更がたいへんで危険なのが機能分割
16.
オブジェクト指向のモジュール性 • 難しい理屈から理解するのはたいへん – 学び方として、費用対効果が悪い •
実際にやってみる – オブジェクト指向らしいコードを書いてみて、変更が楽で 安全になることを体験するのが一番 ⇒ オブジェクト指向エクササイズ 9つのルール ⇒ リファクタリング いやな臭いとその改善 ⇒ ドメイン駆動設計 10章しなやかな設計の6パターン • いちど味を覚えると元の世界にはもどれない – わかりやすい – 連続性 – 組合せやすい 知っておいて損はない こっちが好きな人はこちらからどうぞw
17.
モジュール性に優れたオブジェクト オブジェクト指向エクササイズ リファクタリング ドメイン駆動設計 10章しなやかな設計
18.
オブジェクト指向エクササイズ 1. 1つのメソッドにインデントは1段階まで 2. else
句は使わない 3. すべての基本データ型をラップする 4. 1行につきドットはひとつまで 5. 名前を省略しない 6. 50行を超えるクラスを作らない 7. 1つにクラスはインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter / setter を使わない このガイドラインにそってコードを書けばモジュール性を向上できる
19.
リファクタリング いやな臭い 1. 重複したコード 2.
長いメソッド 3. 大きなクラス 4. 多すぎる引数 5. 基本データ型への執着 6. データクラス 7. switch 文 8. コメント … モジュール性が悪くなっている明らかな兆候 リファクタリングによる改善 ・メソッドの抽出 ・クラスの抽出 ・メソッドの移動 ・メソッドオブジェクト 一つのメソッドにインデントは1段階まで 50行を超えるクラスを書かない ひとつのクラスのインスタンス変数は2つまで すべての基本データ型をラップする getter/setter を書かない ファーストクラスコレクションを使う else句を使わない
20.
ドメイン駆動設計 しなやかな設計 1. 意図の明確なインタフェース 2.
副作用のない関数 3. 表明 4. 概念の輪郭 5. 独立したクラス 6. 閉じた操作 10章の6つのパターン わかりやすい 組み立てやすい 分けやすさ 保護性 わかりやすい 連続性(モデルと実装の構造の一致) モジュール性を改善するための基本テクニック 5章の 値オブジェクトの設計パターンでもある
21.
設計の基本:まとめ • 設計の基本は「モジュール性」 • オブジェクト指向のモジュール性は 「抽象データ型」で実現する –
データクラス+機能クラスは、手続き型のモ ジュール性 • 理屈よりも実践で覚えるのが楽で確実 – オブジェクト指向エクササイズ 9つのルール – リファクタリング いやな臭いとその改善 – ドメイン駆動設計 10章しなやかな設計
22.
ドメインオブジェクトの見つけ方 ドメインを学ぶ とりあえずのひな型 覚えておくと役に立つ道具箱 メモ代わりにコードを書く
23.
ドメインを学ぶ 情報源 語彙を増やす 言葉を関係づける
24.
ドメイン駆動設計 ドメイン モデル ドメインの 「重要な関心事」を 鋭く説明する 選び抜かれた 重要な関心事を コードで表現する 会話を繰り返して 「要点」を明確にする 「重要な語彙」を チームで合意する 1章 2章 3章 24 第1章 ドメインの知識をかみ砕く 第3章 モデルと実装を結びつける 第2章 言葉を使った意図の伝達
25.
実際にどうやっているか 既存サイトの大幅改修の案件 召集されたチームが初日にやったこと
26.
トップページ ヘルプ 利用規約
27.
全体図+用語の洗い出し
28.
言葉を関連づけた 初期のクラスのラフスケッチ
29.
コードに書いてみる とりあえずのひな型 覚えておくと役に立つ設計パターン
30.
とりあえずのひな型:8点セット 「Plan」という関心事に対応して8つのクラスを書く とりあえずのスタートライン 名前や内容はあとから改善
31.
覚えておくと役に立つ ドメインオブジェクトの 発見パターン
32.
これらについて「名前」を探す
33.
関心事:3つの対象/6つの関係 ヒトは意思のある行動主体 特別の関心事 ・行動の履歴 ・連絡手段 ・特徴(Profile) ・好み(Preferece) 組合せは6種類だが、 ・方向 ・多重度 ・順序 ・再帰 など奥は深い ヒトとヒトの関係も 特別な関心事 ・コンタクト履歴 関心の強い関係には「名前」がついていることも多い 逆に関係の「名前」を発見できるとブレークスルーが起きる 多重度のある場合はファーストクラスコレクションクラスの名前になる
34.
関心事の種類と見つけ方 Aspect 知りたいこと それが何であるか which, what, when,
where 画面や帳票から具体的に見つけやすい Why 6つの関係 約束と履行 方針と規則 判断や行動の理由づけ 業務知識の中核 見つけにくい ここを深く理解し、コードでうまく表現するこ とがドメイン駆動設計の勝負どころ How 記録と参照 約束と履行の監視 業務の基本 要求は表面的 より突っ込んだ設計が必要 勘定パターンを参考に 通知 受信と送信 業務の流れ 具体的な要求として見つかりやすい whyの 実行手段 性状 枠組み 制約
35.
性状(aspect) : 知りたいこと which
識別 Identity 名前、番号 Category 名前 Type 名前 what 値 数量、金額、率 説明、注釈 状態 when 時 日付 期間 where 位置 Address Location Area 物理、論理、仮想 知りたいことに「名前」をつけ 基本データ型(文字列型、数値型、日付型)で表現する それが、値オブジェクト 絶対/相対
36.
why の設計パターン 外部との約束 「注文」は売買契約の一種 キンセャルポリシー
etc. 内部の取り決め(生産や開発) 誰と誰の約束か? 契約 スケジュール 方針と規則
37.
性状 状態 約束と履行 ヒト 初期のモデルにも いろいろ登場している
38.
ドメインオブジェクトの見つけ方:まとめ • 語彙を増やす – キャッチフレーズ、ヘルプ、利用規約、… •
関連づける – 言葉と言葉の正しい組み合わせ方を学ぶ – 図よりも声に出してしゃべってみる • 初日からコードを書く(クラス名を考える) – とりあえずのひな型 8クラス – 業務の関心事の発見パターン – メモ代わりに • src/main/java/domain/model を作って • ⌘N リターン 名前 リターン powered by Intellij IDEA
39.
ドメインオブジェクトの作り方 主役は値オブジェクト ドメインを隔離する オブジェクト指向エクササイズ 9つのルールで作る
40.
ドメイン知識を記述する ドメイン知識の実体は 基本データ型に対する ・判断 ・加工 ・計算 このコードをどこに書くか?
41.
オブジェクト指向エクササイズ 1. 1つのメソッドにインデントは1段階まで 2. else
句は使わない 3. すべての基本データ型をラップする 4. 1行につきドットはひとつまで 5. 名前を省略しない 6. 50行を超えるクラスを作らない 7. 1つにクラスはインスタンス変数は2つまで 8. ファーストクラスコレクションを使う 9. getter / setter を使わない このガイドラインにそってコードを書けばモジュール性を向上できる
42.
getter を使わない • getter
がないということは、データを持つオブ ジェクトに仕事を依頼するしかない – get して自分で判断・加工・計算するのはNG • 基本データ型はすべてラップする • クラスは、最大2つのインスタンス変数しか持 ていない つまり • 基本データ型を1つか2つもった、50行以内 のクラスに、業務ロジックを書く
43.
主役は値オブジェクト • 文字列・数値・日付を保持する • それらのデータを使った、判断・加工・計算を担 当する •
値オブジェクトの業務知識と振る舞いが豊かに なれば、業務ロジックの大半は値オブジェクトに 書かれるようになる • 名前(クラス名)がロジックの置き場所を導く – 省略しない – 同一のコード(式)の重複記述が激減する – わかりやすさ/変更の容易さの源泉
44.
ドメイン知識の置き場所 ドメイン知識の実体は データに対する ・判断 ・加工 ・計算 このコードをどう書くか?
45.
ドメイン駆動設計 しなやかな設計 1. 意図の明確なインタフェース 2.
副作用のない関数 3. 表明 4. 概念の輪郭 5. 独立したクラス 6. 閉じた操作 値オブジェクトの設計パターン 判断・加工・計算を依頼する メソッド名 言語の標準ライブラリのみ依存 業務の用語と値オブジェクトの名前を一致させる 完全コンストラクタ 不変オブジェクト 契約による設計 メソッドが返す型、受け取る型を 自分と同じ型にする BigDecimal, LocalDate, String は、ある程度、この条件を満たしている ただし、扱えるデータ範囲が広すぎ クラス名やメソッド名が漠然としていて意図が不明確
46.
ドメインオブジェクトの作り方 • String, BigDecimal,
LocalDate を一つか二つ持った 「値オブジェクト」を作る – クラス名で役割を明確に – 公開メソッドを少数に限定して意図を明確に – メソッド名で意図を明確に – 内部で保持するデータの範囲を限定して意図を明確に – 事前条件、事後条件、不変条件を明確に • null を渡さない、戻さない • ゼロ割り算をしない • 表明 and/or 例外のスロー
47.
値オブジェクトの例 String List<String> BigDecimal Integer … LocalDate Long 起算日 InitialDate 期限 DueDate 有効期間
ValidTerm 金額 Money 数量 Quantity 単位 Unit 品名 ProductName 備考 Remarks 摘要 Abstract 言語で用意された「型」 (汎用) 独自に定義した「型」 (目的特化) 47
48.
値オブジェクトの設計 • 完全コンストラクタ – すべてのインスタンス変数は、生成時に設定 •
不変 – setter を書かない(状態を変えない) – 値を変更する時は、別のオブジェクトを生成して返す – 不変による「安定」 • ロジックの置き場所 – インスタンス変数を使った、判断・加工・計算 – 何もしないで素のデータを返す getter はNG 48
49.
値オブジェクトが主役 • 業務の関心事の基本語彙の抽出手段 目的を限定した抽象データ型 – String,
BigDecimal, LocalDateの値の範囲、文字 種、形式、計算範囲を業務に合わせて制限する – 用途を限定するとプログラムが安定する – コードの重複がなくなり、変更が楽になる • 関心事を豊かに表現する手段 – メソッドの戻す値の「型」 – メソッドの引数の「型」 49
50.
コード例
51.
public class UserIdentity
{ @NotBlank(message = "メールアドレスを入力してください") @Email(message = "メールアドレスが正しくありません。") String mail; public UserIdentity(@NotNull String mail) { this.mail = mail; } public String mail() { return mail; // ローカル部(@の前) だけ返すとか、さんづけとか… } @Override public String toString() { return mail; } } Mail に型づけされた文字情報 データ表現として、InternetAddress を使うのも選択肢
52.
public class DateOfBirth
{ @NotNull(message = “誕生日を入力してください。”) LocalDate date ; // データ表現として 文字列ではなく、LocalDate型を使う String source; // 入力値の保持 boolean valid = true; // 入力値の有効性 public DateOfBirth(@NotNull String source) { this.source = source; try { LocalDate.parse(source); } catch ( DateTimeException exception) { valid = false; } } public Age age() { return new Age(this.date); // 年齢計算や表記は Age にまかせる } @AssertTrue(message = "日付が正しくありません。") public boolean isValid() { if(source.equals("")) return true; return valid; } @Override public String toString() { return source; } }
53.
あとは、育て方へ … 知識の広がり 知識の深まり コードで表現
54.
第4章 ドメインを隔離する 形式的な隔離 ドメインロジックをほんとうに隔離する オブジェクトの世界とフラットな世界 その前に
55.
形式的な隔離
56.
形式的な隔離
57.
形式的な隔離:お約束 クラス フィールド メソッド コントローラ PlanController @Conroller @RestController @ControllerAdvice @Autowired Service @RequestMapping @Validated アプリケーション PlanService @Service @Autowired Repository データソース PlanDatasource @Repository @Autowired Mapper データマッパー PlanMapper @Mapper
@Param ドメイン Plan PlanRepository … @Valid @NotBlank @Size … @AssertTrue ドメイン以外は、お約束の名前とアノテーションでシンプルに記述 コードがごちゃごちゃしてきたら、ドメインロジックがドメイン層から流出している兆候
58.
ドメインロジックをほんとうに隔離する • ドメインのロジックが書かれやすい個所 – ビューテンプレート –
コントローラ – サービス – データソース – SQL文( where 句とか ) – 動的SQL文の組み立てロジック – テーブル • 値オブジェクトに置くべきちょっとしたロジックがころがって いないか、いつもきょろきょろする – コードがごちゃごちゃしてきたら、そこにロジックが見つかる – 値オブジェクトにロジックを移動する – 新しい値オブジェクトを作る
59.
ドメインを隔離する オブジェクトの世界 / フラットな世界 基本データ型のリスト構造 ロジックのモジュール性を 取り除いた世界 具体的なデータ表現のみ グラフ構造(モジュール性) ロジックの整理の単位 関係の表現手段 組み立て方の柔軟性 抽象データ型(内部のデータ表現は隠ぺい) テーブル 画面項目 JSON
60.
ドメインロジックをほんとうに隔離する • 外部のビュー構造から独立させる – 外部のビュー
: フラットな基本データ型の羅列 • テーブル • 画面( form のデータバインディング) • JSON – ドメインオブジェクト : グラフ構造 • 構造変換 – グラフ ⇔ フラット – フレームワークを活用する ただし、フレームワークの都合は排除する ドメインの表現にこだわる 妥協しない
61.
フレームワークの都合を排除する • O-R マッピング MyBatis
SQL Mapper – ダイレクトフィールドアクセス ( getter/setter 不要) – 構造変換は、path 記法 ( plan.location.primary ) – null はマッピングされない • フォームバインディング Spring MVC DataBinder – ダイレクトフィールドアクセスに設定 (getter/setter を使わない) – 構造変換は、path 記法 – nullはバインドの対象外にする • O-JSON マッピング Jackson ObjectMapper – ダイレクトフィールドアクセスに設定 – 構造変換は、View クラスにやらせる • ドメインオブジェクトはどのような構造に変換されるか知らない
62.
public class CustomObjectMapper
{ public ObjectMapper ofDirectFieldAccess() { ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.FIELD,JsonAutoDetect.Visibility.NON_PRIVATE); mapper.setVisibility(PropertyAccessor.GETTER,JsonAutoDetect.Visibility.NONE); mapper.setVisibility(PropertyAccessor.SETTER,JsonAutoDetect.Visibility.NONE); return mapper; } } @ControllerAdvice public class BinderAdvice { @InitBinder public void initBinder(WebDataBinder binder) { binder.initDirectFieldAccess(); binder.registerCustomEditor(Object.class, new StringTrimmerEditor(true)); // ブランク文字列は、null とする // バインドの対象外となる } } ダイレクトフィールドアクセスの設定
63.
ドメインオブジェクトの作り方:まとめ • 主役は値オブジェクト – データの保持(文字列、数値、日付) –
データを使った、判断/加工/計算の置き場所 • オブジェクト指向エクササイズ 9つのルール – getter/setter を使わない – 名前は省略しない – ひとつのクラスにインスタンス変数は2つまで • ドメインを隔離する – 形式的な隔離 – ドメイン層以外へのロジックの記述に敏感になる – オブジェクトの世界/フラットな世界 • フレームワークを活用する • フレームワークや外部の都合を排除する
64.
ドメインオブジェクトの育て方 育て方のシナリオ リファクタリング 知識の置き場所のターゲット 7つの視点 しやなかな設計6つのパターン
65.
育て方のシナリオ 1. 最初は器だけのクラスを作る – とりあえずのひな型8点セット –
メモ代わりに作られたクラス名だけのクラス – コンストラクタと toString() だけの値オブジェクト ・・・ 2. 動かすために判断・加工・計算ロジックを書いていく – 理想:よく置き場所を考えて書く – 現実:てっとりばやく動かせる場所に書く 3. コードが増え、ごちゃごちゃしてくるので整理する – ドメインオブジェクトの持つデータを使って、判断・加工・計算してい るロジックを見つける(一行の式かもしれない) – そのロジック(計算・加工・判断)に名前をつける – 適切な場所にロジックを移動する(リファクタリング)
66.
ロジックを整理すべき兆候 リファクタリングのいやな臭い コードの重複 長いメソッド 大きなクラス 引数の多さ
67.
改善の技法 メソッドの抽出 クラスの抽出 メソッドの移動 一時変数を値オブジェクトに 長いメソッドをオブジェクトに
68.
メソッドの抽出 • 基本中の基本 • ひとかたまりのロジック(判断・加工・計算)を 見つける –
改行 – コメント – 3行以上、改行がなかったら怪しい • かたまりに名前をつける(メソッドを抽出する) – 一行の式でも、抽出の対象(名前をつける対象) – このひと手間が、ロジックの移動を可能にする
69.
クラスの抽出とメソッドの移動 • データに注目して別クラスを見つける – インスタンス変数が増えたら別クラスに •
インスタンス変数は2つまで – いつもペアになっている変数や引数のグループ を見つけたらクラスに • prefix や、 suffix が同じ変数名は、グループ化の有力 候補 • そのクラスのデータを使う判断・加工・計算の ロジックを、そのクラスに移動する – メソッド名を考える – やりたいことや知りたいこと
70.
一時変数を値オブジェクトに • メソッド内の一時変数を持つ値オブジェクトを 作る • その値オブジェクトにロジックを移動する •
もとのロジックを書き換える value = new ValueObject(一時変数) value.doSomething() • たった一行の式でも、こういう値オブジェクト にカプセル化すると、あちこちで利用可能に なる – コードの重複を減らす
71.
長いメソッドをオブジェクトに • ごちゃごちゃしたメソッドのリファクタリングの 定石 • メソッド名を名詞に変えたクラスを作る •
そのクラスに、メソッドごとコピーする • 元のクラスのインスタンス変数、メソッドの引 数、一時変数をすべて、新しいクラスのインス タンス変数として宣言する • すべての変数がインスタンス変数なので、い かようにも、メソッドの分割ができる
72.
ロジックの置き場所のターゲット 値オブジェクト 一覧オブジェクト 区分オブジェクト
73.
ドメインのロジックをどこに書くか その有力な候補が 値オブジェクト、一覧オブジェクト、区分オブジェクトの3つ
74.
値オブジェクト 「値」の判断・加工・計算ロジックの置き場所 74
75.
値オブジェクト String List<String> BigDecimal Integer … LocalDate Long 起算日 InitialDate 期限 DueDate 有効期間
ValidTerm 金額 Money 数量 Quantity 単位 Unit 品名 ProductName 備考 Remarks 摘要 Abstract 言語で用意された「型」 (汎用) 独自に定義した「型」 (目的特化) 75
76.
一覧オブジェクト (ファーストクラスコレクション) 76
77.
一覧オブジェクト (ファーストクラスコレクション) • ListやSetをラップしたドメインオブジェクト • Offers •
MailBox • SkillSet • 「一覧」や「履歴」という関心事の表現 – 「一覧」は利用者の関心事が集中する場所 – 「一覧」の議論は、重要な関心事の発見の良い機会 • コレクションの操作は、コードがごちゃごちゃしや すく、変更の副作用が多い – クラスとして独立させ、そのクラスに閉じ込める 77 9章 概念を掘り出す 10章 概念の輪郭
78.
区分オブジェクト (場合ごとのビジネスルールの表現) 78
79.
区分オブジェクト • 振る舞いを持った Enum •
区分ごとのロジックを別クラスに記述 • Java言語使用に組み込まれた Strategy/Stateパターン 説明とコード例は、googleで 「場合わけの書き方あれこれ」で検索。 または「オブジェクト指向をきちんと使 いたいあなたへ」 場合ごとのビジネスルールの表現 79
80.
区分オブジェクトの効果 • 関心事の明示的なコード表現 • 複雑な
if文記述の解消 – 区分ごとの分岐記述( if文 or switch文 )は、一箇所 になる – 場合によっては、まったく書かなくてよくなる • どこに何が書いてあるかわかりやすくなる – 区分ごとの業務ルールや知識のロジックの置き場所 をクラス単位で分離 • 区分の追加や削除をした時の、変更の副作用が 少ない 80 9章 概念を掘り出す 10章 概念の輪郭
81.
オブジェクトを育てる7つの視点
82.
振る舞いを豊かにするメソッド候補 視点 例 文字列で表現する show(), asText(),
inThousand(), shortName() , fullName(), … 文字列から生成する parse(), of(), from(), … 同一性の判定 isSame(), equalsIgnoreCase(), … 比較・順序づけ compareTo(), before(), after(), … 計算 plus(), minus(), next(), previous(), with(), … 列挙 values(), contains(), valueOf(), … 上限・下限 max(), min(), within(), …. 元ネタは Haskell の組み込みの型クラス
83.
第10章 しなやかな設計 値オブジェクト、一覧オブジェクト、区分オブジェクトの 改善のチェックリスト
84.
しなやかな設計:6つのパターン 1. 意図の明確なインタフェース 2. 副作用のない関数 3.
表明 4. 概念の輪郭 5. 独立したクラス 6. 閉じた操作 モジュール性を改善するためのチェックリストとして使う
85.
予測可能に改善する 1. 意図を明確に – クラス名やメソッド名をみただけで、どんな判断・加工・計算を やってもらえるか、わかりやすいか? 2.
メソッドの副作用をなくす – query と command は同じメソッドにしない – クライアント側からとのお約束の例 • query で確認してから command 実行 • command を実行してから query で確認 3. 表明を具体的に – アノテーション – 例外のスロー宣言 – JavaDoc – assert 文 ( Java では使い物にならない) – テストコード ( 別モジュールになるのが難点)
86.
モジュールの独立性を高める 4.概念の輪郭 – 業務の関心事とモジュールの単位を合わせる – どこに何が書いてあるかわかりやすく –
業務のニーズの変更とモジュールの変更の連続性を向上する 5.独立したクラス – 言語仕様と標準ライブラリだけに依存させると独立性が高くな る – 変更の影響が局所化しやすい – 再利用が容易 6.閉じた操作 – メソッドの返す型、引数の型を、自身の型だけにする – 他のモジュールへの依存性が減る
87.
ドメインオブジェクトの育て方:まとめ • ごちゃごちゃしてきたら整理する • 整理の基本はメソッドの抽出と移動 •
移動先の有力候補は、値オブジェクト、一覧 オブジェクト、区分オブジェクト • 7つの視点で振る舞いを豊かにする • 6つのパターンでモジュール性を改善する
88.
本日のまとめ 88
89.
ドメインオブジェクト どうやって見つけるか どうやって作るか どうやって育てるか 実際に、なにを考え、どうやっているのか
90.
オブジェクト指向設計の 考え方とやり方 オブジェクト指向エクササイズ 9つのルール モジュール性 5つの基準 抽象データ型 契約による設計 コードのいやな臭い その改善策1章 ドメインを学ぶ 2章 言葉を使う 3章
モデルと実装を結びつける 4章 ドメインを隔離する 5章 モデルを表現する部品 10章 しなやかな設計 4冊とも、想定読者はオブジェクト指向でコードを書く人 それぞれが関連している 今日は実践例として紹介してみたい
91.
ドメインオブジェクト 設計の基本 ・モジュール性 凝集と結合 ・オブジェクト指向によるモジュール性 見つけ方 ・ドメインを学ぶ ・とりあえずのひな型 ・ドメインオブジェクトの発見パターン 作り方 ・主役は値オブジェクト ・ドメインを隔離する ・オブジェクト指向エクササイズ 9つのルール 育て方 ・リファクタリング
いやな臭いと改善策 ・振る舞いを豊かにする7つの視点 ・しなやかな設計 6つのパターン
92.
ドメイン駆動設計への道 92
93.
できない理由? • 今のプロジェクトでは無理 • 今のチームでは無理 •
今の会社では無理 • 今の自分の力では無理 … 93
94.
• どんな状況でも改善できる • どんなときでも「あなた」から改善を始められる •
どんなときでも「今日」から改善を始められる ケント・ベックのメッセージ 94
95.
ドメイン駆動設計への道 95 どんな状況でも「ドメインの知識」を学ぶことはできる どんな時でも「ドメインの言葉」で話すことはできる どんな時でもドメインの言葉を「コード」に反映できる
Download