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
株式会社ビットキー / 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
330
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
190
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
520
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
480
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
540
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
300
人が担う「価値」とは?これからの「QA」とは / Human Value and the Future of Quality Assurance
bitkey
PRO
0
310
キャリア25年目にしてTypeScript に出会うまで - 「型」を通じて振り返るプログラミング言語遍歴 / Meeting TypeScript After 25 Years in Tech - Looking Back at My Programming Language Journey Through "Types"
bitkey
PRO
2
500
AIのために、AIを使った、Effect-TSからの脱却 〜テストを活用した安全なリファクタリングの進め方〜
bitkey
PRO
2
1k
Other Decks in Technology
See All in Technology
サーバー常駐型の 簡易障害調査AI エージェントを作ってみた話
masayoshi
1
490
Distributed Transactions Under Fire: Building a Zero-Oversell Flash Sale Platform with Amazon Aurora DSQL
yama3133
1
110
AIエージェントを雇う前に決める5つのこと
knishioka
1
100
Bill One 開発エンジニア 紹介資料
sansan33
PRO
7
20k
現場の暗黙知を継承するAIエージェント — 対話から生まれる長期記憶と Skills
atsukish
0
180
PdMをやめて、 "プロダクトビルダー"という 働き方に変えました / PdM to Product Builder
shikichee
2
510
AWSとGitHub Actionsの責任境界と 組織で安全に使用する取り組み
nealle
1
230
:syncing_time:
sksat
3
870
Point Cloud as a Foreign Language for Multi-modal Large Language Model
takmin
0
340
全社に広がるMCPサーバーを、 どう安全に管理するか MCPass開発の舞台裏
mtpooh
3
210
Digitization部 紹介資料
sansan33
PRO
2
7.8k
AI駆動開発をチームに根付かせる - 「1行も書かない」チームがHarnessを育てた1年 -
kenichirokimura
6
3.5k
Featured
See All Featured
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
220
Practical Orchestrator
shlominoach
191
12k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Navigating Weather and Climate Data
rabernat
0
500
Designing for Timeless Needs
cassininazir
1
460
Chasing Engaging Ingredients in Design
codingconduct
0
290
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
300
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.8k
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 ͱͯ͠ཧ͢Δ