Home
Explore
Submit Search
Upload
Login
Signup
Advertisement
Check these out next
ドメイン駆動設計 基本を理解する
増田 亨
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
Koichiro Matsuoka
イミュータブルデータモデルの極意
Yoshitaka Kawashima
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
MHA for MySQLとDeNAのオープンソースの話
Yoshinori Matsunobu
Tackling Complexity
Yoshitaka Kawashima
Python 3のWebシステムでDDDに入門してみた
Hiromu Yakura
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
1
of
33
Top clipped slide
Python におけるドメイン駆動設計(戦術面)の勘どころ
Sep. 8, 2017
•
0 likes
15 likes
×
Be the first to like this
Show More
•
17,161 views
views
×
Total views
0
On Slideshare
0
From embeds
0
Number of embeds
0
Download Now
Download to read offline
Report
Software
PyCon JP 2017 発表資料です。
Junya Hayashi
Follow
Senior Software Engineer at GROOVE X
Advertisement
Advertisement
Advertisement
Recommended
ドメインロジックに集中せよ 〜ドメイン駆動設計 powered by Spring
増田 亨
29.6K views
•
83 slides
ドメイン駆動設計 の 実践 Part3 DDD
増田 亨
8.6K views
•
23 slides
DDDのモデリングとは何なのか、 そしてどうコードに落とすのか
Koichiro Matsuoka
47.6K views
•
65 slides
「ドメイン駆動設計」の複雑さに立ち向かう
増田 亨
32.2K views
•
133 slides
ドメイン駆動設計 ( DDD ) をやってみよう
増田 亨
49.7K views
•
45 slides
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
Takuto Wada
143.2K views
•
45 slides
More Related Content
Slideshows for you
(20)
ドメイン駆動設計 基本を理解する
増田 亨
•
117K views
ドメイン駆動設計のプラクティスでカバーできること、できないこと[DDD]
Koichiro Matsuoka
•
3.6K views
イミュータブルデータモデルの極意
Yoshitaka Kawashima
•
22.5K views
コンテナの作り方「Dockerは裏方で何をしているのか?」
Masahito Zembutsu
•
28.7K views
MHA for MySQLとDeNAのオープンソースの話
Yoshinori Matsunobu
•
54.5K views
Tackling Complexity
Yoshitaka Kawashima
•
2.7K views
Python 3のWebシステムでDDDに入門してみた
Hiromu Yakura
•
5.8K views
マルチテナント化で知っておきたいデータベースのこと
Amazon Web Services Japan
•
6.6K views
Dockerfile を書くためのベストプラクティス解説編
Masahito Zembutsu
•
82.6K views
ドメイン駆動設計のための Spring の上手な使い方
増田 亨
•
137.6K views
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
•
22.4K views
ドメイン駆動設計 本格入門
増田 亨
•
44K views
マイクロサービス 4つの分割アプローチ
増田 亨
•
40.4K views
Dockerからcontainerdへの移行
Kohei Tokunaga
•
15.4K views
Redisの特徴と活用方法について
Yuji Otani
•
98.7K views
DDD x CQRS 更新系と参照系で異なるORMを併用して上手くいった話
Koichiro Matsuoka
•
82.5K views
SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版)
Takuto Wada
•
70K views
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
•
28.4K views
ドメイン駆動設計サンプルコードの徹底解説
増田 亨
•
19.6K views
ドメイン駆動設計のためのオブジェクト指向入門
増田 亨
•
47.7K views
Similar to Python におけるドメイン駆動設計(戦術面)の勘どころ
(20)
はてなにおける継続的デプロイメントの現状と Docker の導入
Yu Nobuoka
•
21.4K views
hooks riverpod + state notifier + freezed でのドメイン駆動設計
Shinnosuke Tokuda
•
3.4K views
ゼロからのプログラミングRails講座 Codeanywhere版
DIVE INTO CODE Corp.
•
10.6K views
今さら聞けない人のためのGit超入門 GitLab 13対応版
VirtualTech Japan Inc./Begi.net Inc.
•
1K views
The Twelve-Factor (A|M)pp with C#
Yuta Matsumura
•
567 views
アイデアを形にする ③3時間でアプリ公開!ゼロからのプログラミング講座
DIVE INTO CODE Corp.
•
233 views
ドメイン駆動設計とは何か 【入門編】
増田 亨
•
13.2K views
マイクロサービス時代の生存戦略 with HashiCorp
Masahito Zembutsu
•
5.8K views
ぼくのかんがえたさいきょうのうぇぶあぷりけーしょんふれーむわーく - YAPC Asia 2011
Hiroh Satoh
•
49.2K views
コードの自動修正によって実現する、機能開発を止めないフレームワーク移行
gree_tech
•
2.1K views
今さら聞けない人のためのGit超入門 GitLab 14対応版
VirtualTech Japan Inc./Begi.net Inc.
•
638 views
Node予備校 vol.1 名古屋
Mori Shingo
•
2.9K views
うちの開発におけるXD利用法
Kazuma Sekiguchi
•
1.6K views
夏サミ2013 Hadoopを使わない独自の分散処理環境の構築とその運用
Developers Summit
•
6.9K views
コンテナーによるIT基盤変革 - IT infrastructure transformation -
日本ヒューレット・パッカード株式会社
•
639 views
Developers Summit 2023 9-D-1「もう悩まされない開発環境、プロジェクトで統一した環境をいつでもどこでも」
Kazumi IWANAGA
•
88 views
Rancherを活用して開発効率を上げる
Michitaka Terada
•
2.7K views
今さら聞けない人のためのGit超入門 2019/11/21
VirtualTech Japan Inc./Begi.net Inc.
•
586 views
今さら聞けない人のためのgit超入門
VirtualTech Japan Inc./Begi.net Inc.
•
1.6K views
Wasm blazor and wasi 2
Takao Tetsuro
•
350 views
Advertisement
More from Junya Hayashi
(11)
断言して間違えると信頼度が低下するというベイズの話
Junya Hayashi
•
768 views
ヒキガエルは地震を予知するのか
Junya Hayashi
•
1K views
量から質への転化の法則
Junya Hayashi
•
3.9K views
DynamoDB Before and After GSI
Junya Hayashi
•
847 views
IT業界の記事に見られる「中日ドラゴンズの論理」の落とし穴
Junya Hayashi
•
1.5K views
U分布と宇宙
Junya Hayashi
•
4.2K views
Pyramid + socket.io 人狼を作ってみた
Junya Hayashi
•
5K views
カタンの流れを検証してみた
Junya Hayashi
•
986 views
サンクトペテルブルクのパラドックス
Junya Hayashi
•
1.6K views
サイコロを100万回振ってみた
Junya Hayashi
•
2.2K views
Cross2013_GREE
Junya Hayashi
•
1.2K views
Recently uploaded
(20)
在哪里可以做《南安普顿大学文凭证书|毕业证》
1232hdjk
•
2 views
留信网认证可查【萨福克大学文凭证书毕业证购买】
hh123hh1
•
3 views
留信网认证可查【新学院文凭证书毕业证购买】
hh123hh1
•
2 views
☀️【伯明翰大学毕业证成绩单留学生首选】
25mjhd12
•
2 views
①【南十字星大学毕业证文凭学位证书|工艺完美复刻】
vgh215w
•
3 views
HCL Sametime V12 概要
Software Info HCL Japan
•
245 views
留信网认证可查【俄克拉荷马大学文凭证书毕业证购买】
1lkjhg
•
2 views
留信网认证可查【威得恩大学文凭证书毕业证购买】
32lkhng
•
2 views
留信网认证可查【堪萨斯大学文凭证书毕业证购买】
1lkjhg
•
2 views
在哪里可以做《邦德大学文凭证书|毕业证》
kjds1245
•
2 views
留信网认证可查【马努卡理工学院文凭证书毕业证购买】
ihh14ds
•
2 views
留信网认证可查【太平洋大学文凭证书毕业证购买】
hh123hh1
•
2 views
☀️《URI毕业证仿真》
sada332
•
2 views
測量データ処理ソフト・MarineDiscoveryの紹介
ssuserbceee8
•
39 views
留信网认证可查【罗德岛大学文凭证书毕业证购买】
1lkjhg
•
3 views
☀️【萨德伯里大学毕业证成绩单留学生首选】
15sad
•
2 views
設計/ドメイン設計(1) 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第23回】
Tomoharu ASAMI
•
31 views
キレイなコードって.pdf
shumashimo1
•
12 views
留信网认证可查【俄亥俄大学文凭证书毕业证购买】
1lkjhg
•
2 views
办Monash电子毕业证书,办莫纳什大学毕业证高仿成绩单QQ/微信:819 4343,办Monash假硕士毕业证,办Monash本科假文凭证书,办Mona...
BonnieLaymon
•
4 views
Advertisement
Python におけるドメイン駆動設計(戦術面)の勘どころ
Python における ドメイン駆動設計(戦術面)の 勘どころ 2017-09-09 @
PyCon JP 2017 林 淳哉
自己紹介 ● 林 淳哉
(@loose_agilist) ● GROOVE X でロボット開発 ● 「実践ドメイン駆動設計」 Reviewer ● Qiita に DDD の記事書いてます
今日おはなしすること ● ドメイン駆動設計とは ● ドメイン駆動設計の悩みどころ ●
Todo List を例にしたドメイン駆動設計の実践 ○ https://github.com/ledmonster/ddd-python-inject
$ git clone https://github.com/ledmonster/ddd-python-inject $
cd todolist $ python setup.py develop $ ./bin/todo --help
ドメイン駆動設計とは何か ● Eric Evans
が提唱した設計手法 ● モデリング技術 や オブジェクト指向設計 を抽象化し、 問題領域の抽出から、アーキテクチャ設計、モデリング、 実装に至る全工程を 一貫性のある体系 として整理したも の
おすすめ書籍 エリック・エヴァンスのドメイン駆動設計 (2011) “Domain Driven
Design” Eric Evans (2003) DDD 信者の聖書。その難解さから「鈍器」と呼ばれる。抽象度が高く、分厚いので 読み通すの大変だが、何回読んでも発見がある。ここで整理されている概念は、 10 年以上経った今も色褪せない。 実践ドメイン駆動設計 (2015) “Implementing Domain Driven Design” Vaughn Vernon (2011) Evans 本の中身は本質を突いているが、その実践は容易でない。本書は、 Evans 本以降の10年間に発表された新しい開発技法を取り込みながら、 DDD の考え方 を実践に移すにはどうすれば良いかを記述した指南書。 ※ 読むのに挫折しても、鈍器としてなら使えます ※ ※ 翻訳レビューに参加しました。
ドメイン駆動設計を構成する要素 ● 「戦略」的側面 ○ 将棋でいう「定跡」 ○
プロダクト全体を俯瞰するための考え方 ● 「戦術」的側面 ○ 将棋でいう「手筋」 ○ 個々の実装のための考え方
● ユビキタス言語 ○ プロダクト全体で統一された言葉 を使おう ●
コアドメイン、サブドメイン、汎用 ドメイン ○ 問題領域を整理しよう ● 境界付けられたコンテキスト ○ 実装するシステムを整理しよう ● コンテキストマップ ○ システム間の関係を整理しよう ドメイン駆動設計の 「戦略」的側面
ドメイン駆動設計の 「戦術」的側面 ● アーキテクチャ ○ MVC,
MVVM などの実装パターン ● ドメインモデル ○ エンティティ ■ 識別子を持つもの ○ 値オブジェクト ■ 値に型を与えたもの ○ サービス ■ 振舞いだけを提供するもの ○ リポジトリ ■ 永続化の仕組み ○ ファクトリ ■ オブジェクトを生成する仕組み ○ 集約 ■ 不変条件を管理する単位 ○ ドメインイベント ■ エンティティの変化を表現したイベント ● アプリケーション ○ コンテキスト全体の調整役
ヘキサゴナルアーキテクチャとは ● 依存性逆転の原則(DIP)を用いて、 ドメインモデルから外部システム(DB・UIなど)への 依存を排除したアーキテクチャ手法 ● 古い方法 ○
商品管理のロジックが Redis に依存する ● ヘキサゴナルアーキテクチャ ○ 商品管理ロジックにストレージのインタフェースを定義し、 インタフェースに合うように MySQL アダプタを実装する
CQRSとは ● Command and
Query Responsibility Segration ○ コマンドクエリ責務分離 ○ Greg Young (2010) ● クエリ(副作用なし)とコマンド(副作用あり)を分離する考え方 ○ 一貫性 ■ 「コマンド」では整合性が求められる ■ 「クエリ」ではあまり気にしない ○ ストレージ ■ 「コマンド」では正規化してデータを保存したい ■ 「クエリ」では非正規化して効率的にデータを取得したい ○ スケーラビリティ ■ 「コマンド」は負荷が大きくなりづらい ■ 「クエリ」は負荷が大きくなりやすい ● ドメイン駆動設計は、コマンドと相性が良い
いざ実践しようとすると悩む・・・
悩みどころ ● 参考になる Python
実装がない ● ソースコードが肥大化しがち ● リポジトリの実装が複雑になってしまう ● 値オブジェクトの不変性を表現できない ● ヘキサゴナルアーキテクチャの使い方が分からない ● CQRS を適用したいけど、分からない ● 名前の付け方で悩む ● OR Mapper を使って良いのか悩む
というわけで サンプルを作りました
$ 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: 発表資料を作る
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
考え方
● 名前を大切にする ● テストを書く ●
ヘキサゴナルアーキテクチャを活用する ● DI コンテナを活用する ● DBアクセスライブラリを活用する ● CQRS で読み出し専用ロジックを分離する ● 値オブジェクトを活用する
名前を大切にしよう ● 違和感を感じたら直す ○ 始めから適切な名前がつけられるとは限らない ○
良い名前を思いついたら、チームで合意して、直す ○ 適切な名前をつけると、モデルの中身も整理される ● 長過ぎる名前を避ける ○ 経験上、長すぎる名前は活用されづらい ○ 時には略称を活用する ■ 例: decision making → dm ● 曖昧な言葉は、ドメインに対する理解不足のサイ ン
テストを書こう ● メンタルモデルとソースコードを合わせることが大切 ● テストがないと、違和感のあるコードを修正できず、 ドメイン駆動設計の効果が半減する
ヘキサゴナルアーキテクチャを活用しよう ● ドメインモデルを中心に置くことで、 テストのしやすい、柔軟なシステムが構築できる ● アプリケーションは、「アダプタ」+「設定」 ○
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
DI コンテナを活用しよう DI コンテナを使わない場合 ●
コンストラクタで依存性を注入 ● 依存関係が増えると悪夢
DI コンテナを活用しよう DI コンテナ(inject)を利用 ●
https://pypi.python.org/pypi/Inject/3.1.1 ● DI コンテナで依存関係を一元管理
DI コンテナを活用しよう DI コンテナ(inject)を利用 ●
https://pypi.python.org/pypi/Inject/3.1.1 ● DI コンテナで依存関係を一元管理 ● コンストラクタが汚染されない
DB のアクセスライブラリを活用しよう ● リポジトリの実装に
OR マッパーなどの ライブラリを使っても構わない ● Todo List での実装 ○ adapter/redis 以下にスキーマ定義 ○ adapter/repo/redis でスキーマを利用
DB のアクセスライブラリを活用しよう https://github.com/groove-x/gxredis todolist.adapter.redis.task todolist.adapter.repo.task.redis
CQRS で読み出し専用ロジックを分離しよう 失敗談 ● 検索要件が増えると、リポジトリが肥大化 ●
リポジトリの入出力はエンティティや値オブジェクトのため、 ○ 入出力のオーバーヘッドが大きい ○ 書式の最適化がしづらい ○ ドメインモデルと整合性を取りながらメンテナンスするのが大変 ○ DB 固有の最適化がしづらい
CQRS で読み出し専用ロジックを分離しよう 改善案 ● 読み出し専用の処理は
read_model として分離する ○ リポジトリをシンプルに保てる ○ 読み出し処理を最適化できる
値オブジェクトを活用しよう ● エンティティが増えがち ● コンテキスト内で属性を変更しないなら、 値オブジェクトにできる ●
例 ○ 外部のコンテキストで管理している オブジェクトを参照する場合
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
まとめ ● Python でドメイン駆動設計を実践しました ○
名前の付け方を大切にしよう ○ テストを書こう ○ ヘキサゴナルアーキテクチャを使って ドメインモデルと外部依存の実装を分離しよう ○ DIコンテナ(inject)で依存性を管理しよう ○ DB のアクセスライブラリを活用しよう ○ CQRS で読み出し専用ロジックを分離しよう ○ 値オブジェクトを活用しよう
Advertisement