DDDಋೖͯ͠ײͨ͡՝(࣮ίετ)ͦͷղܾͷͨΊʹߦͬͨ͜ͱ
View Slide
ࠤ౻ਓ4BUP5BLVUPେֶ ݐஙֶઐ߈ଔۀޙɺגࣜձࣾϫʔΫεΞϓϦέʔγϣϯζʹೖࣾձܭγεςϜͷιϑτΣΞ։ൃΛ୲ಛʹࡒձܭͷ༁ؔ࿈ϏοτΩʔࢀը&$αΠτͷ։ൃอकɺࣾγεςϜͷ։ൃ5B,V5Zͷ։ൃࠓͷ)PNFͷલͱͳΔ3FTJEFODFνʔϜʹଐCJUMPDLΛѻ͏ཧը໘όοΫΤϯυɺBQQͷ։ൃʹैࣄ )PNFϓϩμΫτෳࡶͳࣄΛಡΈղ͍ͯߏԽ͠ɺநԽ൚༻ԽͰ͖ΔΑ͏ʹઃܭ͠ɺίετͰଟ͘ͷՁΛͩͤΔ։ൃΛ͢Δ͜ͱΛΉ
1. ͡Ίʹ͢༰DDDΛಋೖͯ͠Έͯײͨ͡՝(࣮ίετ)ͷରԠํ๏ͱߟ͑ͨ͜ͱ
͡Ίʹ
͡ΊʹಛରྖҬ͕ͻΖ͍ྖҬΛΧόʔ(ͭͳ͛Δ)͜ͱͰՁ͕ग़ΔݶΒΕͨϦιʔεͰԿʹޮతͳ։ൃ͢Δ͔1ͭͷ։ൃͰଟ͘ͷՁ͕ग़ͤΔ։ൃΛॏࢹ
͡Ίʹଟ͘ͷػೳΛരͰ։ൃͨ݁͠Ռ...
՝- ଞػೳͰෆ߹ͱͳΔσʔλΛ࡞Δ࣮͕Մೳ- ӨڹൣғͷѲࠔͰɺಛఆσʔλར༻ՕॴνΣοΫ͕ඞཁ & ͭΒ͍- ௐࠪ࣌ͳͲσʔλ͔Βݱঢ়ͷεςʔλεѲ͕ࠔ (σʔλભҠ)- σʔλमਖ਼࣌ʹඞཁͳՕॴͷચ͍ग़͕͠ࠔ (ػೳ × σʔλͷؔ࿈)- validationͷϩδοΫ͕ࢄཚͯ͠ػೳमਖ਼͕େม…- ొͷೝࣝͷํ͕֤ػೳࠩҟ͕͋Γػೳमਖ਼࣌ʹͭΒ͍…- Ͳ͜ʹͲͷΑ͏ͳ࣮͞Ε͍ͯΔ͔ೝ͕ࣝͣΕΔ͜ͱ͕͋Δ- serviceˠserviceˠ...→serviceˠ update & commit͡Ίʹ
1. ݎ࿚ੑར༻͢Δଆͷ࣮ͷํʹΑΒͣɺϧʔϧ͕ݫक͞ΕΔ1. ࣝͷूར༻ՕॴͷιʔεΛղಡ͢Δ͜ͱͳ͘ɺڍಈͷѲ͕Մೳ͡Ίʹ՝ղܾͷϙΠϯτ
1. ݎ࿚ੑར༻͢Δଆͷ࣮ͷํʹΑΒͣɺϧʔϧ͕ݫक͞ΕΔ1. ࣝͷूར༻ՕॴͷιʔεΛղಡ͢Δ͜ͱͳ͘ɺڍಈͷѲ͕Մೳ͡Ίʹˠ͜ΕΛղܾ͢ΔͨΊʹ%%%ͷΈΛར༻˞ϘτϜΞοϓͷߟ͑ํ՝ղܾͷϙΠϯτ
ͬͯΈͯ
ͦͷ݁ՌͬͯΈͯ
ͬͯΈͯϑΝΠϧ͕૿͑ͯͳΜ͔࣮ྔ͕૿͑ͯ...ͭΒ͍
ͬͯΈͯྫݐͷొͷॲཧ1ͭͷݐʹෳͷ͕݅ඥͮ͘ݐ + ݅ Λूͱ͢Δ
ͬͯΈͯBuildingFirestoreTypeBuildingFirestoreCollectionPathPropertyFirestoreTypePropertyFirestoreCollectionPathRegisterBuildingUsecaseσʔλϕʔε(Firestore)ͷఆٛσʔλऔಘ/ߋ৽ͪΖΜόϦσʔγϣϯͷॲཧσʔλͷՃ
ͬͯΈͯBuildingFirestoreTypeBuildingFirestoreCollectionPathPropertyFirestoreTypePropertyFirestoreCollectionPathRegisterBuildingUsecaseσʔλϕʔε(Firestore)ͷఆٛ(ͦͷ··)
ͬͯΈͯBuildingFirestoreTypeBuildingFirestoreCollectionPathPropertyFirestoreTypePropertyFirestoreCollectionPathRegisterBuildingUsecaseBuildingEntityBuildingRepositoryAddressValueObjectPropertryFirstCollectionPropertyEntityRentChargeValueObjectPropertyStatusValueObjectCheckDuplicationDomainServiceυϝΠϯσʔλϕʔε(Firestore)ͷఆٛ(ͦͷ··)
ͬͯΈͯBuildingFirestoreTypeBuildingFirestoreCollectionPathPropertyFirestoreTypePropertyFirestoreCollectionPathRegisterBuildingUsecaseBuildingEntityBuildingRepositoryAddressValueObjectPropertryFirstCollectionPropertyEntityRentChargeValueObjectPropertyStatusValueObjectCheckDuplicationDomainServiceυϝΠϯBuildingRepositoryFirestoreBuildingFirestoreConverterPropertyFirestoreConverterσʔλϕʔε(Firestore)ͷఆٛ(ͦͷ··)ϞσϧΛIFʹσʔλϕʔεʹΞΫηε͢Δॲཧ
ͬͯΈͯ৽͘͠EntityΛ࡞ͬͯ...ͬͯͳΔͱ...͜ΕΒΛ࣮͠ͳ͚ΕͳΒͳ͍...ɻ͜Ε͚ͩͰɺ- ؾ࣋ͪͱͯ͠ԯ߷ʹͳΔ- ॳಈ͕͘ͳΔ…ͷͰɺ͜ΕΛղܾ͍ͨ͠ʂ
ͬͯΈͯusecaseʹهࡌ͍ͯͨ͠ॲཧΛదʹΓग़͍ͯ͠Δͱ͍͏ϝϦοτʂ͕ͩ...ϑΝΠϧͷ૿ՃϑΝΠϧׂʹ͏InterfaceͷՃΫϥεͷఆٛʹ͏࣮ྔͷ૿ՃϞσϧͱσʔλͷมॲཧͭΒ͍...ɻ
ͬͨ͜ͱ
ͭΒ͍͜ͱ / ղܾ͍ͨ͜͠ͱͬͨ͜ͱ
ͭΒ͍͜ͱ / ղܾ͍ͨ͜͠ͱͬͨ͜ͱػցతͳ࡞ۀ͕ଟ͍...(ଟ͘ײ͡Δ)
ͭΒ͍͜ͱ / ղܾ͍ͨ͜͠ͱͬͨ͜ͱػցతͳ࡞ۀ͕ଟ͍...(ଟ͘ײ͡Δ)→ ػցతͳ෦ࣗಈԽʂ(πʔϧ࡞ͬͯࣗಈԽͨ͠)
ͬͨ͜ͱBuildingFirestoreTypeBuildingFirestoreCollectionPathPropertyFirestoreTypePropertyFirestoreCollectionPathRegisterBuildingUsecaseBuildingEntityBuildingRepositoryAddressValueObjectPropertryFirstCollectionPropertyEntityRentChargeValueObjectPropertyStatusValueObjectCheckDuplicationDomainServiceBuildingRepositoryFirestoreBuildingFirestoreConverterPropertyFirestoreConverterྫ͑...Buildingͷ߹
ͬͨ͜ͱϑΟʔϧυಠࣗཁૉconstructorػցతʹܾ·ΔΠϯελϯεԽ͢ΔͨΊͷϝιουػցతʹܾ·Δ෦͋Δ͕ॳظݸผ࣮σʔλΛݩʹΠϯελϯεԽ͢Δ߹reconstructϝιουΛհ͢ΔΑ͏ʹ͓ͯ͠Γػցతʹܾ·Δଞݸผϝιουݸผ࣮
ͬͨ͜ͱbuildingRepository.ts IDΛݩʹऔಘ͢Δϝιουอଘ͢ΔϝιουݪଇඞཁͱͳΔͷͰػցతʹ࡞ͬͯ͠·͑ΔಛఆͷϑΟʔϧυͰͷߜΓࠐΈݸผ࣮͕ඞཁbuildingFirestoreType.tsEntityͱ࣋ͪํม͑ΔͳΒݸผఆ͕ٛඞཁEntityͱಉ࣋ͪ͡ํ͢ΔͳΒػցతʹܾ·Δ(※EntityͷFirstCollectionআ֎)
ͬͨ͜ͱEntityͱσʔλͷ࣋ͪํ͕ҟͳΔ߹ʹػցతʹߦ͏͜ͱ͍͕͠Entityͱσʔλͷ࣋ͪํ͕ಉ͡߹ʹػցతʹܾΊΔ͜ͱ͕ՄೳσʔλΛݩʹEntityʹม͢ΔॲཧϞσϧಠࣗͷ࣮Λ͢ΔΘ͚Ͱͳ͍͕ࡶʹͳΓ͕ͪ....ϑΟʔϧυΕͯͯɺಛఆͷ͕Ҿ͖ܧ͕Εͳ͍...ͬͯ͜ͱ...
ͬͨ͜ͱbuildingRepositoryFirestore.tsbuildingͱ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 / ValueObject1. Appendix
AbstractDomainObject1. Appendix
AbstractLooseEntity1. Appendix
AbstractValueObject1. Appendix
DIͷ࣮ݱํ๏1. Appendix
Queue Smaple1. 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ͱͯ͠ཧ͢Δ