Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
bitkey流DDD活用術 〜なぜDDD?なにを活かしてどこを壊すのか〜
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
株式会社ビットキー / Bitkey Inc.
PRO
July 20, 2022
Technology
980
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.
デザイナーとして体験を磨き込むためのエンジニアリング / Engineering as a Designer: Polishing the Experience
bitkey
PRO
0
21
スマートロックを支えるFlutter × ネイティブ連携の実践 / Flutter and Native Integration in Practice: Powering Smart Locks
bitkey
PRO
0
150
関数型ドメインモデリングの理想と現実 / Domain Modeling Made Functional: Ideals vs. Reality
bitkey
PRO
0
100
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
300
Flutter × BLE Centralを自前Pluginで実装する設計パターン - MethodChannel / EventChannelで作る双方向ブリッジの実践 / Building Custom Flutter BLE Central Plugins: Bidirectional Bridging with Method & Event Channels
bitkey
PRO
0
490
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
250
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
690
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
640
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
700
Other Decks in Technology
See All in Technology
Sinatra on PicoRuby ローカルでセルフホスト
bash0c7
0
100
re:Invent2026 事前勉強会 歴史と愉しみ方10分LT編
toshi_atsumi
0
140
IoTとは〜? 数字で見るSORACOM UG【SORACOM UG Explorer 2026】
soracom
PRO
0
190
AI Agent 時代のデータ基盤: ClickHouse で実現する 超高速分析とコスト削減の両立
jozono
0
190
公共システムAdventCalendar2026
toru_kubota
0
250
AI時代のエンジニアの情報発信〜個人の発信を組織の力に変える〜
ryo_kawamata
1
7.4k
今から始めるAWS環境の暗号移行 - ポスト量子時代に備える
sato4mi
0
150
公共分野での生成AI活用
toru_kubota
1
220
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
200
Lint の層を組み直した話
bengo4com
3
310
分析作業をどこまで任せるか自分で決められる AIネイティブBI『Golden Analytics』が 良さげな話 /golden-analytics-is-ai-native-bi
shinyaa31
0
120
Active Directory と Entra ID のむむむな関係
murachiakira
PRO
3
1.6k
Featured
See All Featured
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.4k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.5k
Exploring anti-patterns in Rails
aemeredith
4
560
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
740
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.2k
Automating Front-end Workflow
addyosmani
1370
210k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
4.6k
Claude Code のすすめ
schroneko
67
230k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
970
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
300
Raft: Consensus for Rubyists
vanstee
143
7.9k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.9k
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 ͱͯ͠ཧ͢Δ