Submit Search
Upload
Python におけるドメイン駆動設計(戦術面)の勘どころ
•
16 likes
•
17,591 views
Junya Hayashi
Follow
PyCon JP 2017 発表資料です。
Read less
Read more
Software
Report
Share
Report
Share
1 of 33
Download now
Download to read offline
Recommended
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
Python 3のWebシステムでDDDに入門してみた
Python 3のWebシステムでDDDに入門してみた
Hiromu Yakura
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
Recommended
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
ドメイン駆動設計サンプルコードの徹底解説
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
Python 3のWebシステムでDDDに入門してみた
Python 3のWebシステムでDDDに入門してみた
Hiromu Yakura
世界一わかりやすいClean Architecture
世界一わかりやすいClean Architecture
Atsushi Nakamura
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Cognitive Complexity でコードの複雑さを定量的に計測しよう
Shuto Suzuki
ドメイン駆動設計 基本を理解する
ドメイン駆動設計 基本を理解する
増田 亨
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
ドメイン駆動設計のためのオブジェクト指向入門
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
Rest ful api設計入門
Rest ful api設計入門
Monstar Lab Inc.
こわくない Git
こわくない Git
Kota Saito
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する
増田 亨
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
nasa9084
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
例外設計における大罪
例外設計における大罪
Takuto Wada
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
Takayuki Shimizukawa
Sappo ro#6資料2 ー完全版ー
Sappo ro#6資料2 ー完全版ー
Wakana_kudo
More Related Content
What's hot
Rest ful api設計入門
Rest ful api設計入門
Monstar Lab Inc.
こわくない Git
こわくない Git
Kota Saito
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
Yoshitaka Kawashima
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
Hiroshi Ito
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
増田 亨
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
増田 亨
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
増田 亨
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
Ryuji Tsutsui
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する
増田 亨
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
Yoshinori Matsunobu
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
nasa9084
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
Yoshitaka Kawashima
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
例外設計における大罪
例外設計における大罪
Takuto Wada
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
増田 亨
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
増田 亨
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
増田 亨
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
mosa siru
What's hot
(20)
Rest ful api設計入門
Rest ful api設計入門
こわくない Git
こわくない Git
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
イミュータブルデータモデルの極意
イミュータブルデータモデルの極意
ドメイン駆動設計 ( DDD ) をやってみよう
ドメイン駆動設計 ( DDD ) をやってみよう
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
データ履歴管理のためのテンポラルデータモデルとReladomoの紹介 #jjug_ccc #ccc_g3
ドメインオブジェクトの見つけ方・作り方・育て方
ドメインオブジェクトの見つけ方・作り方・育て方
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動で開発する ラフスケッチから実装まで
ドメイン駆動設計の正しい歩き方
ドメイン駆動設計の正しい歩き方
Python 3.9からの新定番zoneinfoを使いこなそう
Python 3.9からの新定番zoneinfoを使いこなそう
ドメイン駆動設計 分析しながら設計する
ドメイン駆動設計 分析しながら設計する
ソーシャルゲームのためのデータベース設計
ソーシャルゲームのためのデータベース設計
webエンジニアのためのはじめてのredis
webエンジニアのためのはじめてのredis
ソフトウェア開発における『知の高速道路』
ソフトウェア開発における『知の高速道路』
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
例外設計における大罪
例外設計における大罪
リッチなドメインモデル 名前探し
リッチなドメインモデル 名前探し
ドメイン駆動設計 本格入門
ドメイン駆動設計 本格入門
世界でいちばんわかりやすいドメイン駆動設計
世界でいちばんわかりやすいドメイン駆動設計
開発速度が速い #とは(LayerX社内資料)
開発速度が速い #とは(LayerX社内資料)
Viewers also liked
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
Takayuki Shimizukawa
Sappo ro#6資料2 ー完全版ー
Sappo ro#6資料2 ー完全版ー
Wakana_kudo
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装
__nakamichi__
Prophet入門【理論編】Facebookの時系列予測ツール
Prophet入門【理論編】Facebookの時系列予測ツール
hoxo_m
Prophet入門【R編】Facebookの時系列予測ツール
Prophet入門【R編】Facebookの時系列予測ツール
hoxo_m
Prophet入門【Python編】Facebookの時系列予測ツール
Prophet入門【Python編】Facebookの時系列予測ツール
hoxo_m
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
Nagi Teramo
Viewers also liked
(7)
Pythonはどうやってlen関数で長さを手にいれているの?
Pythonはどうやってlen関数で長さを手にいれているの?
Sappo ro#6資料2 ー完全版ー
Sappo ro#6資料2 ー完全版ー
R6パッケージの紹介―機能と実装
R6パッケージの紹介―機能と実装
Prophet入門【理論編】Facebookの時系列予測ツール
Prophet入門【理論編】Facebookの時系列予測ツール
Prophet入門【R編】Facebookの時系列予測ツール
Prophet入門【R編】Facebookの時系列予測ツール
Prophet入門【Python編】Facebookの時系列予測ツール
Prophet入門【Python編】Facebookの時系列予測ツール
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法
Similar to Python におけるドメイン駆動設計(戦術面)の勘どころ
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計
Shinnosuke Tokuda
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版
DIVE INTO CODE Corp.
今さら聞けない人のためのGit超入門 GitLab 13対応版
今さら聞けない人のためのGit超入門 GitLab 13対応版
VirtualTech Japan Inc./Begi.net Inc.
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
Yuta Matsumura
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
DIVE INTO CODE Corp.
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】
増田 亨
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
Masahito Zembutsu
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
gree_tech
今さら聞けない人のためのGit超入門 GitLab 14対応版
今さら聞けない人のためのGit超入門 GitLab 14対応版
VirtualTech Japan Inc./Begi.net Inc.
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
Mori Shingo
うちの開発におけるXD利用法
うちの開発におけるXD利用法
Kazuma Sekiguchi
ソフトウェア工学2023 13 ドキュメンテーション
ソフトウェア工学2023 13 ドキュメンテーション
Toru Tamaki
夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用
夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用
Developers Summit
コンテナーによるIT基盤変革 - IT infrastructure transformation -
コンテナーによるIT基盤変革 - IT infrastructure transformation -
日本ヒューレット・パッカード株式会社
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Kazumi IWANAGA
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
Michitaka Terada
今さら聞けない人のためのGit超入門 2019/11/21
今さら聞けない人のためのGit超入門 2019/11/21
VirtualTech Japan Inc./Begi.net Inc.
今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門
VirtualTech Japan Inc./Begi.net Inc.
Similar to Python におけるドメイン駆動設計(戦術面)の勘どころ
(20)
はてなにおける継続的デプロイメントの現状と Docker の導入
はてなにおける継続的デプロイメントの現状と Docker の導入
hooks riverpod + state notifier + freezed でのドメイン駆動設計
hooks riverpod + state notifier + freezed でのドメイン駆動設計
ゼロからのプログラミングRails講座 Codeanywhere版
ゼロからのプログラミングRails講座 Codeanywhere版
今さら聞けない人のためのGit超入門 GitLab 13対応版
今さら聞けない人のためのGit超入門 GitLab 13対応版
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
ドメイン駆動設計とは何か 【入門編】
ドメイン駆動設計とは何か 【入門編】
マイクロサービス時代の生存戦略 with HashiCorp
マイクロサービス時代の生存戦略 with HashiCorp
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
今さら聞けない人のためのGit超入門 GitLab 14対応版
今さら聞けない人のためのGit超入門 GitLab 14対応版
Node予備校 vol.1 名古屋
Node予備校 vol.1 名古屋
うちの開発におけるXD利用法
うちの開発におけるXD利用法
ソフトウェア工学2023 13 ドキュメンテーション
ソフトウェア工学2023 13 ドキュメンテーション
夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用
夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用
コンテナーによるIT基盤変革 - IT infrastructure transformation -
コンテナーによるIT基盤変革 - IT infrastructure transformation -
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Rancherを活用して開発効率を上げる
Rancherを活用して開発効率を上げる
今さら聞けない人のためのGit超入門 2019/11/21
今さら聞けない人のためのGit超入門 2019/11/21
今さら聞けない人のためのgit超入門
今さら聞けない人のためのgit超入門
More from Junya Hayashi
断言して間違えると信頼度が低下するというベイズの話
断言して間違えると信頼度が低下するというベイズの話
Junya Hayashi
ヒキガエルは地震を予知するのか
ヒキガエルは地震を予知するのか
Junya Hayashi
量から質への転化の法則
量から質への転化の法則
Junya Hayashi
DynamoDB Before and After GSI
DynamoDB Before and After GSI
Junya Hayashi
IT業界の記事に見られる「中日ドラゴンズの論理」の落とし穴
IT業界の記事に見られる「中日ドラゴンズの論理」の落とし穴
Junya Hayashi
U分布と宇宙
U分布と宇宙
Junya Hayashi
Pyramid + socket.io 人狼を作ってみた
Pyramid + socket.io 人狼を作ってみた
Junya Hayashi
カタンの流れを検証してみた
カタンの流れを検証してみた
Junya Hayashi
サンクトペテルブルクのパラドックス
サンクトペテルブルクのパラドックス
Junya Hayashi
サイコロを100万回振ってみた
サイコロを100万回振ってみた
Junya Hayashi
Cross2013_GREE
Cross2013_GREE
Junya Hayashi
More from Junya Hayashi
(11)
断言して間違えると信頼度が低下するというベイズの話
断言して間違えると信頼度が低下するというベイズの話
ヒキガエルは地震を予知するのか
ヒキガエルは地震を予知するのか
量から質への転化の法則
量から質への転化の法則
DynamoDB Before and After GSI
DynamoDB Before and After GSI
IT業界の記事に見られる「中日ドラゴンズの論理」の落とし穴
IT業界の記事に見られる「中日ドラゴンズの論理」の落とし穴
U分布と宇宙
U分布と宇宙
Pyramid + socket.io 人狼を作ってみた
Pyramid + socket.io 人狼を作ってみた
カタンの流れを検証してみた
カタンの流れを検証してみた
サンクトペテルブルクのパラドックス
サンクトペテルブルクのパラドックス
サイコロを100万回振ってみた
サイコロを100万回振ってみた
Cross2013_GREE
Cross2013_GREE
Python におけるドメイン駆動設計(戦術面)の勘どころ
1.
Python における ドメイン駆動設計(戦術面)の 勘どころ 2017-09-09 @
PyCon JP 2017 林 淳哉
2.
自己紹介 ● 林 淳哉
(@loose_agilist) ● GROOVE X でロボット開発 ● 「実践ドメイン駆動設計」 Reviewer ● Qiita に DDD の記事書いてます
3.
今日おはなしすること ● ドメイン駆動設計とは ● ドメイン駆動設計の悩みどころ ●
Todo List を例にしたドメイン駆動設計の実践 ○ https://github.com/ledmonster/ddd-python-inject
4.
$ git clone https://github.com/ledmonster/ddd-python-inject $
cd todolist $ python setup.py develop $ ./bin/todo --help
5.
ドメイン駆動設計とは何か ● Eric Evans
が提唱した設計手法 ● モデリング技術 や オブジェクト指向設計 を抽象化し、 問題領域の抽出から、アーキテクチャ設計、モデリング、 実装に至る全工程を 一貫性のある体系 として整理したも の
6.
おすすめ書籍 エリック・エヴァンスのドメイン駆動設計 (2011) “Domain Driven
Design” Eric Evans (2003) DDD 信者の聖書。その難解さから「鈍器」と呼ばれる。抽象度が高く、分厚いので 読み通すの大変だが、何回読んでも発見がある。ここで整理されている概念は、 10 年以上経った今も色褪せない。 実践ドメイン駆動設計 (2015) “Implementing Domain Driven Design” Vaughn Vernon (2011) Evans 本の中身は本質を突いているが、その実践は容易でない。本書は、 Evans 本以降の10年間に発表された新しい開発技法を取り込みながら、 DDD の考え方 を実践に移すにはどうすれば良いかを記述した指南書。 ※ 読むのに挫折しても、鈍器としてなら使えます ※ ※ 翻訳レビューに参加しました。
7.
ドメイン駆動設計を構成する要素 ● 「戦略」的側面 ○ 将棋でいう「定跡」 ○
プロダクト全体を俯瞰するための考え方 ● 「戦術」的側面 ○ 将棋でいう「手筋」 ○ 個々の実装のための考え方
8.
● ユビキタス言語 ○ プロダクト全体で統一された言葉 を使おう ●
コアドメイン、サブドメイン、汎用 ドメイン ○ 問題領域を整理しよう ● 境界付けられたコンテキスト ○ 実装するシステムを整理しよう ● コンテキストマップ ○ システム間の関係を整理しよう ドメイン駆動設計の 「戦略」的側面
9.
ドメイン駆動設計の 「戦術」的側面 ● アーキテクチャ ○ MVC,
MVVM などの実装パターン ● ドメインモデル ○ エンティティ ■ 識別子を持つもの ○ 値オブジェクト ■ 値に型を与えたもの ○ サービス ■ 振舞いだけを提供するもの ○ リポジトリ ■ 永続化の仕組み ○ ファクトリ ■ オブジェクトを生成する仕組み ○ 集約 ■ 不変条件を管理する単位 ○ ドメインイベント ■ エンティティの変化を表現したイベント ● アプリケーション ○ コンテキスト全体の調整役
10.
ヘキサゴナルアーキテクチャとは ● 依存性逆転の原則(DIP)を用いて、 ドメインモデルから外部システム(DB・UIなど)への 依存を排除したアーキテクチャ手法 ● 古い方法 ○
商品管理のロジックが Redis に依存する ● ヘキサゴナルアーキテクチャ ○ 商品管理ロジックにストレージのインタフェースを定義し、 インタフェースに合うように MySQL アダプタを実装する
11.
CQRSとは ● Command and
Query Responsibility Segration ○ コマンドクエリ責務分離 ○ Greg Young (2010) ● クエリ(副作用なし)とコマンド(副作用あり)を分離する考え方 ○ 一貫性 ■ 「コマンド」では整合性が求められる ■ 「クエリ」ではあまり気にしない ○ ストレージ ■ 「コマンド」では正規化してデータを保存したい ■ 「クエリ」では非正規化して効率的にデータを取得したい ○ スケーラビリティ ■ 「コマンド」は負荷が大きくなりづらい ■ 「クエリ」は負荷が大きくなりやすい ● ドメイン駆動設計は、コマンドと相性が良い
12.
いざ実践しようとすると悩む・・・
13.
悩みどころ ● 参考になる Python
実装がない ● ソースコードが肥大化しがち ● リポジトリの実装が複雑になってしまう ● 値オブジェクトの不変性を表現できない ● ヘキサゴナルアーキテクチャの使い方が分からない ● CQRS を適用したいけど、分からない ● 名前の付け方で悩む ● OR Mapper を使って良いのか悩む
14.
というわけで サンプルを作りました
15.
$ git clone https://github.com/ledmonster/ddd-python-inject $
cd todolist $ python setup.py develop $ ./bin/todo add --name 発表資料を作る #1: 発表資料を作る $ ./bin/todo list [ ] #1: 発表資料を作る $ ./bin/done 1 [x] #1: 発表資料を作る
16.
Task TaskRepository TaskStatus User UserService TaskRedisR epository TaskMemory Repository Redis Memory Simple UserService app/cliConsole (app/http) Web 未実 装 Domain Model Adapters Read
Model TaskQuery TaskDto Todo List
17.
考え方
18.
● 名前を大切にする ● テストを書く ●
ヘキサゴナルアーキテクチャを活用する ● DI コンテナを活用する ● DBアクセスライブラリを活用する ● CQRS で読み出し専用ロジックを分離する ● 値オブジェクトを活用する
19.
名前を大切にしよう ● 違和感を感じたら直す ○ 始めから適切な名前がつけられるとは限らない ○
良い名前を思いついたら、チームで合意して、直す ○ 適切な名前をつけると、モデルの中身も整理される ● 長過ぎる名前を避ける ○ 経験上、長すぎる名前は活用されづらい ○ 時には略称を活用する ■ 例: decision making → dm ● 曖昧な言葉は、ドメインに対する理解不足のサイ ン
20.
テストを書こう ● メンタルモデルとソースコードを合わせることが大切 ● テストがないと、違和感のあるコードを修正できず、 ドメイン駆動設計の効果が半減する
21.
ヘキサゴナルアーキテクチャを活用しよう ● ドメインモデルを中心に置くことで、 テストのしやすい、柔軟なシステムが構築できる ● アプリケーションは、「アダプタ」+「設定」 ○
HTTP / CLI アダプタ ○ 各種設定 Task TaskRepositor y TaskStatu s User UserService TaskRedis Repository TaskMemor yRepository Redis Memor y Simple UserService app/cliConsole (app/http) Web 未実装 Domain Model Adapters
22.
DI コンテナを活用しよう DI コンテナを使わない場合 ●
コンストラクタで依存性を注入 ● 依存関係が増えると悪夢
23.
DI コンテナを活用しよう DI コンテナ(inject)を利用 ●
https://pypi.python.org/pypi/Inject/3.1.1 ● DI コンテナで依存関係を一元管理
24.
DI コンテナを活用しよう DI コンテナ(inject)を利用 ●
https://pypi.python.org/pypi/Inject/3.1.1 ● DI コンテナで依存関係を一元管理 ● コンストラクタが汚染されない
25.
DB のアクセスライブラリを活用しよう ● リポジトリの実装に
OR マッパーなどの ライブラリを使っても構わない ● Todo List での実装 ○ adapter/redis 以下にスキーマ定義 ○ adapter/repo/redis でスキーマを利用
26.
DB のアクセスライブラリを活用しよう https://github.com/groove-x/gxredis todolist.adapter.redis.task todolist.adapter.repo.task.redis
27.
CQRS で読み出し専用ロジックを分離しよう 失敗談 ● 検索要件が増えると、リポジトリが肥大化 ●
リポジトリの入出力はエンティティや値オブジェクトのため、 ○ 入出力のオーバーヘッドが大きい ○ 書式の最適化がしづらい ○ ドメインモデルと整合性を取りながらメンテナンスするのが大変 ○ DB 固有の最適化がしづらい
28.
CQRS で読み出し専用ロジックを分離しよう 改善案 ● 読み出し専用の処理は
read_model として分離する ○ リポジトリをシンプルに保てる ○ 読み出し処理を最適化できる
29.
30.
値オブジェクトを活用しよう ● エンティティが増えがち ● コンテキスト内で属性を変更しないなら、 値オブジェクトにできる ●
例 ○ 外部のコンテキストで管理している オブジェクトを参照する場合
31.
Task TaskRepository TaskStatus User UserService TaskRedisR epository TaskMemory Repository Redis Memory Simple UserService app/cliConsole (app/http) Web 未実 装 Domain Model Adapters Read
Model TaskQuery TaskDto Todo List
32.
まとめ ● Python でドメイン駆動設計を実践しました ○
名前の付け方を大切にしよう ○ テストを書こう ○ ヘキサゴナルアーキテクチャを使って ドメインモデルと外部依存の実装を分離しよう ○ DIコンテナ(inject)で依存性を管理しよう ○ DB のアクセスライブラリを活用しよう ○ CQRS で読み出し専用ロジックを分離しよう ○ 値オブジェクトを活用しよう
Download now