SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
DDDのサンプルコード
isolating-the-domain
Spring Boot, Spring MVC, MyBatis, Thymeleaf
2019-02-18
2019/2/18 1
始める前に
ブログを書くかもという人、いらっしゃいますか?
2019/2/18 2
なぜ作ったか?
実アプリケーション並みの具体例がほしかった
コードがいちばん具体的に伝えることができる
質問が具体的になり、考え方の違いがはっきりする
今日のイベントのQAタイムでのフィードバックにわくわく
2019/2/18 3
https://github.com/system-sekkei/isolating-the-domain
何の具体例か?
2019/2/18 4
何の具体例か?
ビジネスルールが複雑さの原因
計算をモデリング
型指向でプログラミング
この3つがドメイン駆動設計の核心
3/22(金)DevLOVE Premium「ドメイン駆動設計 本格入門」で解説
今日は、コードを中心に、どういう雰囲気か紹介
2019/2/18 5
関心の分離
計算(ビジネスルール)を実行するモジュール群
データを入出力するモジュール群
この2つを分ける
同じモジュール(ソースファイル)に、計算と入出力を書かない
2019/2/18 6
モジュール構造の選択
手続き的な入出力モジュールに計算を埋め込む
(トランザクションスクリプト)
計算を型(値の種類)でモジュール化して組み合わせる
(ドメインモデル)
ドメインモデル→計算モデル→計算モジュール→値の種類→型→クラス
2019/2/18 7
サンプルの概要
時給ベースの給与計算モデル
背景にあるルール
雇用契約(時給単価, …)
労働基準法(深夜, 休日, 総労働時間, …)
計算に必要な事実
勤務実績(いつ、何時間)
給与計算ルールを62種類の型で記述
本日は、給与(Payroll)型を中心に説明
2019/2/18 8
この後の段取り
給与(Payroll)型を中心に、レイヤごとに説明
①ドメイン層(ビジネスルール層)
②アプリケーション層
③データソース層
④データベース
⑤プレゼンテーション層
⑥ビジネスルールの設計ドキュメント
レイヤごとにQAタイム
2019/2/18 9
⑤プレゼンテーション
層
②アプリケーション層
③データソース層
④データベース
①ビジネスルール層
給与計算
計算結果
給与の一覧 2月 支払い額
計算の元データ
→勤務時間の一覧(勤務の履歴)
→従業員の一覧→布川光義→時給の履歴
計算ロジックのアグリゲートクラス
domain.model.payroll.Payroll
計算結果
Payroll#totalPayment() : PaymentAmount
2019/2/18 10
ドメイン層(ビジネスルール層)
計算モデルが息づく場所
model パッケージ
type パッケージ
型指向のプログラミング
→github.com/masuda220/business-logic-patterns/wiki/設計ガイドライン
Plain Old Java
Bean Validation → 有効な値の表明 → 自己文書化の一部
可読性 over Javaの習慣的な記法
No getter, no setter, no Lombok, no JPA
Payrollクラス
事実への参照:Contract型(契約条件:時給単価、割り増しルール、…)
事実への参照:Attendance型 (勤務実績) → (TimeRecords型:コレクションオブジェクト)
計算の実行:totalAmount()
結果の表現:PaymentAmount型
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 11
QAタイム
ドメイン層(ビジネスルール層)について
(JIGドキュメントでも説明します)
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 12
アプリケーション層
計算モデルのインスタンスの生成を指示する→データソース層
Query サービス : 計算結果を返す(結果を表現した型のインスタンス)→プレゼンテーション層
Operation サービス:計算結果の記録/通知を指示する→データソース層
coordinatorクラス @Service
単機能のserviceのautowire
複数のサービスを複合したサービス
PayrollQueryCorrdinatorクラス
serviceクラス @Service
repositoryのautowire
単機能
ContractQueryServiceクラス
AttendanceQueryServiceクラス
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 13
QAタイム
アプリケーション層について
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 14
データソース層
データの入出力の実装
MyBatis SQL Mapper
SELECTの実行→オブジェクトの生成
記録すべき事実を持ったオブジェクト→INSERTの実行
ContractDataSourceクラス
TimeRecordDatasourceクラス
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 15
データベース
イミュータブルデータモデル
履歴+最新状態レコード
履歴:事実の記録 → INSERT オンリー
最新状態レコード:論理的には不要 → INSERT/DELETE
NO UPDATE
NO updated_at カラム
制約指向
型
NOT NULL制約、外部キー制約、ユニーク制約
とことん日本語
スキーマ名、テーブル名、カラム名
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 16
https://www.slideshare.net/kawasima/ss-40471672
https://www.slideshare.net/kawasima/ss-44958468
QAタイム
データソース層とデータベースについて
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 17
プレゼンテーション層
計算モデルのビュー
ドメインオブジェクトをそのまま表示 (naked object パターン)
Spring MVC
Direct Field Access → WebDataBinder#initDirectFieldAccess()
Thymeleaf
Semantic UI
PayrollControllerクラス
templates/payroll/list.html
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 18
QAタイム
プレゼンテーション層について
プレゼンテーション層
アプリケーション層
データソース層
データベース
ビジネスルール層
2019/2/18 19
JIGドキュメント
• ビジネスルールの設計ドキュメント
• コードから自動生成
• 設計レビューの補助(冶具)
2019/2/18 20
QAタイム
JIGドキュメントについて
2019/2/18 21
まとめ
2019/2/18 22
なぜ作ったか?
実アプリケーション並みの具体例がほしかった
コードがいちばん具体的に伝えることができる
質問が具体的になり、考え方の違いがはっきりする
2019/2/18 23
何の具体例か?
ビジネスルールが複雑さの原因
計算をモデリング
型指向でプログラミング
この3つがドメイン駆動設計の核心
3/22(金)DevLOVE Premium「ドメイン駆動設計 本格入門」で解説
今日は、コードを中心に、どういう雰囲気か紹介
2019/2/18 24

Más contenido relacionado

La actualidad más candente

Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
pospome
 

La actualidad más candente (20)

「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
「実践ドメイン駆動設計」 から理解するDDD (2018年11月)
 
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解するドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
 
正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース正しいものを正しく作る塾-設計コース
正しいものを正しく作る塾-設計コース
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜マルチテナントのアプリケーション実装〜実践編〜
マルチテナントのアプリケーション実装〜実践編〜
 
ドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみようドメイン駆動設計 コアドメインを語り合ってみよう
ドメイン駆動設計 コアドメインを語り合ってみよう
 
ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方ドメイン駆動設計のための Spring の上手な使い方
ドメイン駆動設計のための Spring の上手な使い方
 
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
 
マルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのことマルチテナント化で知っておきたいデータベースのこと
マルチテナント化で知っておきたいデータベースのこと
 
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチレガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
レガシーコードの複雑さに立ち向かう~ドメイン駆動設計のアプローチ
 
ドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドラインドメインオブジェクトの設計ガイドライン
ドメインオブジェクトの設計ガイドライン
 
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
 
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのかDDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
 
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計するドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する
 
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
今からでも遅くないDBマイグレーション - Flyway と SchemaSpy の紹介 -
 
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみようドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
 
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考えるGoのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
Goのサーバサイド実装におけるレイヤ設計とレイヤ内実装について考える
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
ソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考えるソフトウェア設計の学び方を考える
ソフトウェア設計の学び方を考える
 
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Springドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
 

Similar a DDD sample code explained in Java

アイデンティティ プロバイダーとの連携手法 Tsmatsuz
アイデンティティ プロバイダーとの連携手法 Tsmatsuzアイデンティティ プロバイダーとの連携手法 Tsmatsuz
アイデンティティ プロバイダーとの連携手法 Tsmatsuz
Tusyoshi Matsuzaki
 

Similar a DDD sample code explained in Java (20)

Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0Desktop app dev strategy for .net core 3.0
Desktop app dev strategy for .net core 3.0
 
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
Visual Studio 2019で始める「WPF on .NET Core 3.0」開発
 
.NET の過去、現在、そして未来
.NET の過去、現在、そして未来.NET の過去、現在、そして未来
.NET の過去、現在、そして未来
 
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とはがんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
がんばらなくても C# で Single Page Web アプリケーションが書けてしまう「Blazor」とは
 
.NET 最新ロードマップと今押さえておきたい技術要素
.NET 最新ロードマップと今押さえておきたい技術要素.NET 最新ロードマップと今押さえておきたい技術要素
.NET 最新ロードマップと今押さえておきたい技術要素
 
DDDモデリングハンズオン - レガシーをぶっつぶせ。現場でDDD!2nd
DDDモデリングハンズオン - レガシーをぶっつぶせ。現場でDDD!2ndDDDモデリングハンズオン - レガシーをぶっつぶせ。現場でDDD!2nd
DDDモデリングハンズオン - レガシーをぶっつぶせ。現場でDDD!2nd
 
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Codeどっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
どっちの VS ショー / 伝統の Visual Studio 2019、人気の Visual Studio Code
 
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】
 
C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021C#メタプログラミング概略 in 2021
C#メタプログラミング概略 in 2021
 
Logic Apps/Flow Update Summary
Logic Apps/Flow Update SummaryLogic Apps/Flow Update Summary
Logic Apps/Flow Update Summary
 
[visasQ] 2017-04-26 ビザスクを支えるアーキテクチャ
[visasQ] 2017-04-26 ビザスクを支えるアーキテクチャ[visasQ] 2017-04-26 ビザスクを支えるアーキテクチャ
[visasQ] 2017-04-26 ビザスクを支えるアーキテクチャ
 
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
【de:code 2020】 そのロジック、IoT Edge で動きます - Azure IoT Edge 開発 Deep Dive
 
最近のQ#について
最近のQ#について最近のQ#について
最近のQ#について
 
アイデンティティ プロバイダーとの連携手法 Tsmatsuz
アイデンティティ プロバイダーとの連携手法 Tsmatsuzアイデンティティ プロバイダーとの連携手法 Tsmatsuz
アイデンティティ プロバイダーとの連携手法 Tsmatsuz
 
Netmf-180224
Netmf-180224Netmf-180224
Netmf-180224
 
de:code 2019 Cloud トラック 総まとめ! 完全版
de:code 2019 Cloud トラック 総まとめ! 完全版de:code 2019 Cloud トラック 総まとめ! 完全版
de:code 2019 Cloud トラック 総まとめ! 完全版
 
Monaco Editor on Cloud
Monaco Editor on CloudMonaco Editor on Cloud
Monaco Editor on Cloud
 
WPF & Windows Forms on .NET Core 3.0
WPF & Windows Forms on .NET Core 3.0WPF & Windows Forms on .NET Core 3.0
WPF & Windows Forms on .NET Core 3.0
 
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
Aws Dev Day2021 「ドメイン駆動設計のマイクロサービスへの活用とデベロッパーに求められるスキル」参考資料(松岡パート)
 
初めてのWebプログラミング講座
初めてのWebプログラミング講座初めてのWebプログラミング講座
初めてのWebプログラミング講座
 

Más de 増田 亨

Más de 増田 亨 (17)

ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善ソフトウェア開発のやり方の改善
ソフトウェア開発のやり方の改善
 
事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述事業活動モデル・システム機能モデル・ビジネスロジックの記述
事業活動モデル・システム機能モデル・ビジネスロジックの記述
 
オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来オブジェクト指向プログラミングの現在・過去・未来
オブジェクト指向プログラミングの現在・過去・未来
 
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primerオブジェクト指向プログラミング入門 -- Java object-oriented programming primer
オブジェクト指向プログラミング入門 -- Java object-oriented programming primer
 
ドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイルドメイン駆動設計という設計スタイル
ドメイン駆動設計という設計スタイル
 
プロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイルプロダクトづくりのためのソフトウェア設計スタイル
プロダクトづくりのためのソフトウェア設計スタイル
 
ビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かうビジネスルールの複雑さに立ち向かう
ビジネスルールの複雑さに立ち向かう
 
ソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かうソフトウェアの核心にある複雑さに立ち向かう
ソフトウェアの核心にある複雑さに立ち向かう
 
アジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指してアジャイルなソフトウェア設計を目指して
アジャイルなソフトウェア設計を目指して
 
ドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かすドメイン駆動設計をゲーム開発に活かす
ドメイン駆動設計をゲーム開発に活かす
 
SoR 2.0 summary
SoR 2.0 summarySoR 2.0 summary
SoR 2.0 summary
 
毎日が越境だ!
毎日が越境だ!毎日が越境だ!
毎日が越境だ!
 
SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築SoR 2.0 基幹システムの再定義と再構築
SoR 2.0 基幹システムの再定義と再構築
 
越境する情シス:進化可能なアーキテクチャを手に入れる
越境する情シス:進化可能なアーキテクチャを手に入れる越境する情シス:進化可能なアーキテクチャを手に入れる
越境する情シス:進化可能なアーキテクチャを手に入れる
 
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイルドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
ドメイン駆動設計の基礎知識:設計のスタイル、開発のスタイル
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
 
現場で役立つシステム設計の原則
現場で役立つシステム設計の原則現場で役立つシステム設計の原則
現場で役立つシステム設計の原則
 

DDD sample code explained in Java