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

bitkey流DDD活用術 〜なぜDDD?なにを活かしてどこを壊すのか〜

bitkey流DDD活用術 〜なぜDDD?なにを活かしてどこを壊すのか〜

More Decks by 株式会社ビットキー / Bitkey Inc.

Other Decks in Technology

Transcript

  1. ϏοτΩʔྲྀDDD׆༻ज़
    ʙͳͥ%%% ͳʹΛ׆͔ͯ͠Ͳ͜Λյ͢ͷ͔ʙ

    View Slide

  2. ࠤ౻ ୓ਓ
    Sato Takuto
    2015.04
    2019.05
    2020.01
    େֶ(ݐஙֶઐ߈)ଔۀޙɺ
    גࣜձࣾϫʔΫεΞϓϦέʔγϣϯζʹೖࣾ
    ձܭγεςϜͷιϑτ΢ΣΞ։ൃΛ୲౰
    ಛʹࡒ຿ձܭͷ࢓༁ؔ࿈
    ϏοτΩʔ΁ࢀը
    ECαΠτͷ։ൃ / อकɺࣾ಺γεςϜͷ։ൃ
    TaKuTyͷ։ൃ
    ࠓͷHomeͷલ਎ͱͳΔResidenceνʔϜʹ഑ଐ
    bitlockΛѻ͏؅ཧը໘΍όοΫΤϯυɺappͷ։ൃ
    ʹैࣄ
    2022.07 HomeϓϩμΫτͷٕज़੹೚ऀ
    ෳࡶͳࣄ৅ΛಡΈղ͍ͯߏ଄Խ͠ɺந৅Խ / ൚༻Խ
    Ͱ͖ΔΑ͏ʹઃܭ͠ɺ௿ίετͰଟ͘ͷՁ஋Λͩͤ
    Δ։ൃΛ͢Δ͜ͱΛ޷Ή

    View Slide

  3. 1. ͸͡Ίʹ
    twitter
    ͸͡Ί·ͨ͠ʂ
    ϑΥϩʔ͓ئ͍͠·͢ʂ
    @takuuuuuuu777
    ϑΥϩʔ͍ͨ͠ͱࢥͬͯ΋Β͑ΔΑ͏ͳ
    ൃදΛ͠·͢....ʂʂ
    3
    3

    View Slide

  4. 1. ͸͡Ίʹ
    ࿩͢಺༰
    DDDΛಋೖͨ͠
    ϏοτΩʔ(HomeࣄۀྖҬ)ͰͷӦΈʹ͍ͭͯ
    ໨త
    DDDಋೖͷϓϩηεͱ޻෉఺ͷڞ༗
    ࠓޙಋೖ࣌ͷࢀߟ / ಋೖޙͷվળͷࢀߟ
    4
    4

    View Slide

  5. 1. ͸͡Ίʹ
    5
    5
    λʔήοτ
    ɾDDDͬͯΦΠγΠϊʁ
    ɾDDDಋೖ͍͚ͨ͠ͲͲ͏͢Ε͹Α͍...ʁ
    ɾDDDಋೖͯ͠Έ͚ͨͲ্ख͍͔͘ͳ͍
    ɾDDDಋೖࡁΈͰ΋ͬͱચ࿅͍ͤͨ͞
    ɾଞࣾͷӡ༻ํ๏ؾʹͳΔ

    View Slide

  6. Outline
    1. ͸͡Ίʹ
    2. ;Ή;Ή
    3. ͦ΋ͦ΋
    4. ͯͯ͞͞
    5. ΋͙΋͙
    6. ͠Ί
    6
    6

    View Slide

  7. Outline
    1. ͸͡Ίʹ
    2. ;Ή;Ή (ͳΔ΄ͲͶ)
    3. ͦ΋ͦ΋ (ͳʹ͍ͨ͠Μ͚ͩͬ)
    4. ͯͯ͞͞ (Ͳ͏͠Α͏͔)
    5. ΋͙΋͙ (͓͍͍͠ͷ)
    6. ͠Ί
    7
    7

    View Slide

  8. ;Ή;Ήɻ
    8
    8

    View Slide

  9. 1. ;Ή;Ή
    DDDͱฉ͍ͯɺͳʹΛࢥ͍·͔͢ʁ
    9
    9
    ಥવͰ͕͢...

    View Slide

  10. 1. ;Ή;Ή
    ΤϯςΟςΟɺ஋ΦϒδΣΫτ
    ϞσϦϯάɺυϝΠϯΤΩεύʔτ
    10
    10
    ઃܭࢥ૝ɺΞδϟΠϧɺफڭ࿦૪
    ͨͿΜ͍Ζ͍Ζ...

    View Slide

  11. 1. ;Ή;Ή
    ࢥͬͨ͜ͱ on 2020.01
    11
    11
    ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ
    ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ
    ։ൃऀ = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ
    ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏...
    ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ
    ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...

    View Slide

  12. 1. ;Ή;Ή
    ࢥͬͨ͜ͱ on 2022.04
    12
    12
    ։ൃɺͳΜ͔՝୊͕͋Δͳ...՝୊ͳΜͩΖ...
    Ͳ͏ͨ͠ΒղܾͰ͖ΔΜͩΖ...
    DDDͷߟ͑ํΛద༻Ͱ͖Δ͔΋...ʂ
    ͦͯ͠ݱࡏ
    ͳΜͱ͔൘ʹ͍͖ͭͯͨ
    ΋ͬͱվળ͍ͯ͜͠͏ʂʂ

    View Slide

  13. ͦͯ͠ɺࢥ͏͜ͱ
    1. ;Ή;Ή
    13
    13

    View Slide

  14. ॏཁͳͷ͸
    DDDͱͯ͠ Ͳ͏͋Δ΂͖͔
    Ͱ͸ͳ͘
    1. खஈͱͯ͠ଥ౰͔
    2. ՝୊ΛղܾͰ͖Δ͔
    1. ;Ή;Ή
    14
    14

    View Slide

  15. 1. ;Ή;Ή
    1. ଥ౰͔ʁ
    ։ൃͷϑΣʔζ / ՝୊౳ΛؑΈͯ൑அ
    σϝϦοτ্͕ճͬͨΒҙຯແ͠...
    2. ղܾͰ͖Δ͔ʁ
    ղܾͷखஈʹঢ՚Ͱ͖Δ͔
    ఏএ͞Ε͍ͯΔ͜ͱΛͦͷ··࣮ફͯ͠
    ՝୊͕ղܾͰ͖Δͱ͸ݶΒͳ͍...
    15
    15

    View Slide

  16. 1. ;Ή;Ή
    1. ଥ౰͔ʁ
    ։ൃͷϑΣʔζ / ՝୊౳ΛؑΈͯ൑அ
    σϝϦοτ্͕ճͬͨΒҙຯແ͠…
    2. ղܾͰ͖Δ͔ʁ
    ղܾͷखஈʹঢ՚Ͱ͖Δ͔
    ఏএ͞Ε͍ͯΔ͜ͱΛͦͷ··࣮ફͯ͠
    ՝୊͕ղܾͰ͖Δͱ͸ݶΒͳ͍...
    16
    16
    ։ൃͷϑΣʔζͱ՝୊Λ
    ͪΌΜͱཧղͰ͖ͯΔʁʁ
    ఏএ಺༰Λ뱌ͯ͠
    ՝୊ΛͲ͏΍ͬͨΒղܾͰ͖Δ
    ͷͩΖ͏͔ʁ

    View Slide

  17. աڈΛৼΓฦͬͯΈΔ
    1. ;Ή;Ή
    17
    17

    View Slide

  18. 1. ;Ή;Ή
    ࢥͬͨ͜ͱ on 2020.0
    18
    18
    ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ
    ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ
    ։ൃऀ = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ
    ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏...
    ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ
    ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...

    View Slide

  19. 1. ;Ή;Ή
    ࢥͬͨ͜ͱ on 2020.0
    19
    19
    ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ
    ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ
    ։ൃऀ = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ
    ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏...
    ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ
    ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
    ͜͏ࢥ͍ͬͯΔ࣌఺Ͱɺͦ΋ͦ΋ඞཁͳঢ়گͰͳ͍

    View Slide

  20. ͜͜͸΍Γํͷ໰୊ɻDDD͔ΒೖΔͱ೉͍͔͠΋....
    ՝୊ͱୡ੒͍ͨ͜͠ͱΛ໌֬ʹͯ͠ྟΊ͹͍͚Δʂʂ
    1. ;Ή;Ή
    ࢥͬͨ͜ͱ on 2020.0
    20
    20
    ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ
    ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ
    ։ൃऀ = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ
    ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏...
    ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ
    ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...

    View Slide

  21. 1. ;Ή;Ή
    ಛʹҎԼ؍఺ʹ͍͕ͭͯ
    ຊ೔ͷϝΠϯTopic
    1. खஈͱͯ͠ଥ౰͔
    ՝୊ͷೝࣝͱDDDʹظ଴ͨ͠΋ͷ
    2. ՝୊ΛղܾՄೳ͔
    ՝୊ղܾͷͨΊͷߦͬͨ͜ͱ
    ͦͷखॱͱ޻෉఺
    21
    22

    View Slide

  22. ܰྔDDDͱ͔ϘτϜΞοϓDDD
    ͳͲͷΑ͏ʹ
    ࣮૷෦෼ͷ࿩͕ϝΠϯͰ͢
    1. ;Ή;Ή
    22
    23

    View Slide

  23. Outline
    1. ͸͡Ίʹ
    2. ;Ή;Ή (ͳΔ΄ͲͶ)
    3. ͦ΋ͦ΋ (ͳʹ͍ͨ͠Μ͚ͩͬ)
    4. ͯͯ͞͞ (Ͳ͏͠Α͏͔)
    5. ΋͙΋͙ (͓͍͍͠ͷ)
    6. ͠Ί
    23
    24

    View Slide

  24. ͦ΋ͦ΋
    ͳʹ͍ͨ͠Μ͚ͩͬʁ
    24
    25

    View Slide

  25. 1. ͦ΋ͦ΋
    ։ൃͷϑΣʔζͱ՝୊ʹ͍ͭͯ
    ͦͷͨΊʹ...
    Ϗδωεͷઆ໌ / ։ൃମ੍ͷঢ়گ
    ʹ͍ͭͯ
    1෼͘Β͍Ͱͬ͘͟Γ
    25
    26

    View Slide

  26. Ϗδωε
    26
    27

    View Slide

  27. 27
    28
    1. ͦ΋ͦ΋

    View Slide

  28. 28
    29
    1. ͦ΋ͦ΋

    View Slide

  29. 29
    30
    1. ͦ΋ͦ΋

    View Slide

  30. 30
    31
    1. ͦ΋ͦ΋

    View Slide

  31. 31
    32
    1. ͦ΋ͦ΋

    View Slide

  32. 1. ;Ή;Ή
    ಛ௃
    ର৅ྖҬ͕ͻΖ͍
    ྖҬΛΧόʔ(ͭͳ͛Δ)͜ͱͰՁ஋͕ग़Δ
    ݶΒΕͨϦιʔεͰ೗Կʹޮ཰తͳ։ൃ͢Δ͔
    1ͭͷ։ൃͰଟ͘ͷՁ஋͕ग़ͤΔ։ൃΛॏࢹ
    32
    33

    View Slide

  33. 33
    34
    1. ͦ΋ͦ΋

    View Slide

  34. ։ൃ
    34
    35

    View Slide

  35. νʔϜߏ੒
    - ࣾһ4-5ਓ + ۀ຿ҕୗ
    ։ൃϓϩηε
    - εΫϥϜ։ൃͰɺ1िؒεϓϦϯτ
    - ϑϩϯτ × όοΫΤϯυ݉ۀΛਪ঑
    - openapiͰAPIͷIFఆ͔ٛͯ͠Β࣮૷
    ٕज़
    - React × Typescriptɺnode.js × Typescript
    - ؀ڥ͸GCPɺDB͸firestore͕΄΅΄΅
    35
    36
    ೉͍͠ϙΠϯτ
    - ྖҬ͕޿͍ɺػೳ΋ଟذʹΘͨΔ
    (ݖݶͷ؅ཧ / ΧΪͷ؅ཧ / ೖୀډ؅ཧ / ܝࣔ൘ / ౤ථ...)
    - ڞ௨Խͷਪਐ -> ந৅Խ͞Εͨσʔλ΍ϩδοΫ
    1. ͦ΋ͦ΋
    ιʔεن໛
    - ςʔϒϧɿ400ఔ౓
    - APIɿ500ʙ1000ఔ౓
    - ιʔεɿ100ສߦఔ౓

    View Slide

  36. ։ൃಛੑ
    36
    37
    1. ͦ΋ͦ΋
    ɾՁ஋ఏڙͷର৅ͱͳΔࣄۀྖҬ͕ඇৗʹ޿͍
    ɹΧΪ / ಺ݟ༧໿ / ཧࣄ૯ձ / إೝূ / ഑ୡαʔϏε࿈ܞ ...ͳͲ
    ɹந৅Խ൚༻Խ͞Εͨػೳ͕͍ΖΜͳจ຺Ͱར༻͞ΕΔ
    ɾந৅Խ & ൚༻ԽΛੵۃతʹ࣮ࢪ
    ɹ(֓೦తͳཁૉ͕ڧ͘ͳΓɺೝࣝ૬ҧ͕ੜ·ΕΔϦεΫ͋Γ)
    ϓϩμΫτ਺ / ػೳ਺ ͕૿͑ɺ։ൃʹؔΘΔਓ΋૿Ճ
    → શମΛ೺Ѳ͠ͳ͕Β։ൃΛ͢Δ͜ͱ͕ඇৗʹࠔ೉ͳঢ়ଶʹ...

    View Slide

  37. 37
    38
    1. ͦ΋ͦ΋
    1ͭͷαʔϏε͕ෳ਺ͷจ຺Ͱར
    ༻͞ΕΔͱɺαʔϏε಺ʹݸผ
    ͷॲཧΛ͕࣋ͪͪ...
    1ͭͷαʔϏε͕ෳ਺ͷจ຺Ͱར
    ༻͞ΕΔͱɺαʔϏε಺ʹݸผͷ
    ॲཧΛ͕࣋ͪͪ...
    ༧໿Λڞ௨Խ͢Δࡍʹൃੜ͑͠Δ໰୊

    View Slide

  38. ྫ1
    ༧໿ͷσʔλʹ͸ҎԼͷϑΟʔϧυ͕͋Δ
    ɾॏෳ༧໿Մ൱: boolean (ඞਢ߲໨)
    ɾॏෳ༧໿Մೳ਺: number (೚ҙ߲໨)
    ॏෳ༧໿Մ൱͕trueͷ৔߹ʹɺॏෳ༧໿Մೳ਺͕ະࢦఆͷ৔߹ͷऔΓѻ͍ํ
    ॏෳ༧໿Մೳ਺͕ෛͷ਺ͩͬͨ৔߹ͷऔΓѻ͍ํ
    Ͱॲཧͷ݁Ռ͕ࠩҟ͕ग़ΔՄೳੑ͕͋Δ
    ಺ݟ༧໿Ͱ͸ॏෳ༧໿Մ൱͕trueͰॏෳ༧໿਺͕ະࢦఆͷ৔߹ʹ͸੍ݶ͔͚ͳ͍
    ձٞࣨ༧໿Ͱ͸ॏෳ༧໿Մ൱͕trueͰॏෳ༧໿਺͕-1ͷ৔߹ʹ͸ձٞࣨͰࢦఆ͞Ε͍ͯΔσ
    ϑΥϧτͷ੍ݶ਺Ͱѻ͏
    ͱ͔...
    38
    39
    1. ͦ΋ͦ΋

    View Slide

  39. ྫ2
    ಺ݟ༧໿ͷొ࿥ʹ͸ҎԼͷϧʔϧ͕͋ͬͨ
    ɾೖډத͸༧໿ෆՄɻୀڈ༧ఆ೔ͷཌ೔ʹೖډத->ۭࣨͱͳΔ
    ௥ՃͰҎԼͷϧʔϧ͕ద༻ͱͳͬͨ
    ɾୀڈ༧ఆ೔͸ୀڈ༧ఆ೔࣌Ҏ߱ͳΒಛผʹ಺ݟ͕ՄೳͱͳΔ
    ୀڈޙͷ࿈བྷઌͷߋ৽ॲཧͰߋ৽͢Δ໰୊͕ൃੜ
    ಺ݟ༧໿ͷొ࿥/มߋؔ࿈Ͱ͸௥Ճཁૉͷߟྀ͕͞Ε͍͕ͯͨɺ
    ೖୀډͷߋ৽ॲཧͰ্هϧʔϧ͕ߟྀ͞Ε͓ͯΒͣߋ৽Ͱ͖ͳ͍໰୊͕ൃੜ
    ୀڈ༧ఆ೔ࣗମͷมߋͳ͍΋ͷͷɺ௥Ճཁૉ͕ߟྀ͞Ε͍ͯͳ͍νΣοΫॲཧ͕࠶౓࣮ࢪ͞
    ΕɺΤϥʔ൑ఆ
    39
    40
    1. ͦ΋ͦ΋

    View Slide

  40. 40
    ՝୊
    - ଞػೳͰෆ੔߹ͱͳΔσʔλΛ࡞Δ࣮૷͕Մೳ
    - Өڹൣғͷ೺Ѳࠔ೉Ͱɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍
    - ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλε೺Ѳ͕ࠔ೉ (σʔλભҠ)
    - σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ೉ (ػೳ × σʔλͷؔ࿈)
    - validation౳ͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม…
    - ొ࿥஋ͷೝࣝͷ࢓ํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍…
    - Ͳ͜ʹͲͷΑ͏ͳ࣮૷͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ
    - service૚ˠservice૚ˠ...→service૚ˠ update & commit
    41
    1. ͦ΋ͦ΋

    View Slide

  41. 41
    ՝୊
    - ଞػೳͰෆ੔߹ͱͳΔσʔλΛ࡞Δ࣮૷͕Մೳ
    - Өڹൣғͷ೺Ѳࠔ೉Ͱɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍
    - ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλε೺Ѳ͕ࠔ೉ (σʔλભҠ)
    - σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ೉ (ػೳ × σʔλͷؔ࿈)
    - validation౳ͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม…
    - ొ࿥஋ͷೝࣝͷ࢓ํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍…
    - Ͳ͜ʹͲͷΑ͏ͳ࣮૷͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ
    - service૚ˠservice૚ˠ...→service૚ˠ update & commit
    42
    1. ͦ΋ͦ΋

    View Slide

  42. 1. ݎ࿚ੑ
    ར༻͢Δଆͷ࣮૷ͷ࢓ํʹΑΒͣɺϧʔϧ͕ݫक͞ΕΔ
    2. ஌ࣝͷू໿
    ར༻ՕॴͷιʔεΛղಡ͢Δ͜ͱͳ͘ɺڍಈͷ೺Ѳ͕Մೳ
    42
    43
    1. ͯͯ͞͞
    ՝୊·ͱΊ

    View Slide

  43. ࣮ࡍͷιʔεΛݟͳ͕Β
    ՝୊Λ֬ೝͯ͠ΈΔ
    43
    44
    1. ͦ΋ͦ΋
    ࣌ؒͳ͍ͷͰ͜͜Ͱ͸ׂѪ
    ผ్Qiitaʹهࡌ͍ͯ͠·͢ʂ
    ※ ࢲͷtwitterϦϯΫ͔ΒඈΜͰ͍͚ͨͩ·͢ʂ

    View Slide

  44. 44
    45
    1. ͦ΋ͦ΋
    Πϝʔδ
    Qiita Qiitaʹهࡌͷαϯϓϧ

    View Slide

  45. ͯͯ͞͞
    Ͳʔ͢Δʁ
    45
    46

    View Slide

  46. ద੾ʹ࣮૷͞Ε͍ͯΕ͹OK
    ͬͯ࿩Ͱ͸͋Δɻ
    SOLIDݪଇͱ͔
    ୯Ұ੹೚ͱ͔
    ୯Ұ੹೚ͱ͔
    ୯Ұ੹೚ͱ͔
    ...
    46
    47
    1. ͯͯ͞͞
    લఏͱͯ͠...

    View Slide

  47. ۃ࿦SOLIDݪଇΛશһ͕
    ߴ͍ਫ४Ͱ࣮ݱͰ͖Ε͹ࠔΒͳ͍
    Ͱ΋ͦ͏͸͍͔ͳ͍...
    ࢓૊Έͱͯ͠ղܾ͢Δඞཁ͕͋Δ
    ɾݎ࿚ʹ͢΂͖෦෼
    ɾ଎౓΍ख཭ΕΛॏࢹ͍ͨ͠෦෼
    Λ෼཭Ͱ͖Δͱͳ͓ྑ͍
    47
    48
    1. ͯͯ͞͞

    View Slide

  48. ϚΠΫϩαʔϏεԽͱ͔΋͋Δ
    ࣄલʹ໌֬ʹڥքΛҾ͘ඞཁ͋Γ
    ޙ͔Βमਖ਼͕ޮ͔ͤͮΒ͍
    ৔߹ʹΑͬͯ͸։ൃ଎౓્֐ཁҼͱͳΓ͑Δ
    ܾࡁ / ೝূج൫ͱ͔͸੹຿Λ໌֬ԽͰ͖ΔྖҬ͸
    ϚΠΫϩαʔϏεԽࡁΈ
    48
    49
    1. ͯͯ͞͞

    View Slide

  49. DDD
    υϝΠϯΦϒδΣΫτʹண໨
    49
    50
    1. ͯͯ͞͞
    ݁Ռͱͯ͠...

    View Slide

  50. υϝΠϯΤΩεύʔτ
    ϢϏΩλεݴޠͰձ࿩͕Ͱ͖Δͱ͔
    ϞσϧΛܧଓతʹ੒௕͍ͤͯ͘͞ͱ͔...
    ͸࣍ͷεςοϓͰ
    1. ݎ࿚ɺ2. ஌ࣝͷू໿
    ͕·ͣ͸ओ໨త
    50
    51
    1. ͯͯ͞͞
    DDDͱ͍ͬͯ΋...
    ↑͜Ε΋ॏཁͰ͕͢ओͨΔ՝୊Ͱͳ͍ͷͰɺ࠷ॳ͸ߟ͑ͳ͍
    ɹ࠷ॳ͔Β͋Ε΋͜Ε΋ͩͱࠞཚͯ͠͠·͏ͷͰ...

    View Slide

  51. ͰɺͲ͏ͨ͠ͷʁ
    0ϕʔεͰ࡞Γ௚͠ʁ
    51
    52
    1. ͯͯ͞͞

    View Slide

  52. طଘͷߏ੒Λ׆͔͠ͳ͕Β࣮૷
    52
    53
    1. ͯͯ͞͞

    View Slide

  53. طଘͷߏ੒Λ׆͔͠ͳ͕Β࣮૷
    53
    54
    1. ͯͯ͞͞
    ࣮ࡍʹͳʹΛͨ͠ͷ͔ʁ

    View Slide

  54. طଘ࣮૷
    ϨΠϠʔυߏ଄
    54
    55
    1. ͯͯ͞͞
    DB(firestore)΁ͷґଘ౓େ
    serviceϨΠϠͰ΋ґଘ࣮ͨ͠૷಺༰
    service -> service -> service …
    Έ͍ͨͳߏ଄..͚ͬ͜͏͋Δ
    DBͷܕ৘ใ
    υΩϡϝϯτύεͷఆٛ
    (table໊+primaryKeyΈ͍ͨͳ΋ͷ)

    View Slide

  55. ·ͣ͸ɺͱΓ͋͑ͣɺ
    DAOͷฦ٫஋ΛΫϥεͰฦ٫
    ͦ͜ʹϝιουΛੜ΍͢
    ߋ৽΋Ϋϥεड͚औͬͯߋ৽͢Δ
    55
    56
    1. ͯͯ͞͞
    طଘͷॲཧ͸ͦͷ··ɺ
    ৽ͨʹͭ͘Δ෦෼Λ
    ·ͣ͸Ϋϥε࢖࣮ͬͯ૷ͯ͠ΈΔ
    ͬͯͱ͜Ζ͔Β࢝ΊΔ

    View Slide

  56. 56
    57
    1. ͯͯ͞͞

    View Slide

  57. 57
    58
    1. ͯͯ͞͞
    before after

    View Slide

  58. Is this DDD ... ? (͜Ε͕DDDʁ)
    ͬͯ࿩͸͋Δ͕ɺ͜Ε͚ͩͰ΋ղܾͰ͖Δ໰୊͸͋Δ
    ҎԼͷج൫͕Ͱ͖Δ
    ɾΫϥε಺ͷϧʔϧΛఆٛͰ͖Δ
    ɾৼΔ෣͍ΛఆٛͰ͖Δ
    58
    59
    1. ͯͯ͞͞

    View Slide

  59. 59
    60
    1. ͯͯ͞͞
    ؆୯ʹ௥ՃͰ͖Δ͜ͱ
    ɾॳظԽঢ়ଶͷ໌ࣔ
    ɾόϦσʔγϣϯͷ໌ࣔ
    ɾৼΔ෣͍ΛఆٛͰ͖Δ
    ɾϞσϧ಺ͷ੔߹ੑΛ୲อͰ͖Δ
    ͜͜·ͰͰ΋ҙຯ͸͋Δʂ
    ͞ΒʹͲ͏ղܾ/վળ͍͔ͯ͘͠
    ՝୊ / ղܾ͍ͨ͠ϙΠϯτ
    ʹԠ֦ͯ͡ு͍͚ͯ͠͹OKʂ

    View Slide

  60. ΍ͬͨ͜ͱ
    ɾEntityΛ·ͣ͸
    ɾRepositoryͰ·͠ʹ
    ɾ࣍ʹValueObject
    ɾϞσϧؒ੔߹ੑ୲อͷͨΊͷू໿
    ɾݎ࿚ੑڧԽͷͨΊͷFirstCollection
    ɾ͞ΒͳΔ஌ࣝͷू໿ʹ͸DomainService
    ɾརศੑͷͨΊͷCQR
    ɾൈ͚݀ݮΒͨ͢ΊʹσΟϨΫτϦ࠶ߟ
    ɾૄ݁߹ଅਐʹ͸DomainEvent΋͋Γ
    60
    61
    1. ͯͯ͞͞

    View Slide

  61. ΍ͬͨ͜ͱ
    ɾEntityΛ·ͣ͸
    ɾRepositoryͰ·͠ʹ
    ɾ࣍ʹValueObject
    ɾϞσϧؒ੔߹ੑ୲อͷͨΊͷू໿
    ɾݎ࿚ੑڧԽͷͨΊͷFirstCollection
    ɾ͞ΒͳΔ஌ࣝͷू໿ʹ͸DomainService
    ɾརศੑͷͨΊͷCQR
    ɾൈ͚݀ݮΒͨ͢ΊʹσΟϨΫτϦ࠶ߟ
    ɾૄ݁߹ଅਐʹ͸DomainEvent΋͋Γ
    61
    62
    1. ͯͯ͞͞

    View Slide

  62. Repository
    62
    63
    1. ͯͯ͞͞
    UsecaseϨΠϠͰ
    Entity㱻Objectͷม׵
    ͍ͯ͠Δ͔Β
    ݎ࿚ੑ͸௿͍
    EntityͰنఆ͍ͯ͠Δ
    ੍ޚʹج͍ͮͯ
    σʔλ͕ొ࿥
    ͞ΕΔ͔ະఆ

    View Slide

  63. 63
    64
    1. ͯͯ͞͞
    Repository

    View Slide

  64. 64
    65
    1. ͯͯ͞͞
    Repository

    View Slide

  65. 65
    66
    1. ͯͯ͞͞
    ValueObject
    (ݎ࿚ԽͷڧԽ)
    validationΛ໌ࣔͰ͖Δ
    ৼΔ෣͍ΛఆٛͰ͖Δ

    View Slide

  66. ΋͙΋͙
    ͓͍͍͠ʂʁ
    66
    67

    View Slide

  67. ΍ͬͯΈͯྑ͔ͬͨʂ
    ౰ॳݟࠐʹൺ΂͢ΜͳΓಋೖͰ͖ͨʂ
    67
    68
    1. ΋͙΋͙

    View Slide

  68. ɾϧʔϧ͕ݫ֨ʹͳΔ & ू໿͞ΕΔ
    ɾʮૢ࡞ʯʮߋ৽ʯ͕෼཭͞Ε໌ࣔతʹͳΔ
    ɾϞσϧͷʮৼΔ෣͍ʯʹ஫ҙ͕޲͘Α͏ʹͳΔ
    ɾusecase͕࣮૷͠΍͍͢εοΩϦ͢Δ
    68
    69
    1. ΋͙΋͙
    ྑ͔ͬͨ͜ͱ

    View Slide

  69. ɾؔ਺ͷύϥϝʔλ͕౷Ұ͞Ε͖ͬ͢Γͨ͠
    ɾอଘલͷ৘ใΛEntity಺ʹ࣋ͨͤΔ͜ͱͰɺ
    ɹrepositoryͷॲཧ͕εοΩϦͨ͠
    ɾӨڹൣғ͕ΑΓ໌֬ʹͳͬͨ
    69
    70
    1. ΋͙΋͙
    ྑ͔ͬͨ͜ͱ
    (෭࣍తޮՌ)

    View Slide

  70. 70
    71
    1. ΋͙΋͙
    ޮՌߴ͔ͬͨ͜ͱ
    ɾValueObject
    ϑΥʔϚοτ΍ϧʔϧΛΑΓ໌֬ʹͰ͖Δ
    ɾDomainService
    ϞσϧؒͷϧʔϧΛෑ͘͜ͱ͕Ͱ͖Δ
    ɾσΟϨΫτϦ੔ཧ
    ϧʔϧΛపఈ͢ΔͨΊʹඞཁ

    View Slide

  71. ɾطଘϑΝΠϧͷߏ੒ͱͷซ༻
    ɾஈ֊తಋೖ
    ɾݎ࿚ԽͷͨΊͷpackageߏ੒
    ɾιʔεهࡌྔΛ΁Βͨ͢Ίͷ࢓૊
    ɾมߋલޙͷ৘ใΛ΋ͨͤΔΑ͏ʹ
    ɾtransactionͷ؅ཧ
    71
    72
    1. ΋͙΋͙
    ޻෉఺
    ɾloggerɺdeep cloneɺ
    ɾreadOnly
    ɾvalueObjectͷdefault checker
    ɾtypeUtils
    ɾtoFirestoreͷconverter
    ɾlooseEntityͰgetterͷσϑΥ࣮૷
    ɾDIपΓ

    View Slide

  72. ɾ৑௕Ͱ࣮૷ྔ͕ଟ͘ͳΔɻվળͷ༨஍͋Γɻ
    ɾ΍Δ/΍ΒΛ໌֬ʹ͠ͳ͍ͱ͙͢ΧΦεʹͳΔ
    ɾ΍Γͳ͕Βߋ৽͢Δ͕සൟʹൃੜ͢Δ
    ɾϞσϧ࡞ΓࠐΈ -> ࣮૷͸ίεύΑ͘ͳ͔ͬͨ...
    ɾνʔϜ΁ͷల։΋͙͢ʹ͸Ͱ͖ͳ͍
    72
    73
    1. ΋͙΋͙
    େมͩͬͨ͜ͱ

    View Slide

  73. ɾ࣮૷લͷϞσϦϯά
    ɾڥք͚ͮΒΕͨίϯςΩετ
    ɾू໿୯ҐͰͷΈͷߋ৽
    73
    74
    1. ΋͙΋͙
    ΍Βͳ͔ͬͨ͜ͱ

    View Slide

  74. ͠Ί
    74
    75

    View Slide

  75. ॏཁͳͷ͸
    DDDͱͯ͠ Ͳ͏͋Δ΂͖͔
    Ͱ͸ͳ͘
    1. खஈͱͯ͠ଥ౰͔
    2. ՝୊ΛղܾͰ͖Δ͔
    1. ;Ή;Ή
    75
    76

    View Slide

  76. Ή͠Ζɺ࠷ॳ͔ΒϞσϧԽ͸೉͍͠...ʂʂʂʂ
    ΧϓηϧԽΛਪ͠ਐΊ͍͔ͨΒɺϞσϦϯάͷॏཁੑ͕ਁಁͯ͠
    υϝΠϯۦಈͷϞσϦϯάʹྗ͕஫͗͜·Ε͍ͯ͘
    ͬͯϕΫτϧ͕ࣗવͳؾ͕͢Δ...
    76
    77
    1. ͠Ί

    View Slide

  77. DDDΛऔΓೖΕͯ΋ɺ؆୯ʹղܾ͢Δ΋ͷͰ͸ͳ͍ɻ
    ୯७ʹઃܭ͕ॏཁʂʂʂʂʂʂ
    ࿪Έͷ͋Δ࣮૷͕ͮ͠Β͍
    ઃܭΛ޲্͢Δ͜ͱΛิॿͯ͘͠ΕΔ
    77
    78
    1. ͠Ί

    View Slide

  78. ࠓޙ
    ● ϞσϧΛνʔϜ/૊৫Ͱৢ੒͍ͯ͘͠࢓૊Έͮ͘Γ
    ● ValueObjectͷීٴ (஋ͷ؅ཧͷ࢓ํʹϧʔϧ͕༗Δ΍ͭ)
    ● υϝΠϯΠϕϯτͷಋೖ
    ● ࣮૷ྔͷ௿ݮ
    ● DomainModel ← infractructure ͷιʔε࣮૷ྔ௿ݮ
    ● ࢀর༻σʔλͱͷ࿈ܞڧԽ
    ● τϥϯβΫγϣϯ؅ཧͷ؅ཧ
    ● ྖҬͷ੾Γํͷྑ͍ํ๏ͷ໛ࡧ
    78
    79
    1. ͠Ί

    View Slide

  79. Ͳ͔͜Ͱ࿩ͤΔͱ͍͍ͳͱࢥ͏͜ͱ
    ● Ϗδωεͷ࿩
    ● ந৅Խ / ߏ଄Խ / ൚༻ԽΛ໨ࢦ͢։ൃͷ࿩
    ● ՝୊ͷৄࡉ / ࣮ྫɺͱղܾํ๏
    ● ҎԼཁૉͷ࢖͍ํৄࡉ / ࣮ྫ
    ○ ValueObject / Entity / DomainService / DomainEvent
    ● ϞσϦϯάͷ࢓ํ ͱ ࣮ྫ
    ● σʔλߋ৽࣌ͷτϥϯβΫγϣϯ؅ཧͷ࢓ํͱ޻෉఺ৄࡉ
    ● ॏෳνΣοΫͷػߏͷ࣮ݱͷ࢓ํ࣮ྫ (DomainService)
    ● ΧϓηϧԽͷ࣮ݱ౓߹ɺgetter, setterͱ͔Ͳ͏࣮ݱͯ͠Δ͔
    ● ίετෛՙͱͷ޲͖߹͍ํ
    ● σΟϨΫτϦߏ੒
    ● ͓ͷ͓ͷಉ͡ࣄ৅ʹ͍ͭͯϞσϦϯάͯ͠ɺσΟϕʔτͷ࣮ԋ
    79
    80
    1. ͠Ί

    View Slide

  80. ΍ͬͯΈͯΘ͔Δ͜ͱ͕ଟ͍
    ࠓճͷΑ͏ʹٞ࿦Ͱ͖Δ৔͸وॏʂʂ
    80
    81
    1. ͠Ί

    View Slide

  81. ͓·͚
    81
    82

    View Slide

  82. 1. ͸͡Ίʹ
    twitter
    ͸͡Ίͯ·͢ʂ
    ϑΥϩʔ͓ئ͍͠·͢ʂ
    @takuuuuuuu777
    ϑΥϩʔ͍ͨ͠ͱࢥͬͯ΋Β͑ΔΑ͏ͳ
    ൃදͰ͖ͯͨΒ͍͍ͳ...
    82
    83

    View Slide

  83. 1. ͓·͚
    Meety
    ࡞੒͠·ͨ͠ʂ
    ʮDDDʯʹ͍ͭͯ
    ΋ͬͱޠΒ͍͍ͨΑʂ
    ΋ͬͱৄ͍͠࿩͍ͨ͠/ฉ͖͍ͨΑʂ
    ͬͯํ͸ͥͻʂ
    ※ ࢲͷtwitterͷݻπΠʹهࡌͯ͠·͢
    83
    84

    View Slide

  84. 84

    View Slide

  85. Appendix
    85
    86
    ● DomainModel ←
    infractructure ͷ
    ιʔε࣮૷ྔ௿ݮ

    View Slide

  86. Domain Object ͷશମ૾
    86
    87
    1. Appendix

    View Slide

  87. Entity / ValueObject
    87
    88
    1. Appendix

    View Slide

  88. AbstractDomainObject
    88
    89
    1. Appendix

    View Slide

  89. AbstractLooseEntity
    89
    90
    1. Appendix

    View Slide

  90. AbstractValueObject
    90
    91
    1. Appendix

    View Slide

  91. DIͷ࣮ݱํ๏
    91
    92
    1. Appendix

    View Slide

  92. DIͷ࣮ݱํ๏
    92
    93
    1. Appendix

    View Slide

  93. Queue Smaple
    93
    94
    1. Appendix

    View Slide

  94. Queue Smaple આ໌
    94
    95
    1. Appendix
    ■ Queue
    ɾQueue Λ؅ཧ͢ΔͨΊͷσʔλ
    ɾॲཧத͔൱͔ɺॲཧ͍ͯ͠Δ task ͕ͳʹ͔ͳͲΛ؅ཧ͢Δ
    ■ QueueTask
    ɾQueue ʹੵ·ΕͨλεΫ
    ɾॲཧதͱͳΔλΠϛϯάͰ࡟আ͞Εɺॲཧʹࣦഊ͠ϦτϥΠର৅ͱͳͬͨλΠϛϯάͰ࠶ੜ੒͞ΕΔ
    ɾجຊతʹ͸ enqueue ͞Εͨ೔࣌ॱʹλεΫΛ࣮ߦ͢Δ
    ɾ༏ઌ౓͕ࢦఆ͞Εͯݴ͏৔߹ʹ͸༏ઌ౓͕ߴ͍ॱʹ࣮ߦ͢Δ
    ■ QueueTaskResult
    ɾQueue ͷ࣮ߦ݁ՌΛ؅ཧ͢ΔͨΊͷσʔλ
    ɾॲཧࣦഊͯ͠ϦτϥΠ͢Δ৔߹ͳͲ͸ɺϦτϥΠ͝ͱʹ݁ՌσʔλΛੜ੒͢Δ
    ɾTaskEntry ʹ͸࠷ऴతͳ݁ՌͷΈ֨ೲ͢Δ
    ■ QueueEntry
    ɾQueue λεΫΛ؅ཧ͢Δݩσʔλ
    ɾλεΫੜ੒࣌ʹຊσʔλ͕ੜ੒͞ΕΔ
    ɾλεΫ࣮ߦʹඞཁͳ৘ใͱɺ࠷௿ݶͷεςʔλεͷ؅ཧΛߦ͏
    ɾ࣮ࡍʹ Queue ্ͷσʔλભҠΛ؅ཧ͢Δσʔλ͸ผ
    ■ QueueEntrySubtask
    ɾ1 ͭͷ Entry Λ࣮ݱ͢ΔͨΊʹෳ਺ͷ Task Λ࣮ߦ͢Δඞཁ͕͋Δ৔߹ʹ
    ɹෳ਺ͷ Task Λ SubTask ͱͯ͠؅ཧ͢Δ

    View Slide