社内でドメイン駆動設計入門の読書会 #13

2020/05/25 2020/05/25 #PHP #勉強会 #ドメイン駆動設計 #読書会

社内でドメイン駆動設計入門の読書会 #13

こんにちは。Nonです。

今回も会社で読書会をしている話をしようと思います。

内容は控えめに、ディスカッションの内容重視で書いていきたいと思います。

より具体的なコードや内容がみたい!という方は購入しましょう!

前回:

読んでいる本

読んでいる本はこちらのドメイン駆動設計です。

ogp
https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X/ref=sr_1_3?adgrpid=80422044687&gclid=Cj0KCQiA4sjyBRC5ARIsAEHsELH1_WgS89EWpNAswUpFQO3uQOdoReiYJIMYrbeAsqBIxpk-bGG0c6saAnI4EALw_wcB&hvadid=374679990844&hvdev=c&hvlocphy=1009547&hvnetw=g&hvqmt=e&hvrand=11783283473722260575&hvtargid=aud-759242200046%3Akwd-857025096386&hydadcr=1789_10144705&jp-ad-ap=0&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80&qid=1582467293&sr=8-3

https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X/ref=sr_1_3?adgrpid=80422044687&gclid=Cj0KCQiA4sjyBRC5ARIsAEHsELH1_WgS89EWpNAswUpFQO3uQOdoReiYJIMYrbeAsqBIxpk-bGG0c6saAnI4EALw_wcB&hvadid=374679990844&hvdev=c&hvlocphy=1009547&hvnetw=g&hvqmt=e&hvrand=11783283473722260575&hvtargid=aud-759242200046%3Akwd-857025096386&hydadcr=1789_10144705&jp-ad-ap=0&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80&qid=1582467293&sr=8-3を見る

ogp
https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X/ref=sr_1_3?adgrpid=80422044687&gclid=Cj0KCQiA4sjyBRC5ARIsAEHsELH1_WgS89EWpNAswUpFQO3uQOdoReiYJIMYrbeAsqBIxpk-bGG0c6saAnI4EALw_wcB&hvadid=374679990844&hvdev=c&hvlocphy=1009547&hvnetw=g&hvqmt=e&hvrand=11783283473722260575&hvtargid=aud-759242200046%3Akwd-857025096386&hydadcr=1789_10144705&jp-ad-ap=0&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80&qid=1582467293&sr=8-3

https://www.amazon.co.jp/%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E3%83%9C%E3%83%88%E3%83%A0%E3%82%A2%E3%83%83%E3%83%97%E3%81%A7%E3%82%8F%E3%81%8B%E3%82%8B-%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E3%81%AE%E5%9F%BA%E6%9C%AC-%E6%88%90%E7%80%AC-%E5%85%81%E5%AE%A3/dp/479815072X/ref=sr_1_3?adgrpid=80422044687&gclid=Cj0KCQiA4sjyBRC5ARIsAEHsELH1_WgS89EWpNAswUpFQO3uQOdoReiYJIMYrbeAsqBIxpk-bGG0c6saAnI4EALw_wcB&hvadid=374679990844&hvdev=c&hvlocphy=1009547&hvnetw=g&hvqmt=e&hvrand=11783283473722260575&hvtargid=aud-759242200046%3Akwd-857025096386&hydadcr=1789_10144705&jp-ad-ap=0&keywords=%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E9%A7%86%E5%8B%95%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80&qid=1582467293&sr=8-3を見る


でも言っていたように、業務でDDDを利用して開発することが多くなったのですが、DDDに精通している人が少ないという問題がありました。

そこで、その精通している人が読書会をしようかと誘ってくださいまして、是非にと参加させていただきました。

進行方法

読書会の進行方法は

  1. 今回読書の対象にする章を決める。
  2. 10〜20分間その章を読む
    1. 読み終わってしまった人は、もう一周読み直すか、次の章に進んでもらう
  3. その後40分間で、その章に対する疑問や考え方をディスカッションする
  4. 1〜3を毎週定期的に行う

という進行方向となっています。

社内で読書会をするのはこれが初めてなので、進行方法はもっといいのあったら教えて下さい。

今回読んだ内容

  • 複雑な条件を表現する「仕様」
  • 仕様とは
    • 複雑な評価処理を確認する
    • 「仕様」による解決
    • リポジトリの仕様を避ける
  • 仕様とリポジトリを組み合わせる
    • お勧めサークルに見る複雑な検索処理
    • 仕様による解決法
    • 仕様とリポジトリが織りなすパフォーマンス問題
    • 複雑なクエリは「リードモデル」で
  • まとめ

ディスカッション

今回は評価と参照

今までのドメインは「ユーザーを作成する」とか、「サークルにメンバーを追加する」など、追加、更新、削除。つまりライフサイクル周りに注目するユースケースばかりでしたが、今回はサークル一覧をどう見せるか、どのようにサークル検索するか、に注目していた章でした。

正直な話、プログラミングにおいて「参照」が一番書かれる頻度が高いと(個人的に)思っているので、気になる章ではありました。

ディスカッションにおける最終的な結論

参照はドメイン駆動で設計しなくてよくね?

参照はデータ参照といっても過言では無いくらいです。
多少の加工はありますが、それは果たしてドメインと言えるのかも甚だ疑問です。

例えば登録されている商品の値段を税抜価格から、税込価格へ変換する処理は知識とは呼べそうですが、Entityに書くほどでしょうか?

また、1000円以上の商品を赤文字で表示するという画面側の要望があるときにその振る舞いをEntityに書くべきなのでしょうか?

これに対する結論が「リードモデル」だそうです。
登録 / 更新 / 削除用のドメインオブジェクトとは別に参照用のドメインオブジェクトを作成する言えばいいでしょうか?

少し誤解(語弊)があるかもしれませんが、そのように私は受け取りました。

参照は性能にも密接に関わる

登録件数1億件のデータにアクセスするとき、単純なクエリで一発で取れるなら、プログラムで処理して、時間をかけるより、SQL一発で簡単にとってそのままレスポンスとして返したほうがユーザーのためになるという意見も今回のディスカッションの中で出たくらいです。

CQRSという考えもあるらしいので、全てにおいてドメイン駆動設計で実装する必要はなさそう。というのが、今回の章で言いたい部分の一つだったのかもしれません。

参照を別の設計で駆動させるときのディレクトリ構造

src┓
   ┣User┓
   ┃    ┣CreateUser┓
   ┃                ┣User
   ┃                ┣UserName
   ┃    ┣GetUser┓
   ┃             ┣全く別の設計手法で書かれたコード
   ...

となりそうです。
少なくとも、私はそのように書いています。

Entityでgetterはできるだけ書きたくない

これが、一貫してこの本に書かれているのですが、この理論で行くと参照系とは相性の悪い(?)手法なのかもしれません。

CQRSについては別でまた記事にしたい

CQRSについては勉強不足なので、また別の機会に。

最後に

実はドメイン駆動設計で組むぞ!って始めたプロジェクトで一番はじめに組んだコードが参照系でした。
かなり苦労したので、別の手法でコーディングするのは納得できています。

CQRSとまでは行きませんが、単純なSELECT処理をして、フロントが欲しい物を多少加工して返しています。これのせいでコードが汚くなるということも無いですし(参照系ですので)、問題ないと思います。

次回はアーキテクチャです。
また記事にしますので、その時はよしなに。

.

のん

所属 : 株式会社スマレジ 開発部

YouTube : のんラボ

Twitter : @nonz250

Github : nonz250

Qiita : @nonz250

My Qiita posts My Qiita contributions My Qiita followers

主にPHPを使用し、サーバーサイドを担当。最近はフロントにも興味津々。

なにかを作ったりいじったりするのが好きで、個人開発なども行っている。

趣味はバイクアイコン画像は大抵愛車の「Z250」である。友達にアイコン描いてもらえて嬉しい。

PHP / Laravel / CakePHP2 / CakePHP3 / Vue / Nuxt / C# / etc...

Tags

#のんラボ #Laravel #Vue #個人開発 #ブログ #プログラミング #javascript #Html5 #WEBサービス #Twitter #今年の抱負メーカー #勉強方法 #PWA #モバイルアプリ #Android #ツーリング #バイクに乗るエンジニア #Z250 #秋吉台 #能登半島 #バイク #冒険 #東尋坊 #Squid #リバースプロキシ #hosts #axios #cropper #AdSense #Bootstrap #MySQL #高速化 #トドTask #Telescope #デバッグ #composer #テスト #セキュリティ #POSレジ #スマレジ #本部機能 #バリデーション #入力チェック #Mac #Chrome #テスト駆動開発 #開発手法 #UI #デザイン #WEBサイト #機能美 #PHP #Laravel 6 #コメント #バージョンアップ #vue-cli #localhost #BIツール #売上分析 #TANAX #MFK250 #ツアーシェルケース2 #RESTful #API #REST API #実務的 #PHP Tech Tutor #Smaregi Tech Talk #勉強会 # ブログ #CakePHP3 #CSRF #VSCode #開発環境 #CakePHP3.0 #さくらのレンタルサーバー #モジュールモード #シェル #メール #Gmail #relay #OGP #エラーページ #抱負 #家庭教師 #ドメイン駆動設計 #DDD #読書会 #那智の滝 #伊勢志摩 #伊勢志摩スカイライン #フロント #三方五湖 #レインボーライン #ボーイスカウト・ルール #プログラマが知るべき97のこと #リファクタリング #ユビキタス言語 #車輪の再発明 #マイクロサービス #デプロイ #QA #laravel-mix #Tips #storybook #@storybook/addon-actions #昇降デスク #コードレス #書斎 #オフィス #リモートワーク #働き方 #エラーハンドリング #スマレジ4 #pixel 5 #レビュー #スマレコ #TDD #RSS #404 #高山ダム #ラーツー #React #Nuxt #node_modules #エラー #インポート #設定方法 #環境構築 #Docker #フォレストパーク神野山 #学生向け #PR #採用 #Node.js #npm #しまなみ海道 #youtube #CSS #IE #SLA #Rust