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

オブジェクトで会話できてる?with DDD

2d855b951ff3160c55915821261432f9?s=47 uzzu
April 30, 2014

オブジェクトで会話できてる?with DDD

I talked in "Object design rough talks"
http://www.zusaar.com/event/5037004

2d855b951ff3160c55915821261432f9?s=128

uzzu

April 30, 2014
Tweet

More Decks by uzzu

Other Decks in Programming

Transcript

  1. オブジェクトで 会話できてる? @uzzu

  2. Objectives 会話によって ドメインモデルを育てる ドメイン層を 全力で守る

  3. Topics ユビキタス言語 Ubiquitous Language from DDD 境界コンテキスト Bounded Context from

    DDD 隔離されたコア Segrated Core from DDD 他ちょいちょい
  4. Do It モデル

  5. Do It モデル

  6. 「モデル」って何?

  7. 「モデル」って何?

  8. モデルの解釈はコンテキスト次第

  9. コンテキスト境界を意識する

  10. 同じ単語でもコンテキスト境界を超えると不適切に なる事が多々 ユビキタス言語の方言 オブジェクトの概念的寿命 (≠ライフサイクル) を意識する 会話によってオブジェクトを育てる

  11. Objectives 会話によって ドメインモデルを育てる ドメイン層を 全力で守る

  12. オブジェクトで会話をする with DDD なんかモンスターとか連れて旅にでるゲームにおけるモンスターの管理ドメイン

  13. オブジェクトで会話をする with DDD なんかモンスターとか連れて旅にでるゲームにおけるモンスターの管理ドメイン MonsterはEntityだよねー。HPはValueObjectだよねー。みたいな会話

  14. オブジェクトで会話をする with DDD Monsterというドメインモデルを実装していく class Monster : ActiveRecord.Base {}

  15. オブジェクトで会話をする with DDD Monsterというドメインモデルを実装していく class Monster : ActiveRecord.Base {}

  16. オブジェクトで会話をする with DDD Monsterというドメインモデルを実装していく ちょっとまってください ActiveRecord.Base ってなんですか。さっきまで MonsterはMonsterIdを識別 子(Identity)とするEntityだって話してたじゃないですか。なのに今の Monsterの実装に反映されて

    いないというのはどういうことなんでしょう。その上 ActiveRecordというPoEAAという書籍に記載されている データベースアクセスをカプセル化する設計パターンのベースクラスなのか知りませんけどそれは Monster オブジェクトの責務ではないですよね。 ◦◦言語ではクラスはオブジェク トだしActiveRecord.Base では提供されるAPIについてクラスオブ ジェクトのメソッドとして実装されているし単一責務だとかオブジェクトで 会話できてるとか言えるかもしれませんけど、それが伝わるのはあくま でも◦◦言語の中の話であるし、何よりも解決すべきシナリオとは直接 関係のない「オブジェクトのライフサイクル」に関する実装がドメインモ デルの実装に混ざってしまうというのは ISO9126ソフトウェア品質特性 モデルにおける使用性 (理解性、習得性)及び移植性を低下させてし まうので、よくないんじゃないですか。たとえば Monsterのライフサイク ルがDBではないものになったらそれに合わせて Monsterオブジェクト を修正しないといけないですよねシナリオは何も変わっていないという のに。さっきまでの会話はなんだったんですか
  17. オブジェクトで会話をする with DDD Monsterというドメインモデルを実装していく class Monster : ActiveRecord.Base {} class

    Monster : Entity<MonsterId> {} class MonsterId : Identity {}
  18. オブジェクトで会話をする with DDD Monsterというドメインモデルを実装していく class Monster : ActiveRecord.Base {} class

    Monster : Entity<MonsterId> {} class MonsterId : Identity {}
  19. 全力でドメイン層を守る 解決すべきドメインのシナリオ以外の責務を ドメインモデルに与えてはいけない。 SRP違反。会話ができなくなる。

  20. 解決すべきドメインのシナリオ以外? ・ライフサイクル  DB,◦◦キャッシュ, Remote, BuildInAsset,  Application, Scene, Memory, DeviceStorage ・コンテキスト境界外

  21. None
  22. コアドメイン

  23. Objectives 会話によって ドメインモデルを育てる ドメイン層を 全力で守る

  24. None
  25. オブジェクトで 会話できてる? ~終~