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

DDDについて勉強したので5分でまとめる

y_ahiru
August 28, 2018

 DDDについて勉強したので5分でまとめる

1ヶ月ほどDDDについて勉強したので、その成果を5分でLTしました。

y_ahiru

August 28, 2018
Tweet

More Decks by y_ahiru

Other Decks in Programming

Transcript

  1. たとえば <?php class ApplicationLayer { public function reserve(Reservation $reservation) {

    if ( ! $reservation->isReservable()) { // 予約不可な場合の処理 } // 登録処理 } } 予約が可能かどうかのロジックがいくら変わろうが、アプリケーション 層は変更せずにそのまま使用できる
  2. たとえば キャンセルされた予約は予約済みに戻すことができないというドメイン ルールがあった場合、以下のような感じで表現出来ます <?php class Reservation { protected $status; function

    reservedBy(User $user) { if ($this->status->isCancel()) { throw new LogicException(); } $this->user_id = $user->getUserId(); $this->status = new Status('Reserved'); } }
  3. たとえば こういった書き方をすることによって、ドメインルールと矛盾した処理 をアプリケーション層で書くことが不可能になります <?php class ApplicationLayer { public function badReserve()

    { $canceledRsv = $this->rsv_repo->findById($id); $user = $this->user_repo->findById($user_id); // 絶対に例外が発生する $canceledRsv->reservedBy($user); $this->rsv_repo->save($reservation); } }
  4. たとえば ルートとなるReservationに利用者は10人までしか登録できないというド メインルールを定義します。 <?php class Reservation { protected $users =

    []; public function addUser(User $user) { if (count($this->users) > 10) { throw new LogicException(); } $this->users[] = $user; } }
  5. たとえば そうすると、もちろんReservationEntityを使う限り10人を超えた利用者 は登録できなくなります <?php class ApplicationLayer { public function badAddUser()

    { // たくさんのユーザー $users = $this->user_repo->getAllUsers(); $reservation = $this->rsv_repo->findById($id); foreach ($users as $user) { // 10 人を越えると必ず例外が発生する $reservation->addUser($user); } $this->rsv_repo->save($reservation); } }