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
株式会社ビットキー / Bitkey Inc.
PRO
July 20, 2022
Technology
970
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.
Flutter × BLE Centralを自前Pluginで実装する設計パターン - MethodChannel / EventChannelで作る双方向ブリッジの実践 / Building Custom Flutter BLE Central Plugins: Bidirectional Bridging with Method & Event Channels
bitkey
PRO
0
460
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
230
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
630
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
560
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
640
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
380
人が担う「価値」とは?これからの「QA」とは / Human Value and the Future of Quality Assurance
bitkey
PRO
0
360
キャリア25年目にしてTypeScript に出会うまで - 「型」を通じて振り返るプログラミング言語遍歴 / Meeting TypeScript After 25 Years in Tech - Looking Back at My Programming Language Journey Through "Types"
bitkey
PRO
2
530
AIのために、AIを使った、Effect-TSからの脱却 〜テストを活用した安全なリファクタリングの進め方〜
bitkey
PRO
2
1.1k
Other Decks in Technology
See All in Technology
全社共通データ基盤をつくる。ソニーのDatabricks活用とデータガバナンス設計の裏側
sony
0
430
React Nativeでの OTA Updateって、 どう説明する?
ichiki1023
0
150
AI駆動開発、viviONの1年 ── うまくいったこと・いかなかったこと
vivion
0
260
AI Made Us Faster at Solving the Wrong Problems
marceloancelmo
0
160
購入ドメインでの課題と取り組み
ykagano
0
140
[2026-09-30]ロックンロールは鳴り止まないっ - 信頼性かまってちゃん - 「データ駆動を投げ捨ててまで。」追いかける信頼性改善に向けた取り組みの話
tosite
0
210
AI時代だからこそ推したい!Gitコマンド再入門
munakata
0
150
インバスケット試験対策アプリを 作って見えたAIエージェント構築 ナレッジ2選
shichijoyuhi
1
130
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
310
[2026 Oracle Technical Deep Dive] Apache Iceberg × Oracle AI Database -Oracle Autonomous AI Lakehouseが実現するAI時代のデータ基盤- (2026年9月17日開催)
oracle4engineer
PRO
0
110
オンラインゲームのシステム全体像 - コロプラ 2026年度 新卒研修
colopl
0
690
自律型 AI をセキュアに実装!Gemini と MIG で作る動的コード実行環境
recruitengineers
PRO
1
210
Featured
See All Featured
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
350
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
460
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
320
We Have a Design System, Now What?
morganepeng
55
8.4k
Designing for Performance
lara
611
70k
AI: The stuff that nobody shows you
jnunemaker
PRO
10
1.1k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
470
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
1
400
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
420
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 ͱͯ͠ཧ͢Δ