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
950
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.
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
430
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
260
人が担う「価値」とは?これからの「QA」とは / Human Value and the Future of Quality Assurance
bitkey
PRO
0
250
キャリア25年目にしてTypeScript に出会うまで - 「型」を通じて振り返るプログラミング言語遍歴 / Meeting TypeScript After 25 Years in Tech - Looking Back at My Programming Language Journey Through "Types"
bitkey
PRO
2
440
AIのために、AIを使った、Effect-TSからの脱却 〜テストを活用した安全なリファクタリングの進め方〜
bitkey
PRO
2
880
Flutter初心者が生成AIで大規模アプリ開発をキャッチアップした工夫 〜元ネイティブエンジニアが実践した、技術転換の高速道路〜 / Flutter with LLM: A Former Native Engineer's Fast Track to Large-Scale Apps
bitkey
PRO
0
310
〜備えあれば憂いなし〜とりあえず障害訓練やろ? デジタル/フィジカル横断プロダクトを24365で維持するための戦略 / Better Safe Than Sorry: Incident Drills for 24/365 Digital-Physical Products
bitkey
PRO
0
160
雑談は、センサーだった
bitkey
PRO
2
550
AIが書いたコードを信じられない問題 〜レビュー負荷を下げるために変えたこと〜 / The AI Code Trust Gap: Reducing the Review Burden
bitkey
PRO
8
1.6k
Other Decks in Technology
See All in Technology
Foxgloveについて 実際にExtensionを開発して公開するまでの話 / About Foxglove: The Story of Developing and Releasing an Extension
ry0_ka
0
150
金融の未来を考える / Thinking About the Future of Finance
ks91
PRO
0
150
はじめてのWDM
miyukichi_ospf
1
120
AI駆動開発におけるQAエンジニアの役割事例 〜AI駆動開発の現場から〜
kobayashiyorimitsu
0
320
AI Driven AI Governance
pict3
0
120
“ID沼入口” - 基本とセキュリティから始める、考え続けるためのID管理技術勉強会 告知&イントロ
ritou
0
410
アカウントが増えてからでは遅い? ~ マルチアカウント統制の勘所 ~
kenichinakamura
0
130
組織における AI-DLC 実践
askul
0
310
AIで政治は変わるのか? — 中高生と考えたAI時代の民主主義(東海高校サタデープログラム)
eitarosuda
0
390
依頼文化をやめる日 EM視点で語るPlatform EngineeringとInclusive SRE / Discussing Platform Engineering and Inclusive SRE from an EM's Perspective
shin1988
3
2.4k
プロダクトだけじゃない、社内プロセスにおける自動化・省力化ノススメ
kakehashi
PRO
1
130
Claude Codeとハーネスについて考えてみる
oikon48
18
8.5k
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
340
58k
Embracing the Ebb and Flow
colly
88
5.1k
Technical Leadership for Architectural Decision Making
baasie
3
430
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
1
370
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
180
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
440
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.1k
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
WCS-LA-2024
lcolladotor
0
670
Building Adaptive Systems
keathley
44
3.1k
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
230
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 ͱͯ͠ཧ͢Δ