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׆༻ज़ ʙͳͥ%%% ͳʹΛ׆͔ͯ͠Ͳ͜Λյ͢ͷ͔ʙ

  2. ࠤ౻ ୓ਓ Sato Takuto 2015.04 2019.05 2020.01 େֶ(ݐஙֶઐ߈)ଔۀޙɺ גࣜձࣾϫʔΫεΞϓϦέʔγϣϯζʹೖࣾ ձܭγεςϜͷιϑτ΢ΣΞ։ൃΛ୲౰

    ಛʹࡒ຿ձܭͷ࢓༁ؔ࿈ ϏοτΩʔ΁ࢀը ECαΠτͷ։ൃ / อकɺࣾ಺γεςϜͷ։ൃ TaKuTyͷ։ൃ ࠓͷHomeͷલ਎ͱͳΔResidenceνʔϜʹ഑ଐ bitlockΛѻ͏؅ཧը໘΍όοΫΤϯυɺappͷ։ൃ ʹैࣄ 2022.07 HomeϓϩμΫτͷٕज़੹೚ऀ ෳࡶͳࣄ৅ΛಡΈղ͍ͯߏ଄Խ͠ɺந৅Խ / ൚༻Խ Ͱ͖ΔΑ͏ʹઃܭ͠ɺ௿ίετͰଟ͘ͷՁ஋Λͩͤ Δ։ൃΛ͢Δ͜ͱΛ޷Ή
  3. 1. ͸͡Ίʹ twitter ͸͡Ί·ͨ͠ʂ ϑΥϩʔ͓ئ͍͠·͢ʂ @takuuuuuuu777 ϑΥϩʔ͍ͨ͠ͱࢥͬͯ΋Β͑ΔΑ͏ͳ ൃදΛ͠·͢....ʂʂ 3 3

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

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

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

    ΋͙΋͙ 6. ͠Ί 6 6
  7. Outline 1. ͸͡Ίʹ 2. ;Ή;Ή (ͳΔ΄ͲͶ) 3. ͦ΋ͦ΋ (ͳʹ͍ͨ͠Μ͚ͩͬ) 4.

    ͯͯ͞͞ (Ͳ͏͠Α͏͔) 5. ΋͙΋͙ (͓͍͍͠ͷ) 6. ͠Ί 7 7
  8. ;Ή;Ήɻ 8 8

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

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

  11. 1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.01 11 11 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ

    = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
  12. 1. ;Ή;Ή ࢥͬͨ͜ͱ on 2022.04 12 12 ։ൃɺͳΜ͔՝୊͕͋Δͳ...՝୊ͳΜͩΖ... Ͳ͏ͨ͠ΒղܾͰ͖ΔΜͩΖ... DDDͷߟ͑ํΛద༻Ͱ͖Δ͔΋...ʂ

    ͦͯ͠ݱࡏ ͳΜͱ͔൘ʹ͍͖ͭͯͨ ΋ͬͱվળ͍ͯ͜͠͏ʂʂ
  13. ͦͯ͠ɺࢥ͏͜ͱ 1. ;Ή;Ή 13 13

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

    14 14
  15. 1. ;Ή;Ή 1. ଥ౰͔ʁ ։ൃͷϑΣʔζ / ՝୊౳ΛؑΈͯ൑அ σϝϦοτ্͕ճͬͨΒҙຯແ͠... 2. ղܾͰ͖Δ͔ʁ

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

    ղܾͷखஈʹঢ՚Ͱ͖Δ͔ ఏএ͞Ε͍ͯΔ͜ͱΛͦͷ··࣮ફͯ͠ ՝୊͕ղܾͰ͖Δͱ͸ݶΒͳ͍... 16 16 ։ൃͷϑΣʔζͱ՝୊Λ ͪΌΜͱཧղͰ͖ͯΔʁʁ ఏএ಺༰Λ뱌ͯ͠ ՝୊ΛͲ͏΍ͬͨΒղܾͰ͖Δ ͷͩΖ͏͔ʁ
  17. աڈΛৼΓฦͬͯΈΔ 1. ;Ή;Ή 17 17

  18. 1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.0 18 18 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ

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

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

    ϞσϦϯά͸ઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ = υϝΠϯΤΩεύʔτ ͸౰વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτ͸ຊ౰ʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
  21. 1. ;Ή;Ή ಛʹҎԼ؍఺ʹ͍͕ͭͯ ຊ೔ͷϝΠϯTopic 1. खஈͱͯ͠ଥ౰͔ ՝୊ͷೝࣝͱDDDʹظ଴ͨ͠΋ͷ 2. ՝୊ΛղܾՄೳ͔ ՝୊ղܾͷͨΊͷߦͬͨ͜ͱ

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

  23. Outline 1. ͸͡Ίʹ 2. ;Ή;Ή (ͳΔ΄ͲͶ) 3. ͦ΋ͦ΋ (ͳʹ͍ͨ͠Μ͚ͩͬ) 4.

    ͯͯ͞͞ (Ͳ͏͠Α͏͔) 5. ΋͙΋͙ (͓͍͍͠ͷ) 6. ͠Ί 23 24
  24. ͦ΋ͦ΋ ͳʹ͍ͨ͠Μ͚ͩͬʁ 24 25

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

    26
  26. Ϗδωε 26 27

  27. 27 28 1. ͦ΋ͦ΋

  28. 28 29 1. ͦ΋ͦ΋

  29. 29 30 1. ͦ΋ͦ΋

  30. 30 31 1. ͦ΋ͦ΋

  31. 31 32 1. ͦ΋ͦ΋

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

  33. 33 34 1. ͦ΋ͦ΋

  34. ։ൃ 34 35

  35. νʔϜߏ੒ - ࣾһ4-5ਓ + ۀ຿ҕୗ ։ൃϓϩηε - εΫϥϜ։ൃͰɺ1िؒεϓϦϯτ - ϑϩϯτ

    × όοΫΤϯυ݉ۀΛਪ঑ - openapiͰAPIͷIFఆ͔ٛͯ͠Β࣮૷ ٕज़ - React × Typescriptɺnode.js × Typescript - ؀ڥ͸GCPɺDB͸firestore͕΄΅΄΅ 35 36 ೉͍͠ϙΠϯτ - ྖҬ͕޿͍ɺػೳ΋ଟذʹΘͨΔ (ݖݶͷ؅ཧ / ΧΪͷ؅ཧ / ೖୀډ؅ཧ / ܝࣔ൘ / ౤ථ...) - ڞ௨Խͷਪਐ -> ந৅Խ͞Εͨσʔλ΍ϩδοΫ 1. ͦ΋ͦ΋ ιʔεن໛ - ςʔϒϧɿ400ఔ౓ - APIɿ500ʙ1000ఔ౓ - ιʔεɿ100ສߦఔ౓
  36. ։ൃಛੑ 36 37 1. ͦ΋ͦ΋ ɾՁ஋ఏڙͷର৅ͱͳΔࣄۀྖҬ͕ඇৗʹ޿͍ ɹΧΪ / ಺ݟ༧໿ /

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

    ༧໿Λڞ௨Խ͢Δࡍʹൃੜ͑͠Δ໰୊
  38. ྫ1 ༧໿ͷσʔλʹ͸ҎԼͷϑΟʔϧυ͕͋Δ ɾॏෳ༧໿Մ൱: boolean (ඞਢ߲໨) ɾॏෳ༧໿Մೳ਺: number (೚ҙ߲໨) ॏෳ༧໿Մ൱͕trueͷ৔߹ʹɺॏෳ༧໿Մೳ਺͕ະࢦఆͷ৔߹ͷऔΓѻ͍ํ ॏෳ༧໿Մೳ਺͕ෛͷ਺ͩͬͨ৔߹ͷऔΓѻ͍ํ

    Ͱॲཧͷ݁Ռ͕ࠩҟ͕ग़ΔՄೳੑ͕͋Δ ಺ݟ༧໿Ͱ͸ॏෳ༧໿Մ൱͕trueͰॏෳ༧໿਺͕ະࢦఆͷ৔߹ʹ͸੍ݶ͔͚ͳ͍ ձٞࣨ༧໿Ͱ͸ॏෳ༧໿Մ൱͕trueͰॏෳ༧໿਺͕-1ͷ৔߹ʹ͸ձٞࣨͰࢦఆ͞Ε͍ͯΔσ ϑΥϧτͷ੍ݶ਺Ͱѻ͏ ͱ͔... 38 39 1. ͦ΋ͦ΋
  39. ྫ2 ಺ݟ༧໿ͷొ࿥ʹ͸ҎԼͷϧʔϧ͕͋ͬͨ ɾೖډத͸༧໿ෆՄɻୀڈ༧ఆ೔ͷཌ೔ʹೖډத->ۭࣨͱͳΔ ௥ՃͰҎԼͷϧʔϧ͕ద༻ͱͳͬͨ ɾୀڈ༧ఆ೔͸ୀڈ༧ఆ೔࣌Ҏ߱ͳΒಛผʹ಺ݟ͕ՄೳͱͳΔ ୀڈޙͷ࿈བྷઌͷߋ৽ॲཧͰߋ৽͢Δ໰୊͕ൃੜ ಺ݟ༧໿ͷొ࿥/มߋؔ࿈Ͱ͸௥Ճཁૉͷߟྀ͕͞Ε͍͕ͯͨɺ ೖୀډͷߋ৽ॲཧͰ্هϧʔϧ͕ߟྀ͞Ε͓ͯΒͣߋ৽Ͱ͖ͳ͍໰୊͕ൃੜ ୀڈ༧ఆ೔ࣗମͷมߋͳ͍΋ͷͷɺ௥Ճཁૉ͕ߟྀ͞Ε͍ͯͳ͍νΣοΫॲཧ͕࠶౓࣮ࢪ͞ ΕɺΤϥʔ൑ఆ

    39 40 1. ͦ΋ͦ΋
  40. 40 ՝୊ - ଞػೳͰෆ੔߹ͱͳΔσʔλΛ࡞Δ࣮૷͕Մೳ - Өڹൣғͷ೺Ѳࠔ೉Ͱɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍ - ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλε೺Ѳ͕ࠔ೉

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

    (σʔλભҠ) - σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ೉ (ػೳ × σʔλͷؔ࿈) - validation౳ͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม… - ొ࿥஋ͷೝࣝͷ࢓ํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍… - Ͳ͜ʹͲͷΑ͏ͳ࣮૷͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ - service૚ˠservice૚ˠ...→service૚ˠ update & commit 42 1. ͦ΋ͦ΋
  42. 1. ݎ࿚ੑ ར༻͢Δଆͷ࣮૷ͷ࢓ํʹΑΒͣɺϧʔϧ͕ݫक͞ΕΔ 2. ஌ࣝͷू໿ ར༻ՕॴͷιʔεΛղಡ͢Δ͜ͱͳ͘ɺڍಈͷ೺Ѳ͕Մೳ 42 43 1. ͯͯ͞͞

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

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

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

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

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

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

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

  50. υϝΠϯΤΩεύʔτ ϢϏΩλεݴޠͰձ࿩͕Ͱ͖Δͱ͔ ϞσϧΛܧଓతʹ੒௕͍ͤͯ͘͞ͱ͔... ͸࣍ͷεςοϓͰ 1. ݎ࿚ɺ2. ஌ࣝͷू໿ ͕·ͣ͸ओ໨త 50 51

    1. ͯͯ͞͞ DDDͱ͍ͬͯ΋... ↑͜Ε΋ॏཁͰ͕͢ओͨΔ՝୊Ͱͳ͍ͷͰɺ࠷ॳ͸ߟ͑ͳ͍ ɹ࠷ॳ͔Β͋Ε΋͜Ε΋ͩͱࠞཚͯ͠͠·͏ͷͰ...
  51. ͰɺͲ͏ͨ͠ͷʁ 0ϕʔεͰ࡞Γ௚͠ʁ 51 52 1. ͯͯ͞͞

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

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

  54. طଘ࣮૷ ϨΠϠʔυߏ଄ 54 55 1. ͯͯ͞͞ DB(firestore)΁ͷґଘ౓େ serviceϨΠϠͰ΋ґଘ࣮ͨ͠૷಺༰ service ->

    service -> service … Έ͍ͨͳߏ଄..͚ͬ͜͏͋Δ DBͷܕ৘ใ υΩϡϝϯτύεͷఆٛ (table໊+primaryKeyΈ͍ͨͳ΋ͷ)
  55. ·ͣ͸ɺͱΓ͋͑ͣɺ DAOͷฦ٫஋ΛΫϥεͰฦ٫ ͦ͜ʹϝιουΛੜ΍͢ ߋ৽΋Ϋϥεड͚औͬͯߋ৽͢Δ 55 56 1. ͯͯ͞͞ طଘͷॲཧ͸ͦͷ··ɺ ৽ͨʹͭ͘Δ෦෼Λ

    ·ͣ͸Ϋϥε࢖࣮ͬͯ૷ͯ͠ΈΔ ͬͯͱ͜Ζ͔Β࢝ΊΔ
  56. 56 57 1. ͯͯ͞͞

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

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

    58 59 1. ͯͯ͞͞
  59. 59 60 1. ͯͯ͞͞ ؆୯ʹ௥ՃͰ͖Δ͜ͱ ɾॳظԽঢ়ଶͷ໌ࣔ ɾόϦσʔγϣϯͷ໌ࣔ ɾৼΔ෣͍ΛఆٛͰ͖Δ ɾϞσϧ಺ͷ੔߹ੑΛ୲อͰ͖Δ ͜͜·ͰͰ΋ҙຯ͸͋Δʂ

    ͞ΒʹͲ͏ղܾ/վળ͍͔ͯ͘͠ ՝୊ / ղܾ͍ͨ͠ϙΠϯτ ʹԠ֦ͯ͡ு͍͚ͯ͠͹OKʂ
  60. ΍ͬͨ͜ͱ ɾEntityΛ·ͣ͸ ɾRepositoryͰ·͠ʹ ɾ࣍ʹValueObject ɾϞσϧؒ੔߹ੑ୲อͷͨΊͷू໿ ɾݎ࿚ੑڧԽͷͨΊͷFirstCollection ɾ͞ΒͳΔ஌ࣝͷू໿ʹ͸DomainService ɾརศੑͷͨΊͷCQR ɾൈ͚݀ݮΒͨ͢ΊʹσΟϨΫτϦ࠶ߟ ɾૄ݁߹ଅਐʹ͸DomainEvent΋͋Γ

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

    61 62 1. ͯͯ͞͞
  62. Repository 62 63 1. ͯͯ͞͞ UsecaseϨΠϠͰ Entity㱻Objectͷม׵ ͍ͯ͠Δ͔Β ݎ࿚ੑ͸௿͍ EntityͰنఆ͍ͯ͠Δ

    ੍ޚʹج͍ͮͯ σʔλ͕ొ࿥ ͞ΕΔ͔ະఆ
  63. 63 64 1. ͯͯ͞͞ Repository

  64. 64 65 1. ͯͯ͞͞ Repository

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

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

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

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

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

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

    ϧʔϧΛపఈ͢ΔͨΊʹඞཁ
  71. ɾطଘϑΝΠϧͷߏ੒ͱͷซ༻ ɾஈ֊తಋೖ ɾݎ࿚ԽͷͨΊͷpackageߏ੒ ɾιʔεهࡌྔΛ΁Βͨ͢Ίͷ࢓૊ ɾมߋલޙͷ৘ใΛ΋ͨͤΔΑ͏ʹ ɾtransactionͷ؅ཧ 71 72 1. ΋͙΋͙

    ޻෉఺ ɾloggerɺdeep cloneɺ ɾreadOnly ɾvalueObjectͷdefault checker ɾtypeUtils ɾtoFirestoreͷconverter ɾlooseEntityͰgetterͷσϑΥ࣮૷ ɾDIपΓ
  72. ɾ৑௕Ͱ࣮૷ྔ͕ଟ͘ͳΔɻվળͷ༨஍͋Γɻ ɾ΍Δ/΍ΒΛ໌֬ʹ͠ͳ͍ͱ͙͢ΧΦεʹͳΔ ɾ΍Γͳ͕Βߋ৽͢Δ͕සൟʹൃੜ͢Δ ɾϞσϧ࡞ΓࠐΈ -> ࣮૷͸ίεύΑ͘ͳ͔ͬͨ... ɾνʔϜ΁ͷల։΋͙͢ʹ͸Ͱ͖ͳ͍ 72 73 1.

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

  74. ͠Ί 74 75

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

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

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

  78. ࠓޙ • ϞσϧΛνʔϜ/૊৫Ͱৢ੒͍ͯ͘͠࢓૊Έͮ͘Γ • ValueObjectͷීٴ (஋ͷ؅ཧͷ࢓ํʹϧʔϧ͕༗Δ΍ͭ) • υϝΠϯΠϕϯτͷಋೖ • ࣮૷ྔͷ௿ݮ

    • DomainModel ← infractructure ͷιʔε࣮૷ྔ௿ݮ • ࢀর༻σʔλͱͷ࿈ܞڧԽ • τϥϯβΫγϣϯ؅ཧͷ؅ཧ • ྖҬͷ੾Γํͷྑ͍ํ๏ͷ໛ࡧ 78 79 1. ͠Ί
  79. Ͳ͔͜Ͱ࿩ͤΔͱ͍͍ͳͱࢥ͏͜ͱ • Ϗδωεͷ࿩ • ந৅Խ / ߏ଄Խ / ൚༻ԽΛ໨ࢦ͢։ൃͷ࿩ •

    ՝୊ͷৄࡉ / ࣮ྫɺͱղܾํ๏ • ҎԼཁૉͷ࢖͍ํৄࡉ / ࣮ྫ ◦ ValueObject / Entity / DomainService / DomainEvent • ϞσϦϯάͷ࢓ํ ͱ ࣮ྫ • σʔλߋ৽࣌ͷτϥϯβΫγϣϯ؅ཧͷ࢓ํͱ޻෉఺ৄࡉ • ॏෳνΣοΫͷػߏͷ࣮ݱͷ࢓ํ࣮ྫ (DomainService) • ΧϓηϧԽͷ࣮ݱ౓߹ɺgetter, setterͱ͔Ͳ͏࣮ݱͯ͠Δ͔ • ίετෛՙͱͷ޲͖߹͍ํ • σΟϨΫτϦߏ੒ • ͓ͷ͓ͷಉ͡ࣄ৅ʹ͍ͭͯϞσϦϯάͯ͠ɺσΟϕʔτͷ࣮ԋ 79 80 1. ͠Ί
  80. ΍ͬͯΈͯΘ͔Δ͜ͱ͕ଟ͍ ࠓճͷΑ͏ʹٞ࿦Ͱ͖Δ৔͸وॏʂʂ 80 81 1. ͠Ί

  81. ͓·͚ 81 82

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

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

    83 84
  84. 84

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

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

  87. Entity / ValueObject 87 88 1. Appendix

  88. AbstractDomainObject 88 89 1. Appendix

  89. AbstractLooseEntity 89 90 1. Appendix

  90. AbstractValueObject 90 91 1. Appendix

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

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

  93. Queue Smaple 93 94 1. Appendix

  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 ͱͯ͠؅ཧ͢Δ