Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
bitkey流DDD活用術 〜なぜDDD?なにを活かしてどこを壊すのか〜
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
株式会社ビットキー / Bitkey Inc.
PRO
July 20, 2022
Technology
960
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
bitkey流DDD活用術 〜なぜDDD?なにを活かしてどこを壊すのか〜
株式会社ビットキー / Bitkey Inc.
PRO
July 20, 2022
More Decks by 株式会社ビットキー / Bitkey Inc.
See All by 株式会社ビットキー / Bitkey Inc.
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
80
iOS/Androidの二刀流エンジニアがFlutter & TypeScriptへ越境後の現在地 - Flutterがメインになって見えた景色と現在の醍醐味 / Dual-Platform Mobile Engineer Shifts to Flutter & TypeScript - The View and Real Thrill of Going Flutter-First
bitkey
PRO
0
150
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
350
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
480
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
280
人が担う「価値」とは?これからの「QA」とは / Human Value and the Future of Quality Assurance
bitkey
PRO
0
280
キャリア25年目にしてTypeScript に出会うまで - 「型」を通じて振り返るプログラミング言語遍歴 / Meeting TypeScript After 25 Years in Tech - Looking Back at My Programming Language Journey Through "Types"
bitkey
PRO
2
470
AIのために、AIを使った、Effect-TSからの脱却 〜テストを活用した安全なリファクタリングの進め方〜
bitkey
PRO
2
940
Flutter初心者が生成AIで大規模アプリ開発をキャッチアップした工夫 〜元ネイティブエンジニアが実践した、技術転換の高速道路〜 / Flutter with LLM: A Former Native Engineer's Fast Track to Large-Scale Apps
bitkey
PRO
0
320
Other Decks in Technology
See All in Technology
AIQAのナレッジ構築について
qatonchan
1
130
新しい SLO が良い感じにハマっている話
z63d
1
1.2k
QAタスクをスキル化したいときに考えること
aomoriringo
0
130
StepFunctionsとGraphRAGを活用した暗黙知活用のためのRAG基盤
yakumo
0
190
運用を犠牲にせずコストを制御し事業成長を支える B2B SaaS ID管理基盤におけるS3 Tableのログストレージ活用
kaminashi
1
120
CloudWatchから始めるAWS監視
butadora
0
300
コンポーネント名には何を含めるべきなのか? / what-should-be-included-in-component-names
airrnot1106
0
200
MCPをつなげて作る組織横断のAIエージェント基盤
tsubakimoto_s
0
430
PLaMo 3.0 Primeの構造化出力サポート
pfn
PRO
0
140
plamo-3-translateの開発
pfn
PRO
0
220
AIエージェントの知識表現と推論に なぜグラフが使われるのか - 記号的AIの復権とニューラルAIとの統合
yohei1126
1
230
テックカンファレンス三大ステークホルダーの文化人類学 ─ 違いを認め合う関係性作り
bash0c7
5
1.3k
Featured
See All Featured
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
450
The Spectacular Lies of Maps
axbom
PRO
1
880
Building Adaptive Systems
keathley
44
3.1k
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
72
41k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
The Curious Case for Waylosing
cassininazir
1
440
Navigating Weather and Climate Data
rabernat
0
430
The Cult of Friendly URLs
andyhume
79
7k
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
How GitHub (no longer) Works
holman
316
150k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
Ruling the World: When Life Gets Gamed
codingconduct
0
290
Transcript
ϏοτΩʔྲྀDDD׆༻ज़ ʙͳͥ%%% ͳʹΛ׆͔ͯ͠Ͳ͜Λյ͢ͷ͔ʙ
ࠤ౻ ਓ Sato Takuto 2015.04 2019.05 2020.01 େֶ(ݐஙֶઐ߈)ଔۀޙɺ גࣜձࣾϫʔΫεΞϓϦέʔγϣϯζʹೖࣾ ձܭγεςϜͷιϑτΣΞ։ൃΛ୲
ಛʹࡒձܭͷ༁ؔ࿈ ϏοτΩʔࢀը ECαΠτͷ։ൃ / อकɺࣾγεςϜͷ։ൃ TaKuTyͷ։ൃ ࠓͷHomeͷલͱͳΔResidenceνʔϜʹଐ bitlockΛѻ͏ཧը໘όοΫΤϯυɺappͷ։ൃ ʹैࣄ 2022.07 HomeϓϩμΫτͷٕज़ऀ ෳࡶͳࣄΛಡΈղ͍ͯߏԽ͠ɺநԽ / ൚༻Խ Ͱ͖ΔΑ͏ʹઃܭ͠ɺίετͰଟ͘ͷՁΛͩͤ Δ։ൃΛ͢Δ͜ͱΛΉ
1. ͡Ίʹ twitter ͡Ί·ͨ͠ʂ ϑΥϩʔ͓ئ͍͠·͢ʂ @takuuuuuuu777 ϑΥϩʔ͍ͨ͠ͱࢥͬͯΒ͑ΔΑ͏ͳ ൃදΛ͠·͢....ʂʂ 3 3
1. ͡Ίʹ ͢༰ DDDΛಋೖͨ͠ ϏοτΩʔ(HomeࣄۀྖҬ)ͰͷӦΈʹ͍ͭͯ త DDDಋೖͷϓϩηεͱͷڞ༗ ࠓޙಋೖ࣌ͷࢀߟ / ಋೖޙͷվળͷࢀߟ
4 4
1. ͡Ίʹ 5 5 λʔήοτ ɾDDDͬͯΦΠγΠϊʁ ɾDDDಋೖ͍͚ͨ͠ͲͲ͏͢ΕΑ͍...ʁ ɾDDDಋೖͯ͠Έ͚ͨͲ্ख͍͔͘ͳ͍ ɾDDDಋೖࡁΈͰͬͱચ࿅͍ͤͨ͞ ɾଞࣾͷӡ༻ํ๏ؾʹͳΔ
Outline 1. ͡Ίʹ 2. ;Ή;Ή 3. ͦͦ 4. ͯͯ͞͞ 5.
͙͙ 6. ͠Ί 6 6
Outline 1. ͡Ίʹ 2. ;Ή;Ή (ͳΔ΄ͲͶ) 3. ͦͦ (ͳʹ͍ͨ͠Μ͚ͩͬ) 4.
ͯͯ͞͞ (Ͳ͏͠Α͏͔) 5. ͙͙ (͓͍͍͠ͷ) 6. ͠Ί 7 7
;Ή;Ήɻ 8 8
1. ;Ή;Ή DDDͱฉ͍ͯɺͳʹΛࢥ͍·͔͢ʁ 9 9 ಥવͰ͕͢...
1. ;Ή;Ή ΤϯςΟςΟɺΦϒδΣΫτ ϞσϦϯάɺυϝΠϯΤΩεύʔτ 10 10 ઃܭࢥɺΞδϟΠϧɺफڭ૪ ͨͿΜ͍Ζ͍Ζ...
1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.01 11 11 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ ϞσϦϯάઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ
= υϝΠϯΤΩεύʔτ વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτຊʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
1. ;Ή;Ή ࢥͬͨ͜ͱ on 2022.04 12 12 ։ൃɺͳΜ͔՝͕͋Δͳ...՝ͳΜͩΖ... Ͳ͏ͨ͠ΒղܾͰ͖ΔΜͩΖ... DDDͷߟ͑ํΛద༻Ͱ͖Δ͔...ʂ
ͦͯ͠ݱࡏ ͳΜͱ͔൘ʹ͍͖ͭͯͨ ͬͱվળ͍ͯ͜͠͏ʂʂ
ͦͯ͠ɺࢥ͏͜ͱ 1. ;Ή;Ή 13 13
ॏཁͳͷ DDDͱͯ͠ Ͳ͏͋Δ͖͔ Ͱͳ͘ 1. खஈͱͯ͠ଥ͔ 2. ՝ΛղܾͰ͖Δ͔ 1. ;Ή;Ή
14 14
1. ;Ή;Ή 1. ଥ͔ʁ ։ൃͷϑΣʔζ / ՝ΛؑΈͯஅ σϝϦοτ্͕ճͬͨΒҙຯແ͠... 2. ղܾͰ͖Δ͔ʁ
ղܾͷखஈʹঢ՚Ͱ͖Δ͔ ఏএ͞Ε͍ͯΔ͜ͱΛͦͷ··࣮ફͯ͠ ՝͕ղܾͰ͖ΔͱݶΒͳ͍... 15 15
1. ;Ή;Ή 1. ଥ͔ʁ ։ൃͷϑΣʔζ / ՝ΛؑΈͯஅ σϝϦοτ্͕ճͬͨΒҙຯແ͠… 2. ղܾͰ͖Δ͔ʁ
ղܾͷखஈʹঢ՚Ͱ͖Δ͔ ఏএ͞Ε͍ͯΔ͜ͱΛͦͷ··࣮ફͯ͠ ՝͕ղܾͰ͖ΔͱݶΒͳ͍... 16 16 ։ൃͷϑΣʔζͱ՝Λ ͪΌΜͱཧղͰ͖ͯΔʁʁ ఏএ༰Λ뱌ͯ͠ ՝ΛͲ͏ͬͨΒղܾͰ͖Δ ͷͩΖ͏͔ʁ
աڈΛৼΓฦͬͯΈΔ 1. ;Ή;Ή 17 17
1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.0 18 18 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ ϞσϦϯάઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ
= υϝΠϯΤΩεύʔτ વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτຊʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.0 19 19 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ ϞσϦϯάઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ
= υϝΠϯΤΩεύʔτ વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτຊʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍... ͜͏ࢥ͍ͬͯΔ࣌Ͱɺͦͦඞཁͳঢ়گͰͳ͍
͜͜ΓํͷɻDDD͔ΒೖΔͱ͍͔͠.... ՝ͱୡ͍ͨ͜͠ͱΛ໌֬ʹͯ͠ྟΊ͍͚Δʂʂ 1. ;Ή;Ή ࢥͬͨ͜ͱ on 2020.0 20 20 ;Ή;Ή...ͳΜ͔ߴঘɻΑ͛͞ɻ
ϞσϦϯάઃܭͷ࣌ʹҰఆͰ͖ͯͦ͏ɻ ։ൃऀ = υϝΠϯΤΩεύʔτ વͰ͠ΐʂ ͪΐͬͱݎ࿚͗ͯ͢ɺॏͦ͏... ϝϦοτຊʹ͋Δ...ʁ ͋Μ·ಋೖΠϝʔδ͕༙͔ͳ͍...
1. ;Ή;Ή ಛʹҎԼ؍ʹ͍͕ͭͯ ຊͷϝΠϯTopic 1. खஈͱͯ͠ଥ͔ ՝ͷೝࣝͱDDDʹظͨ͠ͷ 2. ՝ΛղܾՄೳ͔ ՝ղܾͷͨΊͷߦͬͨ͜ͱ
ͦͷखॱͱ 21 22
ܰྔDDDͱ͔ϘτϜΞοϓDDD ͳͲͷΑ͏ʹ ࣮෦ͷ͕ϝΠϯͰ͢ 1. ;Ή;Ή 22 23
Outline 1. ͡Ίʹ 2. ;Ή;Ή (ͳΔ΄ͲͶ) 3. ͦͦ (ͳʹ͍ͨ͠Μ͚ͩͬ) 4.
ͯͯ͞͞ (Ͳ͏͠Α͏͔) 5. ͙͙ (͓͍͍͠ͷ) 6. ͠Ί 23 24
ͦͦ ͳʹ͍ͨ͠Μ͚ͩͬʁ 24 25
1. ͦͦ ։ൃͷϑΣʔζͱ՝ʹ͍ͭͯ ͦͷͨΊʹ... Ϗδωεͷઆ໌ / ։ൃମ੍ͷঢ়گ ʹ͍ͭͯ 1͘Β͍Ͱͬ͘͟Γ 25
26
Ϗδωε 26 27
27 28 1. ͦͦ
28 29 1. ͦͦ
29 30 1. ͦͦ
30 31 1. ͦͦ
31 32 1. ͦͦ
1. ;Ή;Ή ಛ ରྖҬ͕ͻΖ͍ ྖҬΛΧόʔ(ͭͳ͛Δ)͜ͱͰՁ͕ग़Δ ݶΒΕͨϦιʔεͰԿʹޮతͳ։ൃ͢Δ͔ 1ͭͷ։ൃͰଟ͘ͷՁ͕ग़ͤΔ։ൃΛॏࢹ 32 33
33 34 1. ͦͦ
։ൃ 34 35
νʔϜߏ - ࣾһ4-5ਓ + ۀҕୗ ։ൃϓϩηε - εΫϥϜ։ൃͰɺ1िؒεϓϦϯτ - ϑϩϯτ
× όοΫΤϯυ݉ۀΛਪ - openapiͰAPIͷIFఆ͔ٛͯ͠Β࣮ ٕज़ - React × Typescriptɺnode.js × Typescript - ڥGCPɺDBfirestore͕΄΅΄΅ 35 36 ͍͠ϙΠϯτ - ྖҬ͕͍ɺػೳଟذʹΘͨΔ (ݖݶͷཧ / ΧΪͷཧ / ೖୀډཧ / ܝࣔ൘ / ථ...) - ڞ௨Խͷਪਐ -> நԽ͞ΕͨσʔλϩδοΫ 1. ͦͦ ιʔεن - ςʔϒϧɿ400ఔ - APIɿ500ʙ1000ఔ - ιʔεɿ100ສߦఔ
։ൃಛੑ 36 37 1. ͦͦ ɾՁఏڙͷରͱͳΔࣄۀྖҬ͕ඇৗʹ͍ ɹΧΪ / ݟ༧ /
ཧࣄ૯ձ / إೝূ / ୡαʔϏε࿈ܞ ...ͳͲ ɹநԽ൚༻Խ͞Εͨػೳ͕͍ΖΜͳจ຺Ͱར༻͞ΕΔ ɾநԽ & ൚༻ԽΛੵۃతʹ࣮ࢪ ɹ(֓೦తͳཁૉ͕ڧ͘ͳΓɺೝࣝ૬ҧ͕ੜ·ΕΔϦεΫ͋Γ) ϓϩμΫτ / ػೳ ͕૿͑ɺ։ൃʹؔΘΔਓ૿Ճ → શମΛѲ͠ͳ͕Β։ൃΛ͢Δ͜ͱ͕ඇৗʹࠔͳঢ়ଶʹ...
37 38 1. ͦͦ 1ͭͷαʔϏε͕ෳͷจ຺Ͱར ༻͞ΕΔͱɺαʔϏεʹݸผ ͷॲཧΛ͕࣋ͪͪ... 1ͭͷαʔϏε͕ෳͷจ຺Ͱར ༻͞ΕΔͱɺαʔϏεʹݸผͷ ॲཧΛ͕࣋ͪͪ...
༧Λڞ௨Խ͢Δࡍʹൃੜ͑͠Δ
ྫ1 ༧ͷσʔλʹҎԼͷϑΟʔϧυ͕͋Δ ɾॏෳ༧Մ൱: boolean (ඞਢ߲) ɾॏෳ༧Մೳ: number (ҙ߲) ॏෳ༧Մ൱͕trueͷ߹ʹɺॏෳ༧Մೳ͕ະࢦఆͷ߹ͷऔΓѻ͍ํ ॏෳ༧Մೳ͕ෛͷͩͬͨ߹ͷऔΓѻ͍ํ
Ͱॲཧͷ݁Ռ͕ࠩҟ͕ग़ΔՄೳੑ͕͋Δ ݟ༧Ͱॏෳ༧Մ൱͕trueͰॏෳ༧͕ະࢦఆͷ߹ʹ੍ݶ͔͚ͳ͍ ձٞࣨ༧Ͱॏෳ༧Մ൱͕trueͰॏෳ༧͕-1ͷ߹ʹձٞࣨͰࢦఆ͞Ε͍ͯΔσ ϑΥϧτͷ੍ݶͰѻ͏ ͱ͔... 38 39 1. ͦͦ
ྫ2 ݟ༧ͷొʹҎԼͷϧʔϧ͕͋ͬͨ ɾೖډத༧ෆՄɻୀڈ༧ఆͷཌʹೖډத->ۭࣨͱͳΔ ՃͰҎԼͷϧʔϧ͕ద༻ͱͳͬͨ ɾୀڈ༧ఆୀڈ༧ఆ࣌Ҏ߱ͳΒಛผʹݟ͕ՄೳͱͳΔ ୀڈޙͷ࿈བྷઌͷߋ৽ॲཧͰߋ৽͢Δ͕ൃੜ ݟ༧ͷొ/มߋؔ࿈ͰՃཁૉͷߟྀ͕͞Ε͍͕ͯͨɺ ೖୀډͷߋ৽ॲཧͰ্هϧʔϧ͕ߟྀ͞Ε͓ͯΒͣߋ৽Ͱ͖ͳ͍͕ൃੜ ୀڈ༧ఆࣗମͷมߋͳ͍ͷͷɺՃཁૉ͕ߟྀ͞Ε͍ͯͳ͍νΣοΫॲཧ͕࠶࣮ࢪ͞ ΕɺΤϥʔఆ
39 40 1. ͦͦ
40 ՝ - ଞػೳͰෆ߹ͱͳΔσʔλΛ࡞Δ࣮͕Մೳ - ӨڹൣғͷѲࠔͰɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍ - ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλεѲ͕ࠔ
(σʔλભҠ) - σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ (ػೳ × σʔλͷؔ࿈) - validationͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม… - ొͷೝࣝͷํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍… - Ͳ͜ʹͲͷΑ͏ͳ࣮͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ - serviceˠserviceˠ...→serviceˠ update & commit 41 1. ͦͦ
41 ՝ - ଞػೳͰෆ߹ͱͳΔσʔλΛ࡞Δ࣮͕Մೳ - ӨڹൣғͷѲࠔͰɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍ - ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλεѲ͕ࠔ
(σʔλભҠ) - σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ (ػೳ × σʔλͷؔ࿈) - validationͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม… - ొͷೝࣝͷํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍… - Ͳ͜ʹͲͷΑ͏ͳ࣮͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ - serviceˠserviceˠ...→serviceˠ update & commit 42 1. ͦͦ
1. ݎ࿚ੑ ར༻͢Δଆͷ࣮ͷํʹΑΒͣɺϧʔϧ͕ݫक͞ΕΔ 2. ࣝͷू ར༻ՕॴͷιʔεΛղಡ͢Δ͜ͱͳ͘ɺڍಈͷѲ͕Մೳ 42 43 1. ͯͯ͞͞
՝·ͱΊ
࣮ࡍͷιʔεΛݟͳ͕Β ՝Λ֬ೝͯ͠ΈΔ 43 44 1. ͦͦ ࣌ؒͳ͍ͷͰ͜͜ͰׂѪ ผ్Qiitaʹهࡌ͍ͯ͠·͢ʂ ※ ࢲͷtwitterϦϯΫ͔ΒඈΜͰ͍͚ͨͩ·͢ʂ
44 45 1. ͦͦ Πϝʔδ Qiita Qiitaʹهࡌͷαϯϓϧ
ͯͯ͞͞ Ͳʔ͢Δʁ 45 46
దʹ࣮͞Ε͍ͯΕOK ͬͯͰ͋Δɻ SOLIDݪଇͱ͔ ୯Ұͱ͔ ୯Ұͱ͔ ୯Ұͱ͔ ... 46 47 1.
ͯͯ͞͞ લఏͱͯ͠...
ۃSOLIDݪଇΛશһ͕ ߴ͍ਫ४Ͱ࣮ݱͰ͖ΕࠔΒͳ͍ Ͱͦ͏͍͔ͳ͍... Έͱͯ͠ղܾ͢Δඞཁ͕͋Δ ɾݎ࿚ʹ͖͢෦ ɾखΕΛॏࢹ͍ͨ͠෦ ΛͰ͖Δͱͳ͓ྑ͍ 47 48 1.
ͯͯ͞͞
ϚΠΫϩαʔϏεԽͱ͔͋Δ ࣄલʹ໌֬ʹڥքΛҾ͘ඞཁ͋Γ ޙ͔Βमਖ਼͕ޮ͔ͤͮΒ͍ ߹ʹΑͬͯ։ൃ્ཁҼͱͳΓ͑Δ ܾࡁ / ೝূج൫ͱ͔Λ໌֬ԽͰ͖ΔྖҬ ϚΠΫϩαʔϏεԽࡁΈ 48 49
1. ͯͯ͞͞
DDD υϝΠϯΦϒδΣΫτʹண 49 50 1. ͯͯ͞͞ ݁Ռͱͯ͠...
υϝΠϯΤΩεύʔτ ϢϏΩλεݴޠͰձ͕Ͱ͖Δͱ͔ ϞσϧΛܧଓతʹ͍ͤͯ͘͞ͱ͔... ࣍ͷεςοϓͰ 1. ݎ࿚ɺ2. ࣝͷू ͕·ͣओత 50 51
1. ͯͯ͞͞ DDDͱ͍ͬͯ... ↑͜ΕॏཁͰ͕͢ओͨΔ՝Ͱͳ͍ͷͰɺ࠷ॳߟ͑ͳ͍ ɹ࠷ॳ͔Β͋Ε͜Εͩͱࠞཚͯ͠͠·͏ͷͰ...
ͰɺͲ͏ͨ͠ͷʁ 0ϕʔεͰ࡞Γ͠ʁ 51 52 1. ͯͯ͞͞
طଘͷߏΛ׆͔͠ͳ͕Β࣮ 52 53 1. ͯͯ͞͞
طଘͷߏΛ׆͔͠ͳ͕Β࣮ 53 54 1. ͯͯ͞͞ ࣮ࡍʹͳʹΛͨ͠ͷ͔ʁ
طଘ࣮ ϨΠϠʔυߏ 54 55 1. ͯͯ͞͞ DB(firestore)ͷґଘେ serviceϨΠϠͰґଘ࣮ͨ͠༰ service ->
service -> service … Έ͍ͨͳߏ..͚ͬ͜͏͋Δ DBͷܕใ υΩϡϝϯτύεͷఆٛ (table໊+primaryKeyΈ͍ͨͳͷ)
·ͣɺͱΓ͋͑ͣɺ DAOͷฦ٫ΛΫϥεͰฦ٫ ͦ͜ʹϝιουΛੜ͢ ߋ৽Ϋϥεड͚औͬͯߋ৽͢Δ 55 56 1. ͯͯ͞͞ طଘͷॲཧͦͷ··ɺ ৽ͨʹͭ͘Δ෦Λ
·ͣΫϥε࣮ͬͯͯ͠ΈΔ ͬͯͱ͜Ζ͔Β࢝ΊΔ
56 57 1. ͯͯ͞͞
57 58 1. ͯͯ͞͞ before after
Is this DDD ... ? (͜Ε͕DDDʁ) ͬͯ͋Δ͕ɺ͜Ε͚ͩͰղܾͰ͖Δ͋Δ ҎԼͷج൫͕Ͱ͖Δ ɾΫϥεͷϧʔϧΛఆٛͰ͖Δ ɾৼΔ͍ΛఆٛͰ͖Δ
58 59 1. ͯͯ͞͞
59 60 1. ͯͯ͞͞ ؆୯ʹՃͰ͖Δ͜ͱ ɾॳظԽঢ়ଶͷ໌ࣔ ɾόϦσʔγϣϯͷ໌ࣔ ɾৼΔ͍ΛఆٛͰ͖Δ ɾϞσϧͷ߹ੑΛ୲อͰ͖Δ ͜͜·ͰͰҙຯ͋Δʂ
͞ΒʹͲ͏ղܾ/վળ͍͔ͯ͘͠ ՝ / ղܾ͍ͨ͠ϙΠϯτ ʹԠ֦ͯ͡ு͍͚ͯ͠OKʂ
ͬͨ͜ͱ ɾEntityΛ·ͣ ɾRepositoryͰ·͠ʹ ɾ࣍ʹValueObject ɾϞσϧؒ߹ੑ୲อͷͨΊͷू ɾݎ࿚ੑڧԽͷͨΊͷFirstCollection ɾ͞ΒͳΔࣝͷूʹDomainService ɾརศੑͷͨΊͷCQR ɾൈ͚݀ݮΒͨ͢ΊʹσΟϨΫτϦ࠶ߟ ɾૄ݁߹ଅਐʹDomainEvent͋Γ
60 61 1. ͯͯ͞͞
ͬͨ͜ͱ ɾEntityΛ·ͣ ɾRepositoryͰ·͠ʹ ɾ࣍ʹValueObject ɾϞσϧؒ߹ੑ୲อͷͨΊͷू ɾݎ࿚ੑڧԽͷͨΊͷFirstCollection ɾ͞ΒͳΔࣝͷूʹDomainService ɾརศੑͷͨΊͷCQR ɾൈ͚݀ݮΒͨ͢ΊʹσΟϨΫτϦ࠶ߟ ɾૄ݁߹ଅਐʹDomainEvent͋Γ
61 62 1. ͯͯ͞͞
Repository 62 63 1. ͯͯ͞͞ UsecaseϨΠϠͰ Entity㱻Objectͷม ͍ͯ͠Δ͔Β ݎ࿚ੑ͍ EntityͰنఆ͍ͯ͠Δ
੍ޚʹج͍ͮͯ σʔλ͕ొ ͞ΕΔ͔ະఆ
63 64 1. ͯͯ͞͞ Repository
64 65 1. ͯͯ͞͞ Repository
65 66 1. ͯͯ͞͞ ValueObject (ݎ࿚ԽͷڧԽ) validationΛ໌ࣔͰ͖Δ ৼΔ͍ΛఆٛͰ͖Δ
͙͙ ͓͍͍͠ʂʁ 66 67
ͬͯΈͯྑ͔ͬͨʂ ॳݟࠐʹൺ͢ΜͳΓಋೖͰ͖ͨʂ 67 68 1. ͙͙
ɾϧʔϧ͕ݫ֨ʹͳΔ & ू͞ΕΔ ɾʮૢ࡞ʯʮߋ৽ʯ͕͞Ε໌ࣔతʹͳΔ ɾϞσϧͷʮৼΔ͍ʯʹҙ͕͘Α͏ʹͳΔ ɾusecase͕࣮͍͢͠εοΩϦ͢Δ 68 69 1. ͙͙
ྑ͔ͬͨ͜ͱ
ɾؔͷύϥϝʔλ͕౷Ұ͞Ε͖ͬ͢Γͨ͠ ɾอଘલͷใΛEntityʹ࣋ͨͤΔ͜ͱͰɺ ɹrepositoryͷॲཧ͕εοΩϦͨ͠ ɾӨڹൣғ͕ΑΓ໌֬ʹͳͬͨ 69 70 1. ͙͙ ྑ͔ͬͨ͜ͱ (෭࣍తޮՌ)
70 71 1. ͙͙ ޮՌߴ͔ͬͨ͜ͱ ɾValueObject ϑΥʔϚοτϧʔϧΛΑΓ໌֬ʹͰ͖Δ ɾDomainService ϞσϧؒͷϧʔϧΛෑ͘͜ͱ͕Ͱ͖Δ ɾσΟϨΫτϦཧ
ϧʔϧΛపఈ͢ΔͨΊʹඞཁ
ɾطଘϑΝΠϧͷߏͱͷซ༻ ɾஈ֊తಋೖ ɾݎ࿚ԽͷͨΊͷpackageߏ ɾιʔεهࡌྔΛΒͨ͢Ίͷ ɾมߋલޙͷใΛͨͤΔΑ͏ʹ ɾtransactionͷཧ 71 72 1. ͙͙
ɾloggerɺdeep cloneɺ ɾreadOnly ɾvalueObjectͷdefault checker ɾtypeUtils ɾtoFirestoreͷconverter ɾlooseEntityͰgetterͷσϑΥ࣮ ɾDIपΓ
ɾͰ࣮ྔ͕ଟ͘ͳΔɻվળͷ༨͋Γɻ ɾΔ/ΒΛ໌֬ʹ͠ͳ͍ͱ͙͢ΧΦεʹͳΔ ɾΓͳ͕Βߋ৽͢Δ͕සൟʹൃੜ͢Δ ɾϞσϧ࡞ΓࠐΈ -> ࣮ίεύΑ͘ͳ͔ͬͨ... ɾνʔϜͷల։͙͢ʹͰ͖ͳ͍ 72 73 1.
͙͙ େมͩͬͨ͜ͱ
ɾ࣮લͷϞσϦϯά ɾڥք͚ͮΒΕͨίϯςΩετ ɾू୯ҐͰͷΈͷߋ৽ 73 74 1. ͙͙ Βͳ͔ͬͨ͜ͱ
͠Ί 74 75
ॏཁͳͷ DDDͱͯ͠ Ͳ͏͋Δ͖͔ Ͱͳ͘ 1. खஈͱͯ͠ଥ͔ 2. ՝ΛղܾͰ͖Δ͔ 1. ;Ή;Ή
75 76
Ή͠Ζɺ࠷ॳ͔ΒϞσϧԽ͍͠...ʂʂʂʂ ΧϓηϧԽΛਪ͠ਐΊ͍͔ͨΒɺϞσϦϯάͷॏཁੑ͕ਁಁͯ͠ υϝΠϯۦಈͷϞσϦϯάʹྗ͕͗͜·Ε͍ͯ͘ ͬͯϕΫτϧ͕ࣗવͳؾ͕͢Δ... 76 77 1. ͠Ί
DDDΛऔΓೖΕͯɺ؆୯ʹղܾ͢ΔͷͰͳ͍ɻ ୯७ʹઃܭ͕ॏཁʂʂʂʂʂʂ Έͷ͋Δ࣮͕ͮ͠Β͍ ઃܭΛ্͢Δ͜ͱΛิॿͯ͘͠ΕΔ 77 78 1. ͠Ί
ࠓޙ • ϞσϧΛνʔϜ/৫Ͱৢ͍ͯ͘͠Έͮ͘Γ • ValueObjectͷීٴ (ͷཧͷํʹϧʔϧ͕༗Δͭ) • υϝΠϯΠϕϯτͷಋೖ • ࣮ྔͷݮ
• DomainModel ← infractructure ͷιʔε࣮ྔݮ • ࢀর༻σʔλͱͷ࿈ܞڧԽ • τϥϯβΫγϣϯཧͷཧ • ྖҬͷΓํͷྑ͍ํ๏ͷࡧ 78 79 1. ͠Ί
Ͳ͔͜ͰͤΔͱ͍͍ͳͱࢥ͏͜ͱ • Ϗδωεͷ • நԽ / ߏԽ / ൚༻ԽΛࢦ͢։ൃͷ •
՝ͷৄࡉ / ࣮ྫɺͱղܾํ๏ • ҎԼཁૉͷ͍ํৄࡉ / ࣮ྫ ◦ ValueObject / Entity / DomainService / DomainEvent • ϞσϦϯάͷํ ͱ ࣮ྫ • σʔλߋ৽࣌ͷτϥϯβΫγϣϯཧͷํͱৄࡉ • ॏෳνΣοΫͷػߏͷ࣮ݱͷํ࣮ྫ (DomainService) • ΧϓηϧԽͷ࣮ݱ߹ɺgetter, setterͱ͔Ͳ͏࣮ݱͯ͠Δ͔ • ίετෛՙͱͷ͖߹͍ํ • σΟϨΫτϦߏ • ͓ͷ͓ͷಉ͡ࣄʹ͍ͭͯϞσϦϯάͯ͠ɺσΟϕʔτͷ࣮ԋ 79 80 1. ͠Ί
ͬͯΈͯΘ͔Δ͜ͱ͕ଟ͍ ࠓճͷΑ͏ʹٞͰ͖Δوॏʂʂ 80 81 1. ͠Ί
͓·͚ 81 82
1. ͡Ίʹ twitter ͡Ίͯ·͢ʂ ϑΥϩʔ͓ئ͍͠·͢ʂ @takuuuuuuu777 ϑΥϩʔ͍ͨ͠ͱࢥͬͯΒ͑ΔΑ͏ͳ ൃදͰ͖ͯͨΒ͍͍ͳ... 82 83
1. ͓·͚ Meety ࡞͠·ͨ͠ʂ ʮDDDʯʹ͍ͭͯ ͬͱޠΒ͍͍ͨΑʂ ͬͱৄ͍͍ͨ͠͠/ฉ͖͍ͨΑʂ ͬͯํͥͻʂ ※ ࢲͷtwitterͷݻπΠʹهࡌͯ͠·͢
83 84
84
Appendix 85 86 • DomainModel ← infractructure ͷ ιʔε࣮ྔݮ
Domain Object ͷશମ૾ 86 87 1. Appendix
Entity / ValueObject 87 88 1. Appendix
AbstractDomainObject 88 89 1. Appendix
AbstractLooseEntity 89 90 1. Appendix
AbstractValueObject 90 91 1. Appendix
DIͷ࣮ݱํ๏ 91 92 1. Appendix
DIͷ࣮ݱํ๏ 92 93 1. Appendix
Queue Smaple 93 94 1. Appendix
Queue Smaple આ໌ 94 95 1. Appendix ▪ Queue ɾQueue
Λཧ͢ΔͨΊͷσʔλ ɾॲཧத͔൱͔ɺॲཧ͍ͯ͠Δ task ͕ͳʹ͔ͳͲΛཧ͢Δ ▪ QueueTask ɾQueue ʹੵ·ΕͨλεΫ ɾॲཧதͱͳΔλΠϛϯάͰআ͞Εɺॲཧʹࣦഊ͠ϦτϥΠରͱͳͬͨλΠϛϯάͰ࠶ੜ͞ΕΔ ɾجຊతʹ enqueue ͞Εͨ࣌ॱʹλεΫΛ࣮ߦ͢Δ ɾ༏ઌ͕ࢦఆ͞Εͯݴ͏߹ʹ༏ઌ͕ߴ͍ॱʹ࣮ߦ͢Δ ▪ QueueTaskResult ɾQueue ͷ࣮ߦ݁ՌΛཧ͢ΔͨΊͷσʔλ ɾॲཧࣦഊͯ͠ϦτϥΠ͢Δ߹ͳͲɺϦτϥΠ͝ͱʹ݁ՌσʔλΛੜ͢Δ ɾTaskEntry ʹ࠷ऴతͳ݁ՌͷΈ֨ೲ͢Δ ▪ QueueEntry ɾQueue λεΫΛཧ͢Δݩσʔλ ɾλεΫੜ࣌ʹຊσʔλ͕ੜ͞ΕΔ ɾλεΫ࣮ߦʹඞཁͳใͱɺ࠷ݶͷεςʔλεͷཧΛߦ͏ ɾ࣮ࡍʹ Queue ্ͷσʔλભҠΛཧ͢Δσʔλผ ▪ QueueEntrySubtask ɾ1 ͭͷ Entry Λ࣮ݱ͢ΔͨΊʹෳͷ Task Λ࣮ߦ͢Δඞཁ͕͋Δ߹ʹ ɹෳͷ Task Λ SubTask ͱͯ͠ཧ͢Δ