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

DDDの始め方

 DDDの始め方

DDDを始めるにあたって実施したことを実例を交えて紹介しています。
内容
- DDDとは何か
- なぜDDDをやるのか
- 実際にどうやって導入したか

Yamaki Hiroshi

July 19, 2017
Tweet

More Decks by Yamaki Hiroshi

Other Decks in Programming

Transcript

  1. DDDͷ࢝Ίํ

    View Slide

  2. ࣗݾ঺հ
    • ീרߛ࢜(ϠϚΩ ώϩγ)
    • (ג)ϗϫΠτϓϥεͷΤϯδχΞ
    • ܦྺ͸ۀ຿ܥSE→webΤϯδχΞ
    • DDD΍ΦϒδΣΫτࢦ޲ͳͲͷઃܭͷ࿩͕޷͖

    View Slide

  3. ΞδΣϯμ
    DDDͬͯʁ
    DDDΛ΍Δಈػ
    ͔͜͜Β࢝ΊΔDDD

    View Slide

  4. DDDͬͯʁ

    View Slide

  5. υϝΠϯۦಈઃܭ
    (Domain-Driven Design)
    ΤϦοΫɾΤϰΝϯε͕ఏএͨ͠։ൃํ๏

    View Slide

  6. DDD͕໨ࢦ͢΋ͷ

    View Slide

  7. –Eric Evans
    ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ
    ʮ·͕͖͑ʯ
    “໺৺తͳ໨ඪΛୡ੒ͯ͠ɺاۀͷܧଓత
    ͳཁٻΛຬͨ͢΂͘ਐԽ͠ଓ͚Δෳࡶͳ
    ιϑτ΢ΣΞΛ࡞Γग़͢͜ͱ”

    View Slide

  8. ͬ͘͟Γݴ͏ͱɺ
    ෳࡶͳγεςϜΛϨΨγʔʹͤͣɺ
    ਐԽͤ͞ଓ͚ΔͨΊͷ։ൃํ๏
    (໨ࢦ͞ͳ͍΋ͷ)
    • ୯७ͳ΋ͷΛૉૣ͘࡞Δ
    • Ұ࣌తͳ࢖͍ࣺͯεΫϦϓτͷ࡞੒
    • ࡞ͬͨΒϝϯς͠ͳ͍ιϑτ΢ΣΞ

    View Slide

  9. DDDͷಛ௃

    View Slide

  10. –Martin Fowler
    ΤϦοΫɾΤϰΝϯεͷυϝΠϯۦಈઃܭ
    ʮংจʯ
    “ιϑτ΢ΣΞ։ൃΛෳࡶʹ͢ΔཁҼ͸਺
    ଟ͘ଘࡏ͢Δɻ͔͠͠ɺ͜ͷෳࡶ͞ͷ֩
    ৺ʹ͋Δͷ͸ɺ໰୊υϝΠϯࣗମ͕ຊ࣭
    తʹෳࡶͰ͋Δͱ͍͏ࣄ࣮ͩɻ”

    View Slide

  11. γεςϜͷෳࡶ͞ͷཁҼ
    • γεςϜԽ͢Δۀ຿(=υϝΠϯ)͕ෳࡶ
    • ͜ͷυϝΠϯΛϞσϧԽ͢Δ͜ͱͰγες
    ϜΛίϯτϩʔϧͰ͖Δ΋ͷʹ͢Δ
    ٕज़ྖҬͰ͸ͳ࣮͘ࡍͷۀ຿ʹண໨ͯ͠ਐΊ
    ͍ͯ͘ͷ͕ಛ௃

    View Slide

  12. Ͳ͏΍࣮ͬͯݱ͢Δ͔
    1. ࣮ࡍͷۀ຿ΛϞσϦϯά(υϝΠϯϞσϧ)
    2. υϝΠϯϞσϧΛίʔυͰදݱ
    3. ಈ͘ίʔυΛݟͤɺϑΟʔυόοΫΛड͚Δ
    ͜ΕΛճ͠ͳ͕ΒυϝΠϯϞσϧΛચ࿅ͤ͞Δ

    View Slide

  13. DDDΛ΍Δಈػ

    View Slide

  14. ಈػᶃɿ
    मਖ਼ɾվमͷӨڹൣғΛௐ΂
    Δ͜ͱ͕େม

    View Slide

  15. DDDͰ͸
    ۀ຿͕ϞσϦϯάͷத৺
    ۀ຿ͷมߋ͕γεςϜ(Ϟσϧ)ͷม
    ߋʹͳΔ
    ద੾ͳϞσϦϯά͕͞ΕΕ͹ɺ
    ۀ຿ʹؔ܎ͷͳ͍γεςϜʹӨڹ͸Ͱͳ͍

    View Slide

  16. ಈػᶄɿ
    (ৄࡉ͗͢Δ)υΩϡϝϯτΛ
    ॻ͖ͨ͘ͳ͍
    (ϝϯς͞Εͳ͍ΑͶʁ)
    (ίʔυಡΉΑͶʁ)

    View Slide

  17. DDDͰ͸
    ϞσϧΛίʔυͰදݱ͢Δ
    υΩϡϝϯτͰ͸ͳ͍
    ςετίʔυΛؚΊͯɺ
    ίʔυ͕ୈҰڃͷυΩϡϝϯτ

    View Slide

  18. ಈػᶅɿ
    ϨΨγʔʹͳͬͯ͠·ͬͨγ
    εςϜΛͲ͏ʹ͔͍ͨ͠

    View Slide

  19. DDDͷ໨త͸
    γεςϜΛϨΨγʔʹͤͣɺ
    ܧଓతʹਐԽͤ͞Δ͜ͱ

    View Slide

  20. DDDͷ·ͱΊ
    • γεςϜ͕ෳࡶʹͳΔͷ͸ѻ͏ۀ຿͕ෳࡶ
    ͔ͩΒ
    • ۀ຿ͷϞσϦϯά(υϝΠϯϞσϧ)Λઃܭͷ
    த৺ʹ͢Δ
    • ϞσϦϯάˠίʔσΟϯάˠϑΟʔυόοΫ
    ͷαΠΫϧͰυϝΠϯϞσϧΛચ࿅ͤ͞Δ
    • γεςϜΛϨΨγʔʹͤͣɺܧଓతʹਐԽ͞
    ͤΔ

    View Slide

  21. ͔͜͜Β࢝ΊΔDDD
    ϗϫΠτϓϥεͰ࣮ફͨ͜͠ͱͷ঺հ

    View Slide

  22. 1. ΞʔΩςΫνϟͷಋೖ
    ·ͣ͸DDDΒ͘͠ॻ͚Δ؀ڥΛ੔උ

    View Slide

  23. ಋೖͨ͠ΞʔΩςΫνϟ

    View Slide

  24. 3૚ʴυϝΠϯ૚
    ίϯτϩʔϥʔ
    ΠϯϑϥετϥΫνϟ
    ΞϓϦέʔγϣϯ υϝΠϯ

    View Slide

  25. ֤૚ͷઆ໌

    View Slide

  26. υϝΠϯ૚
    ίϯτϩʔϥʔ
    ΠϯϑϥετϥΫνϟ
    ΞϓϦέʔγϣϯ υϝΠϯ

    View Slide

  27. υϝΠϯ૚
    • υϝΠϯϞσϧ͕ଉͮ͘৔ॴ
    • ϏδωεϩδοΫΛॻ͘
    • DB΍UIͳͲͷٕज़ελοΫͷૢ࡞͸͜͜ʹ
    ͸ॻ͔ͳ͍

    View Slide

  28. ίϯτϩʔϥʔ૚
    ίϯτϩʔϥʔ
    ΠϯϑϥετϥΫνϟ
    ΞϓϦέʔγϣϯ υϝΠϯ

    View Slide

  29. ίϯτϩʔϥʔ૚
    • UI΍όονίϚϯυͷड͚ޱ
    • ϦΫΤετ΍Ҿ਺ͷݕূΛߦ͍ΞϓϦέʔ
    γϣϯ૚ͷαʔϏεΛݺͼग़͢ίʔυΛॻ
    ͘

    View Slide

  30. ΞϓϦέʔγϣϯ૚
    ίϯτϩʔϥʔ
    ΠϯϑϥετϥΫνϟ
    ΞϓϦέʔγϣϯ υϝΠϯ

    View Slide

  31. ΞϓϦέʔγϣϯ૚
    • ֎෦ެ։ΠϯλʔϑΣʔε
    • Πϯϑϥ૚ͱυϝΠϯ૚ͷڮ౉͠
    • ΞϓϦέʔγϣϯΛ࣮ߦ͢Δखଓ͖Λॻ͘

    View Slide

  32. ΠϯϑϥετϥΫνϟ૚
    ίϯτϩʔϥʔ
    ΠϯϑϥετϥΫνϟ
    ΞϓϦέʔγϣϯ υϝΠϯ

    View Slide

  33. ΠϯϑϥετϥΫνϟ૚
    • DBɺϑΝΠϧɺΩϟογϡͳͲΠϯϑϥʹ
    ΞΫηε͢ΔίʔυΛॻ͘

    View Slide

  34. σΟϨΫτϦߏ੒
    Xxxx
    ├── App
    │ └── XxxxService.php
    ├── Domain
    │ └── Xxxx.php
    ├── Infra
    │ └── XxxxRepository.php
    └── UI
    └── XxxxController.php

    View Slide

  35. ·ͣ͸͡Ίʹ໨ࢦͨ͜͠ͱ

    View Slide

  36. ৽͍͠ΞʔΩςΫνϟͰ౰ͨ
    Γલͷ͜ͱΛ࣮ݱ͢Δ
    • ը໘ೖྗ͔ΒDBొ࿥
    • DB͔ΒσʔλΛऔಘͯ͠ɺը໘දࣔ

    View Slide

  37. ࣍ʹ໨ࢦ͍ͯ͠Δ͜ͱ

    View Slide

  38. ίϯτϩʔϥʔͳͲͰॻ͔Ε
    ͨ1ຕؠͷίʔυΛ֤ϨΠ
    Ϡʔ΁Ҡಈ͢Δ

    View Slide

  39. ͨͩ͠ʂ
    ࠷ѱίϯτϩʔϥʔ૚ʹॻ͔Εͨίʔυ͸Ξ
    ϓϦέʔγϣϯ૚ʹ͔͚͹ಈ͖·͢ɻ
    ͱ͍͏৺ཧత҆શωοτ΋Ҋ಺͢Δɻ

    View Slide

  40. ·ͱΊ
    • ΞʔΩςΫνϟΛಋೖͯ͠·ͣ͸DDDͰ
    ॻ͚Δ৔ॴ͕֬อ͞Εͨ
    • ࠓ·ͰϢχοτςετ͕ॻ͚ͳ͔ͬͨίʔ
    υͰςετ͕ॻ͚ΔΑ͏ʹͳͬͨ
    • (ͦͷ෼࣌ؒ΋͔͔ΔΑ͏ʹͳͬͨ)

    View Slide

  41. 2. υϝΠϯϞσϧΛҭͯΔ
    ͍Α͍ΑDDDͰ࣮ࡍʹίʔυ͕ॻ͚Δ

    View Slide

  42. υϝΠϯϞσϧΛҭͯΔࡍʹ
    ग़͖ͯͨ໰୊

    View Slide

  43. ໰୊ᶃɿ
    Ͳ͏͍͏ج४ͰίʔυΛ·ͱ
    Ί͍ͯͬͨΒྑ͍ͷ͔ʁ

    View Slide

  44. ࣗ෼ͨͪͷαʔϏε͕ͲΜͳ
    ۀ຿Ͱ੒Γཱ͍ͬͯΔ͔੔ཧ
    ͢Δ
    →αϒυϝΠϯΛચ͍ग़͢

    View Slide

  45. αϒυϝΠϯ
    • ֤ۀ຿୯ҐͷྖҬ
    • ҙࢥܾఆऀɺओʹؔΘΔਓୡɺൃੜ͢ΔΠ
    ϕϯτͷछྨͳͲͰઢΛ۠੾Δ

    View Slide

  46. ΍͍ͬͯΔ༷ࢠ

    View Slide

  47. ໰୊ᶄɿ
    ࣗ෼ͨͪͷγεςϜ͸DDDత
    ʹ͸Ͳ͏ͳͷʁ

    View Slide

  48. ࣗ෼ͨͪͷαʔϏε͕ͲΜͳ
    γεςϜͰ੒Γཱ͍ͬͯΔ͔
    ੔ཧ͢Δ
    • ڥք͚ͮΒΕͨίϯςΩετΛચ͍ग़͢
    • αϒυϝΠϯͱϚοϐϯά͢Δ

    View Slide

  49. ڥք͚ͮΒΕͨίϯςΩετ
    • αϒγεςϜɺ֎෦γεςϜͳͲͷൺֱత
    ໨ʹݟ͑ΔγεςϜͷڥ໨

    View Slide

  50. Կ͕෼͔Δ͔ʁ
    • αϒγεςϜͱ֎෦γεςϜΛআ͘ڥք͚ͮ
    ΒΕͨίϯςΩετ͸1:1͕ཧ૝͕ͩɺݱঢ়
    ͕Ͳͷ͘Β͍཭Ε͍ͯΔ͔෼ੳͰ͖Δ
    • αϒυϝΠϯ୯ҐͰτοϓϨϕϧͷ໊લۭ
    ͕ؒखʹೖΔ

    View Slide

  51. Xxxx
    ├── App
    │ └── XxxxService.php
    ├── Domain
    │ └── Xxxx.php
    ├── Infra
    │ └── XxxxRepository.php
    └── UI
    └── XxxxController.php
    ˡ͜Ε͕ܾ·Δ
    Կ͕෼͔Δ͔ʁ

    View Slide

  52. ·ͱΊ
    • ࠓޙυϝΠϯΛҭ͍ͯͯ͘ํ޲ੑ͕ݟ͑
    ͨ
    • ࣗ෼ͨͪͷγεςϜ๊͕͑ΔυϝΠϯͷ
    ཧղ͕ਂ·ͬͨ
    • ݱ࣮Λ஌ͬͨ

    View Slide

  53. ࠓޙ΍͍ͬͯ͘͜ͱ
    • ֤ਓͰ࢝Ί͍࣮ͯͨ૷ͷ౷߹
    • ࣮૷ϨϕϧͰͷඪ४Խ
    • ʮڊେͳటஂࢠʯͱͷઓ͍͸ଓ͘

    View Slide

  54. ͓ΘΓ
    ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide

  55. ࣮ࡍͷίʔυͷ঺հ

    View Slide

  56. class Period
    {
    public function shorten(DueDate $renewal_day)
    {
    if (!$this->canShorten($renewal_day)) {
    throw new \OutOfRangeException("࣍ճߋ৽೔͕༗ޮͳൣғʹ͋Γ·ͤΜɻ");
    }
    return new Period($this->startDay, $renewal_day);
    }
    public function canShorten(DueDate $renewal_day)
    {
    $candidate = $this->candidateShortenPeriod();
    return $candidate->includes($renewal_day);
    }
    public function candidateShortenPeriod()
    {
    // ݄࣍ͷ1೔ʙݱࡏͷ࣍ճߋ৽೔·Ͱ͕୹ॖͷީิ
    return new static(
    new DueDate(new \DateTimeImmutable('first day of next month')),
    $this->renewalDay()
    );
    }
    public function includes(DueDate $renewal_day)
    {
    return
    ($renewal_day == $this->startDay || $renewal_day->after($this-
    >startDay)) &&
    ($renewal_day == $this->renewal_day || $renewal_day->before($this-
    >renewal_day));
    }
    }

    View Slide