Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DDDはなぜ難しいのか / 良いコードの定義と設計能力の壁

DDDはなぜ難しいのか / 良いコードの定義と設計能力の壁

"Object-Oriented Conference 2024" の登壇資料です。
https://ooc.connpass.com/event/305241/

pospome

March 24, 2024
Tweet

More Decks by pospome

Other Decks in Programming

Transcript

  1. DB駆動設計 • 当時のpospomeがやっていたのは強いていうと “DB駆動設計” だった。 ◦ DBのテーブルと1対1でドメインオブジェクトを用意する。 ▪ ORMを利用するので、これが自然だった。 ▪

    今も主流だと思う。 • 今思い返すと設計という設計は不要だった記憶がある。 ◦ テーブル設計が実質的な設計作業だった。
  2. DB駆動設計の罠 • サンプルコードだから上手くいっているだけ。 • 実際に扱う実装はもっと複雑なはず。 ◦ テーブルの数が多い。 ◦ テーブルが持つ属性の数が多い。 ◦

    多くのクラスにまたがるロジックがある。 • 巨大なクラス同士が複雑に依存し合ってしまい、 中長期的に Fat Model になってしまう。
  3. Fat Model • Item, CampaignもFat Modelに なる可能性がある。 • Item, Campaignそれぞれが

    多くの値を持つので、 それらに関するロジックが Item, Campaignに寄ってしまう。 • 神クラスが誕生する。
  4. ここまでのまとめ:ドメイン駆動設計に対する理解 • ドメイン = ソフトウェアを適用する領域 • ドメイン駆動 = ドメインに適した設計をする。 ◦

    DBなどのデータ構造に依存しないようにする。 ◦ 競合他社に勝てるように。 • 当時のpospomeはDB駆動設計でDDDを実践しようとしていた。 ◦ ずっと辛かったのはこれが原因だった。 ◦ Fat Modelを避けてドメインモデル貧血症が発生していた。
  5. 設計能力の壁を打ち破るには? • 自分で頑張って勉強する。 ◦ 結構時間がかかりそう。 • 設計スキルの高い人に教えてもらう。 ◦ これが一番いい。 ◦

    チーム内に強い人がいて、 現場のコードベースでレビューしてもらうのが理想。 ◦ 技術支援という形だと効果が微妙かもしれない。
  6. 継続すると設計の引き出しができてくる 例: • アプリケーションレイヤに if, for, 四則演算があると ドメインモデル貧血症の兆候があるので注意する。 • 結合度はスタンプ結合と制御結合だけ気にすれば良い。

    • 関数やメソッドの戻り値が配列だった場合は、 配列加工のロジックが散っていないか確認する。 必要に応じてファーストクラスコレクションを提供する。