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.
10年後、Engineering 行為を剥奪されるとして、わたしたちは、どう、何を創ればいいだろうか。 / If Engineering Is Taken Away in 10 Years, How and What Should We Create?
bitkey
PRO
1
200
Flutter × BLE Centralを自前Pluginで実装する設計パターン - MethodChannel / EventChannelで作る双方向ブリッジの実践 / Building Custom Flutter BLE Central Plugins: Bidirectional Bridging with Method & Event Channels
bitkey
PRO
0
470
Swift&Xcodeのバージョンアップにまつわる怖かった思い出 / Scary Memories of Swift and Xcode Updates
bitkey
PRO
0
240
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
660
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
590
失敗を経て、Harness Engineering で 大切にしたいことを考える / Learning from Failure: What Matters in Harness Engineering
bitkey
PRO
1
660
AI Adaptable なテストを整える工夫 / Ways to Make Your Tests AI-Adaptable
bitkey
PRO
3
400
人が担う「価値」とは?これからの「QA」とは / Human Value and the Future of Quality Assurance
bitkey
PRO
0
370
キャリア25年目にしてTypeScript に出会うまで - 「型」を通じて振り返るプログラミング言語遍歴 / Meeting TypeScript After 25 Years in Tech - Looking Back at My Programming Language Journey Through "Types"
bitkey
PRO
2
580
Other Decks in Technology
See All in Technology
AIにシークレットを見せない、WSL2で安全な開発環境
yazm
0
310
Getting Started with Google Antigravity
glaforge
0
320
会社説明資料
persolserverworks
0
9.8k
エンタメ企業のM&Aを支えるデータ基盤 ― 統合から店舗のリアルタイム分析まで / Data Engineering Summit 2026
genda
0
200
Refining Active Record
shugo
0
160
OptunaHub: ブラックボックス最適化のためのプラットフォーム
pfn
PRO
0
140
Local CI × GitHub Actions
gogutan
3
230
Kiro Crewで「みのるん式」仕事術やってみた
minorun365
PRO
3
650
hackers_champloo_2026_tidb
makocchi
0
170
パッチ更新でterraform initが落ちた日
grimoh
1
140
NDIでApple Vision Proにリアルタイム映像送信
jyouryuusui
0
130
ソフトウェア ファクトリー - 再現性のあるソフトウェアの工場づくり / Software factory
iktakahiro
6
5.1k
Featured
See All Featured
Crafting Experiences
bethany
1
380
The Curse of the Amulet
leimatthew05
3
16k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
How STYLIGHT went responsive
nonsquared
100
6.3k
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
870
The browser strikes back
jonoalderson
0
1.8k
The untapped power of vector embeddings
frankvandijk
2
1.9k
Are puppies a ranking factor?
jonoalderson
2
4.1k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
930
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.2k
Making the Leap to Tech Lead
cromwellryan
135
10k
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ͱͯ͠ཧ͢Δ