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
DDD導入して感じた課題(実装コスト) その解決のために行ったこと
Search
株式会社ビットキー / Bitkey Inc.
PRO
September 29, 2022
Technology
200
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
DDD導入して感じた課題(実装コスト) その解決のために行ったこと
株式会社ビットキー / Bitkey Inc.
PRO
September 29, 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
410
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
200
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
550
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
510
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
560
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
320
人が担う「価値」とは?これからの「QA」とは / Human Value and the Future of Quality Assurance
bitkey
PRO
0
350
キャリア25年目にしてTypeScript に出会うまで - 「型」を通じて振り返るプログラミング言語遍歴 / Meeting TypeScript After 25 Years in Tech - Looking Back at My Programming Language Journey Through "Types"
bitkey
PRO
2
510
AIのために、AIを使った、Effect-TSからの脱却 〜テストを活用した安全なリファクタリングの進め方〜
bitkey
PRO
2
1k
Other Decks in Technology
See All in Technology
なぜJMBC(Japan MCP Business Community)? MCPってどう活用できるの?
cdataj
0
110
TinyGo 開発サイクルを高速化する:Go で作るエミュレータ入門
zozotech
PRO
1
670
GoにおけるFFIのこれまでとこれから
goccy
5
2.6k
AI 駆動 Terraform 開発/SRE_BizReach_MIXI_2
visional_engineering_and_design
5
2.1k
AI時代の「技術的負債」の変質ー概念の終焉と再解釈、エージェントと共に向かう先
nwiizo
0
980
Oracle Cloud Infrastructure IaaS 新機能アップデート 2026/6 - 2026/8
oracle4engineer
PRO
0
190
あるけみー式LTスライド作成術
alchemy1115
1
200
The Agent Builder Loop from Daily Work to OSS
minorun365
PRO
3
150
越境するなら専門用語を使うな高校校歌 / If you wanna cross border, you shouldn't use jargon
vtryo
0
130
Podは生きているのにGoだけが落ちる:GOGCとGOMEMLIMITで追うInvisible OOM Killの謎
tkc66buzz
1
670
Sigmaで作る業務アプリ
kazushiro_honma
0
130
OpenTelemetry eBPF Instrumentationの舞台裏 / Behind the Scenes of OpenTelemetry eBPF Instrumentation
ymotongpoo
4
1.2k
Featured
See All Featured
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.6k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
590
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
1
1.9k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.1k
Skip the Path - Find Your Career Trail
mkilby
1
230
KATA
mclloyd
PRO
35
15k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
Jess Joyce - The Pitfalls of Following Frameworks
techseoconnect
PRO
1
410
10 Git Anti Patterns You Should be Aware of
lemiorhan
PRO
659
62k
Paper Plane (Part 1)
katiecoart
PRO
1
11k
Speed Design
sergeychernyshev
33
2.1k
Transcript
DDDಋೖͯ͠ײͨ͡՝(࣮ίετ) ͦͷղܾͷͨΊʹߦͬͨ͜ͱ
ࠤ౻ਓ 4BUP5BLVUP େֶ ݐஙֶઐ߈ ଔۀޙɺ גࣜձࣾϫʔΫεΞϓϦέʔγϣϯζʹೖࣾ ձܭγεςϜͷιϑτΣΞ։ൃΛ୲
ಛʹࡒձܭͷ༁ؔ࿈ ϏοτΩʔࢀը &$αΠτͷ։ൃอकɺࣾγεςϜͷ։ൃ 5B,V5Zͷ։ൃ ࠓͷ)PNFͷલͱͳΔ3FTJEFODFνʔϜʹଐ CJUMPDLΛѻ͏ཧը໘όοΫΤϯυɺBQQͷ։ൃ ʹैࣄ )PNFϓϩμΫτ ෳࡶͳࣄΛಡΈղ͍ͯߏԽ͠ɺநԽ൚༻Խ Ͱ͖ΔΑ͏ʹઃܭ͠ɺίετͰଟ͘ͷՁΛͩͤ Δ։ൃΛ͢Δ͜ͱΛΉ
1. ͡Ίʹ ͢༰ DDDΛಋೖͯ͠Έͯײͨ͡՝(࣮ίετ) ͷରԠํ๏ͱߟ͑ͨ͜ͱ
͡Ίʹ
͡Ίʹ
͡Ίʹ
͡Ίʹ ಛ ରྖҬ͕ͻΖ͍ ྖҬΛΧόʔ(ͭͳ͛Δ)͜ͱͰՁ͕ग़Δ ݶΒΕͨϦιʔεͰԿʹޮతͳ։ൃ͢Δ͔ 1ͭͷ։ൃͰଟ͘ͷՁ͕ग़ͤΔ։ൃΛॏࢹ
͡Ίʹ ଟ͘ͷػೳΛരͰ։ൃͨ݁͠Ռ...
՝ - ଞػೳͰෆ߹ͱͳΔσʔλΛ࡞Δ࣮͕Մೳ - ӨڹൣғͷѲࠔͰɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍ - ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλεѲ͕ࠔ
(σʔλભҠ) - σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ (ػೳ × σʔλͷؔ࿈) - validationͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม… - ొͷೝࣝͷํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍… - Ͳ͜ʹͲͷΑ͏ͳ࣮͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ - serviceˠserviceˠ...→serviceˠ update & commit ͡Ίʹ
1. ݎ࿚ੑ ར༻͢Δଆͷ࣮ͷํʹΑΒͣɺϧʔϧ͕ݫक͞ΕΔ 1. ࣝͷू ར༻ՕॴͷιʔεΛղಡ͢Δ͜ͱͳ͘ɺڍಈͷѲ͕Մೳ ͡Ίʹ ՝ղܾͷϙΠϯτ
1. ݎ࿚ੑ ར༻͢Δଆͷ࣮ͷํʹΑΒͣɺϧʔϧ͕ݫक͞ΕΔ 1. ࣝͷू ར༻ՕॴͷιʔεΛղಡ͢Δ͜ͱͳ͘ɺڍಈͷѲ͕Մೳ ͡Ίʹ ˠ͜ΕΛղܾ͢ΔͨΊʹ%%%ͷΈΛར༻
˞ϘτϜΞοϓͷߟ͑ํ ՝ղܾͷϙΠϯτ
ͬͯΈͯ
ͦͷ݁Ռ ͬͯΈͯ
ͬͯΈͯ ϑΝΠϧ͕૿͑ͯ ͳΜ͔࣮ྔ͕૿͑ͯ...ͭΒ͍
ͬͯΈͯ ྫ ݐͷొͷॲཧ 1ͭͷݐʹෳͷ͕݅ඥͮ͘ ݐ + ݅ Λूͱ͢Δ
ͬͯΈͯ BuildingFirestoreType BuildingFirestoreCollectionPath PropertyFirestoreType PropertyFirestoreCollectionPath RegisterBuildingUsecase σʔλϕʔε(Firestore)ͷఆٛ σʔλऔಘ/ߋ৽ͪΖΜ
όϦσʔγϣϯͷॲཧ σʔλͷՃ
ͬͯΈͯ BuildingFirestoreType BuildingFirestoreCollectionPath PropertyFirestoreType PropertyFirestoreCollectionPath RegisterBuildingUsecase σʔλϕʔε(Firestore)ͷఆٛ (ͦͷ··)
ͬͯΈͯ BuildingFirestoreType BuildingFirestoreCollectionPath PropertyFirestoreType PropertyFirestoreCollectionPath RegisterBuildingUsecase BuildingEntity BuildingRepository
AddressValueObject PropertryFirstCollection PropertyEntity RentChargeValueObject PropertyStatusValueObject CheckDuplicationDomainService υϝΠϯ σʔλϕʔε(Firestore)ͷఆٛ (ͦͷ··)
ͬͯΈͯ BuildingFirestoreType BuildingFirestoreCollectionPath PropertyFirestoreType PropertyFirestoreCollectionPath RegisterBuildingUsecase BuildingEntity BuildingRepository
AddressValueObject PropertryFirstCollection PropertyEntity RentChargeValueObject PropertyStatusValueObject CheckDuplicationDomainService υϝΠϯ BuildingRepositoryFirestore BuildingFirestoreConverter PropertyFirestoreConverter σʔλϕʔε(Firestore)ͷఆٛ (ͦͷ··) ϞσϧΛIFʹ σʔλϕʔεʹ ΞΫηε͢Δॲཧ
ͬͯΈͯ ৽͘͠EntityΛ࡞ͬͯ...ͬͯͳΔͱ...͜ΕΒΛ࣮͠ͳ͚ΕͳΒ ͳ͍...ɻ ͜Ε͚ͩͰɺ - ؾ࣋ͪͱͯ͠ԯ߷ʹͳΔ - ॳಈ͕͘ͳΔ
…ͷͰɺ͜ΕΛղܾ͍ͨ͠ʂ
ͬͯΈͯ usecaseʹهࡌ͍ͯͨ͠ॲཧΛదʹΓग़͍ͯ͠Δ ͱ͍͏ϝϦοτʂ͕ͩ... ϑΝΠϧͷ૿Ճ ϑΝΠϧׂʹ͏InterfaceͷՃ Ϋϥεͷఆٛʹ͏࣮ྔͷ૿Ճ Ϟσϧͱσʔλͷมॲཧ ͭΒ͍...ɻ
ͬͨ͜ͱ
ͭΒ͍͜ͱ / ղܾ͍ͨ͜͠ͱ ͬͨ͜ͱ
ͭΒ͍͜ͱ / ղܾ͍ͨ͜͠ͱ ͬͨ͜ͱ ػցతͳ࡞ۀ͕ଟ͍... (ଟ͘ײ͡Δ)
ͭΒ͍͜ͱ / ղܾ͍ͨ͜͠ͱ ͬͨ͜ͱ ػցతͳ࡞ۀ͕ଟ͍... (ଟ͘ײ͡Δ) → ػցతͳ෦ࣗಈԽʂ
(πʔϧ࡞ͬͯࣗಈԽͨ͠)
ͬͨ͜ͱ BuildingFirestoreType BuildingFirestoreCollectionPath PropertyFirestoreType PropertyFirestoreCollectionPath RegisterBuildingUsecase BuildingEntity BuildingRepository
AddressValueObject PropertryFirstCollection PropertyEntity RentChargeValueObject PropertyStatusValueObject CheckDuplicationDomainService BuildingRepositoryFirestore BuildingFirestoreConverter PropertyFirestoreConverter ྫ͑... Buildingͷ߹
ͬͨ͜ͱ
ͬͨ͜ͱ ϑΟʔϧυ ಠࣗཁૉ constructorػցతʹܾ·Δ ΠϯελϯεԽ͢ΔͨΊͷϝιου ػցతʹܾ·Δ෦͋Δ͕ ॳظݸผ࣮ σʔλΛݩʹΠϯελϯεԽ͢Δ߹
reconstructϝιουΛհ͢ΔΑ͏ʹ͓ͯ͠Γ ػցతʹܾ·Δ ଞݸผϝιουݸผ࣮
ͬͨ͜ͱ buildingRepository.ts IDΛݩʹऔಘ͢Δϝιου อଘ͢Δϝιου ݪଇඞཁͱͳΔͷͰ ػցతʹ࡞ͬͯ͠·͑Δ ಛఆͷϑΟʔϧυͰͷߜΓࠐΈ
ݸผ࣮͕ඞཁ buildingFirestoreType.ts Entityͱ࣋ͪํม͑ΔͳΒݸผఆ͕ٛඞཁ Entityͱಉ࣋ͪ͡ํ͢ΔͳΒػցతʹܾ·Δ (※EntityͷFirstCollectionআ֎)
ͬͨ͜ͱ Entityͱσʔλͷ࣋ͪํ͕ҟͳΔ ߹ ʹػցతʹߦ͏͜ͱ͍͕͠ Entityͱσʔλͷ࣋ͪํ͕ಉ͡߹ ʹػցతʹܾΊΔ͜ͱ͕Մೳ σʔλΛݩʹEntityʹม͢Δॲཧ Ϟσϧಠࣗͷ࣮Λ͢ΔΘ͚Ͱͳ
͍͕ࡶʹͳΓ͕ͪ.... ϑΟʔϧυΕͯͯɺಛఆͷ͕Ҿ ͖ܧ͕Εͳ͍...ͬͯ͜ͱ...
ͬͨ͜ͱ buildingRepositoryFirestore.ts buildingͱpropertyͷσʔλͷϦϨʔγϣ ϯͷͨͤํΛػցతʹܾΊΒΕΔ Έͱ͓͚ͯ͠ػցతʹܾ·Δ هࡌ͍ͯ͠Δͷpropertyʹbuilding+Idͷ จࣈྻͰbuildingͷIdΛอ࣋͢ΔͱܾΊͨ ߹ͷྫ
BuildingRepositoryΛfirestoreͰ࣮ͨ͠Ϋϥε
ͬͨ͜ͱ - ϑΝΠϧ໊ / Ϋϥε໊ػցతʹܾΊΒΕΔ - EntityRepositoryڞ௨ॲཧΛ·ͱΊΒΕΔ ※ ܧঝͰղܾͰ͖Δ෦͋Δ -
σʔλͷ࣋ͪํ = EntityͷཁૉͱͰ͖ΔͳΒɺ σʔλܕఆٛconvertॲཧػցతʹܾ·Δ
ͬͨ͜ͱ Entityͷཁૉ = σʔλͷ࣋ͪํ Λݫक͢Δඞཁͳ͍ ͕ɺഎܠͱͯ͠ݱঢ়طଘ࣮ͷϦϑΝΫλ + ݎ࿚ੑͷ্Λ༏ઌతʹ ߦ͓ͬͯΓɺ Entityͷཁૉ
= σʔλͷ࣋ͪํ ͱܾΊ࣮ͯਐΊͨͱͯ͠ϝϦοτ ͕͋Γར༻Ͱ͖ΔՕॴʹੵۃతʹ࠾༻
ͬͨ͜ͱ ओͳม - Ϟσϧ໊ (Building) - छผ (Entity / ValueObject
/ FirstCollection …) - ཁૉ (code:string, address: AddressValueObject) → ্ه͕ఆٛ͞Ε͍ͯΕɺޙػցతʹܾΊΒΕͦ͏ ػցతʹܾΊΔͨΊʹඞཁͳཁૉ
ͬͨ͜ͱ ఆٛϑΝΠϧ͔ΒࣗಈͰιʔεΛ ࡞ΔπʔϧΛར༻ʢࣗ࡞ʣ ͳʹΛ͔ͨ͠ͱ͍͏ͱ... ※ݱࡏࢼݧӡ༻த..,
ͬͨ͜ͱ ఆٛϑΝΠϧͷΠϝʔδ ※openapiͷschemaͷϑΥʔϚοτʹଇͬͯهࡌ
ͬͨ͜ͱ ఆٛϑΝΠϧ ʴ npm run gen Ͱ...
ͬͨ͜ͱ
ͬͨ͜ͱ
ͬͨ͜ͱ
ͬͨ͜ͱ
ͬͨ͜ͱ ͜ΕΒ͕ࣗಈͰ࡞͞Εͯ ޙݸผ෦Λద࣮ٓʂ
ͬͨ͜ͱ Ϟσϧͱͷมରͱ͍ͯ͠ΔͷͰɺORMతͳཁૉ͋Γ·͕͢ɺ ҎԼ؍Λॏཁࢹ͍ͯ͠·͢ ɾORMͷཁૉ͋͘·ͰҰ෦ɻݱࡏͷߏʹ͓͍࣮ͯΛָʹ͢Δ ͨΊͷΈɻ ɾશϞσϧͷมॲཧΛࣗಈੜͷΈʹدͤΔඞཁͳ͍ɻಛʹ ORMͷ෦ෳࡶͳදݱ͍͠ͷͰɺݸผ࣮͘͠αϙʔτ తͳཱͪҐஔʹཹΊΔɻ
ͬͨ͜ͱ ৺͕͚ͨ ঢ়گ͝ͱͷ͍͚ ɾΑ͋͘Δγϯϓϧͳύλʔϯۃྗશࣗಈ ɾෳࡶͳύλʔϯྫ֎Ұ෦αϙʔτ ࣗಈԽͷํ ɾॳظςϯϓϨʔτΛ࡞ͯͦ͜͠ʹݸผ࣮ ɾఆٛϑΝΠϧͱৗʹ࿈ಈ
ɾ্هͷΈ߹Θͤ
·ͱΊ
·ͱΊ Ռ ɾDomainModel ͱӬଓԽͷߏ͕ဃ͍ͯ͠ͳ͍߹ʹ ඇৗʹڧྗͰɺΑΓυϝΠϯͷ࣮ʹूதͰ͖Δɻ ※ ͨͩ͠ແཧʹDomainModel ͱӬଓԽͷߏΛ߹ΘͤΔ
ͱຊసͱͳΔͷͰͦͷ߹ʹɺར༻͠ͳ͍ or ςϯϓ Ϩʔτͱͯ͠ੜͨ͠ޙʹݸผमਖ਼͢Δɻ
·ͱΊ ෭࢈ ɾϑΝΠϧσΟϨΫτϦɺΫϥεͷ໋໊نଇ͕పఈͰ͖Δ ɾ࡞ۀલʹͨ͠ߏͷཧ͠ɺͦΕ͕ޮՌతͩͬͨɻॳ ඞཁ͔ͱࢥ͍ͬͯͨϑΝΠϧΫϥεΛഉআͯ͠ΑΓγϯ ϓϧʹͰ͖ͨ
·ͱΊ ࠓޙ ɾӡ༻͢Δ্Ͱ͍ͮΒ͞վળ / ରԠύλʔϯՃ ɾURLਤͳͲͷՄࢹԽରԠ ɾӡ༻ํ๏ͷվળ
Appendix • DomainModel ← infractructure ͷ ιʔε࣮ྔݮ
Domain Object ͷશମ૾ 1. Appendix
Entity / ValueObject 1. Appendix
AbstractDomainObject 1. Appendix
AbstractLooseEntity 1. Appendix
AbstractValueObject 1. Appendix
DIͷ࣮ݱํ๏ 1. Appendix
DIͷ࣮ݱํ๏ 1. Appendix
Queue Smaple 1. Appendix
Queue Smaple આ໌ 1. Appendix ˙2VFVF ɾ2VFVFΛཧ͢ΔͨΊͷσʔλ ɾॲཧத͔൱͔ɺॲཧ͍ͯ͠ΔUBTL͕ͳʹ͔ͳͲΛཧ͢Δ
˙2VFVF5BTL ɾ2VFVFʹੵ·ΕͨλεΫ ɾॲཧதͱͳΔλΠϛϯάͰআ͞Εɺॲཧʹࣦഊ͠ϦτϥΠରͱͳͬͨλΠϛϯάͰ࠶ੜ͞ΕΔ ɾجຊతʹFORVFVF͞Εͨ࣌ॱʹλεΫΛ࣮ߦ͢Δ ɾ༏ઌ͕ࢦఆ͞Εͯݴ͏߹ʹ༏ઌ͕ߴ͍ॱʹ࣮ߦ͢Δ ˙2VFVF5BTL3FTVMU ɾ2VFVFͷ࣮ߦ݁ՌΛཧ͢ΔͨΊͷσʔλ ɾॲཧࣦഊͯ͠ϦτϥΠ͢Δ߹ͳͲɺϦτϥΠ͝ͱʹ݁ՌσʔλΛੜ͢Δ ɾ5BTL&OUSZʹ࠷ऴతͳ݁ՌͷΈ֨ೲ͢Δ ˙2VFVF&OUSZ ɾ2VFVFλεΫΛཧ͢Δݩσʔλ ɾλεΫੜ࣌ʹຊσʔλ͕ੜ͞ΕΔ ɾλεΫ࣮ߦʹඞཁͳใͱɺ࠷ݶͷεςʔλεͷཧΛߦ͏ ɾ࣮ࡍʹ2VFVF্ͷσʔλભҠΛཧ͢Δσʔλผ ˙2VFVF&OUSZ4VCUBTL ɾͭͷ&OUSZΛ࣮ݱ͢ΔͨΊʹෳͷ5BTLΛ࣮ߦ͢Δඞཁ͕͋Δ߹ʹ ɹෳͷ5BTLΛ4VC5BTLͱͯ͠ཧ͢Δ