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
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.
失敗を経て、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
890
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
170
雑談は、センサーだった
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
勉強会企画をアプリで構造化してみた 〜そこで見えた、AIとの付き合い方〜 / I've structured a study group plan using an app.
pauli
0
330
Road to SRE NEXTの今までとこれから
hiroyaonoe
0
220
知見・人・API・DB・予算 ─ ナイナイ尽くしだった人事データ整備 with dbt、5年間の学び
ken6377
1
170
どうして今サーバーサイドKotlinを選択したのか
nealle
0
210
フルカイテン株式会社 エンジニア向け採用資料
fullkaiten
0
11k
20260702_生成AIはどこまで成長するのか_チャットだけじゃない世界
doradora09
PRO
0
110
そのタスクオンスケですか?
poropinai1966
0
140
初めてのDatabricks勉強会
taka_aki
2
240
事業価値を⽣み出すSREへ SREが担うべき意思決定の5層
kenta_hi
1
2.2k
はじめてのWDM
miyukichi_ospf
1
120
環境凍結という Toil を倒す -セルフサービス型 Ephemeral テスト環境の 設計と実践
shirouz
1
1.6k
美しいコードを書くためにF#を学んでみた話
yud0uhu
1
350
Featured
See All Featured
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.1k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
67
56k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
220
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
320
Building a Scalable Design System with Sketch
lauravandoore
463
34k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
630
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
It's Worth the Effort
3n
188
29k
職位にかかわらず全員がリーダーシップを発揮するチーム作り / Building a team where everyone can demonstrate leadership regardless of position
madoxten
63
55k
Test your architecture with Archunit
thirion
1
2.3k
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
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ͱͯ͠ཧ͢Δ