Akatsuki Summer Internship 2019の成果発表会のスライドです。
ブログ↓ ドメインロジックと永続化処理を分離する設計改善を行って得られた知見【アカツキ インターン】 https://blog.p1ass.com/posts/aktsk-intern/
υϝΠϯϩδοΫͱӬଓԽॲཧΛ͢ΔઃܭվળΛߦͬͯಘΒΕͨݟ"LBUTVLJ4VNNFS*OUFSOTIJQՌൃද؛ ً !QBTT
View Slide
͍ͨ͜͠ͱࠜڌͷ͋Δઃܭଟ͘ͷϝϦοτΛڗडͰ͖Δ
8IPBN*• ؛ ً• 5XJUUFS (JU)VC!QBTT• ژେֶ #• αʔόʔαΠυ (P• $".1)03 ӡӦϝϯόʔࣗݾհ
"HFOEB• ࣗݾհ• Ծ௨՟ཧαʔϏεͷհ• ઃܭվળΛߦ͏ܦҢ• ݱঢ়ͷ՝• ઃܭվળ• ઃܭվળͰಘΒΕͨϝϦοτ• ݸਓతͳֶͼ• ͓ΘΓʹ
Ծ௨՟ཧαʔϏεͷհ
֓ཁ• ήʔϜ௨՟ཧαʔϏε• ՝ۚΞΠςϜͷཧ• Ϣʔβͷߴཧ• Ϩγʔτݕূ• FUDԾ௨՟ཧαʔϏεͷհήʔϜ։ൃऀͷݮʹد༩
ΘΕ͍ͯΔٕज़ελοΫ• (P• (PPHMF"QQ&OHJOF ("&• EBUBTUPSF• $JSDMF$*Ծ௨՟ཧαʔϏεͷհ(PQIFSJ[FNF IUUQTHPQIFSJ[FNF
ઃܭվળΛߦ͏ܦҢ
ϥΠϒϥϦΛมߋ͍ͨ͠ݱࡏEBUBTUPSFͷΞΫηεʹ NKJCTPOHPPOΛ༻• ("&ެࣜͷϥΠϒϥϦΛ͍͍ײ͡ʹϥοϓ• ࣗಈΩϟογϡ͍উखͷྑͦ͞͏ͳ NFSDBSJEBUBTUPSFʹҠߦ͍ͨ͠• ಠࣗʹϛυϧΣΞΛ࣮͢Δ͜ͱ͕Ͱ͖Δ• ֦ுੑ͕ߴ͍ઃܭվળΛߦ͏ܦҢ
ݱঢ়ͷ՝
ີ݁߹ͳυϝΠϯϩδοΫͱEBUBTUPSFͷӬଓԽॲཧ͕ࠞ͟Γ߹ͬͯෳࡶݱঢ়ͷ՝Is the change list more complex than it shouldbe?"Too complex" usually means "can't beunderstood quickly by code readers."(PPHMFT&OHJOFFSJOH1SBDUJDFTEPDVNFOUBUJPOIUUQTHPPHMFHJUIVCJPFOHQSBDUJDFT
6OJUUFTUT*OUFHSBUJPOUFTUT• ϩδοΫͷςετ͕͍ͨ͠ͷʹΤϛϡϨʔλͷىಈ͕ඞཁ• ΧόϨοδߴ͍͕ཏੑ͕͍• Ξϯνύλʔϯݱঢ়ͷ՝UnitIntegrationE2EUFTUBVUPNBUJPOQZSBNJE
ઃܭվળͷํ
ີ݁߹ͳॲཧΛ͢Δ✔ ͜ΕΒͷີ݁߹ͳ࣮ʹىҼˣ ૄ݁߹ͳ࣮ʹͳΔΑ͏ʹઃܭΛมߋઃܭվળ
%*1ͱΠϯλʔϑΣʔεͰநԽઃܭվળIUUQTTQFBLFSEFDLDPNQMVTDMFBOBSDIJUFDUVSFJONJOVUFT TMJEF
࣮ઃܭվળ"EEJUJPOT%FMFUJPOT$IBOHFT
࣮ઃܭվળ
ઃܭվળͰಘΒΕͨϝϦοτ
ςελϏϦςΟͷ্ϞοΫΛ͏͜ͱͰςετ͕ॻ͖͘͢ઃܭվળͰಘΒΕͨϝϦοτ{name: "return error when post failed",hoge: &types.Hoge{ HogeID: "invalid” },injector: func(r *mocks.MockHogeRepository) *mocks.MockHogeRepository {r.EXPECT().Post(gomock.Any(), types.Hoge{HogeID: "invalid"}).Return(nil, errors.New("some error"))return r},want: nil,wantErr: true,}// ...for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {ctrl := gomock.NewController(t)defer ctrl.Finish()mockRepo := mocks.NewMockHogeRepository(ctrl)mockRepo = tt.injector(mockRepo)// ...}}
ίʔυͷՄಡੑ্͕ӬଓԽॲཧΛએݴతʹݺͿ͚ͩͰྑ͍ͷͰίʔυ͕͖ͬ͢Γ• ԿΛ͢ΔͨΊͷؔͳͷ͔͕͔Γ͍͢ઃܭվળͰಘΒΕͨϝϦοτ
%#ͷҠߦָ͕ʹผ%# FY4QBOOFSͷҠߦ࣌ʹϩδοΫΛߟ͑Δඞཁ͕ͳ͍ઃܭվળͰಘΒΕͨϝϦοτ
ݸਓతͳֶͼ
ࠜڌͷ͋Δઃܭଟ͘ͷϝϦοτΛڗडͰ͖Δ
ઃܭͷଘࡏҙٛΞʔΩςΫνϟઃܭख๏Կ͔Λղܾ͢ΔͨΊʹੜ·Εͨ• ςετ͕ॻ͖ͮΒ͍• େنʹͳͬͯ։ൃεϐʔυ͕མͪͨ• FUDࣗͷϓϩμΫτͱઃܭख๏ͷత͕Ұக͍ͯ͠ͳ͍ͱແҙຯݸਓతͳֶͼ
lͳΜͱͳ͘zͰͳࠜ͘ڌΛͬͨઃܭΛతҙࣝΛͬͯదͳબఆΛ͠Α͏• ςετ࣌ؒॖͷͨΊʹ%#ΛϞοΫʹࠩ͠ସ͍͔͑ͨΒநԽ͢Δ• େنͳ։ൃ͔ͩΒɺΛͰ͖ΔΑ͏ʹ$MFBO"SDIJUFDUVSFΛ࠾༻͢Δ• কདྷੑΑΓ։ൃεϐʔυ͕େࣄ͔ͩΒ͋·ΓઃܭΛؾʹ͠ͳ͍• FUDݸਓతͳֶͼ
͓ΘΓʹ
͓ΘΓʹ• ήʔϜ௨՟ཧαʔϏεͷઃܭվળΛߦͬͨ• طଘͷ՝Λղফͯ͠ࠓޙͷ։ൃ͕͘͢͠ͳΔΑ͏ʹͨ͠• ࣮ଞʹ৭Μͳ͜ͱΛɺɺɺ• ZBNM ͔Β (PͷςετίʔυΛࣗಈੜ͢Δ044ͷ৽ػೳ։ൃ• ࢄΩϟογϡͨΊͷϛυϧΣΞΛ࣮• FUD
5IBOLZPV"TLNFBOZUIJOH5XJUUFSΒ͢ !QBTT(JU)VCQBTT