Slide 1

Slide 1 text

Go ͰֶͿClean Architecture ͓·͚: GoΛֶͿͨΊͷ͓͢͢ΊυΩϡϝϯτ

Slide 2

Slide 2 text

झࢫ(࠷ॳͷ૝ఆ) Go 㲗 CA GoΛ௨ͯ͠CAͷཧղΛਂΊΔ CAΛ௨ͯ͠GoͷཧղΛਂΊΔ

Slide 3

Slide 3 text

झࢫ(ࢿྉ࡞ͬͨ݁Ռ) Go → CA GoΛ௨ͯ͠CAͷཧղΛਂΊΔ CAΛ௨ͯ͠GoͷཧղΛਂΊΔ ޙΖʹ͓·͚Λ͚ͭ·ͨ͠

Slide 4

Slide 4 text

ΞδΣϯμ • Clean Architectureͱ͸ʁ • SOLIDݪଇ • CAͷϨΠϠʔߏ଄ • ϨΠϠʔͷڥքɺӽڥ • GoͰCA࠾༻͢ΔͱͲ͏ʁ • GoΛษڧ͢ΔͳΒ͜ΕಡΜͲ͚

Slide 5

Slide 5 text

αϯϓϧΞϓϦέʔγϣϯ TODOΞϓϦΛ૝ఆ User৘ใͱTask৘ใΛฦ͢APIαʔό ϦϙδτϦ: https://github.com/applepine1125/learning- cleanarchitecture-in-go ઈࢍվળத 13ड෇த

Slide 6

Slide 6 text

෮श ΞʔΩςΫνϟͱ͸ʁ

Slide 7

Slide 7 text

ΞʔΩςΫνϟͷ໨త ॏཁͳํ਑ʹ஫ྗ͠ɺৄࡉͷܾఆΛ஗ΒͤΔ →มߋʹॊೈͳΞϓϦέʔγϣϯΛ࡞Δ ϏδωεϩδοΫ ํ਑ ϑϨʔϜϫʔΫɺυϥΠό ৄࡉ ॏཁ౓ େখ ଐਓੑ େখ

Slide 8

Slide 8 text

෮श Clean Architectureͱ͸ʁ

Slide 9

Slide 9 text

ͳΜ͔͜Μͳਤͷ΍ͭ

Slide 10

Slide 10 text

CAͷ໨తɺಛੑ • ϑϨʔϜϫʔΫඇґଘ • ςετՄೳ • UIඇґଘ • σʔλϕʔεඇґଘ • ֎෦ΤʔδΣϯτඇґଘ →ͭ·Γৄࡉͱํ਑Λ੾Γ཭͠΍͍͢

Slide 11

Slide 11 text

CAΛߏ੒͢Δཁૉ • Ϟδϡʔϧείʔϓʹ͓͚Δ5ݪଇ • ίϯϙʔωϯτείʔϓʹ͓͚Δ6ݪଇ • ϨΠϠʔ • ֤ϨΠϠʔͷҙຯɺ੹຿ • ϨΠϠʔͷڥքͷҾ͖͔ͨɺӽڥͷ͔ͨ͠

Slide 12

Slide 12 text

CAΛߏ੒͢Δݪଇ • Ϟδϡʔϧείʔϓ (SOLIDݪଇ) • ୯Ұ੹೚ͷݪଇ (SRP) • ΦʔϓϯɾΫϩʔζυͷݪଇ (OCP) • Ϧείϑͷஔ׵ݪଇ (LSP) • ΠϯλʔϑΣʔε෼཭ͷݪଇ (ISP) • ґଘؔ܎ٯసͷݪଇ (DIP) ← Ұ൪ॏཁ

Slide 13

Slide 13 text

CAΛߏ੒͢Δݪଇ • ίϯϙʔωϯτείʔϓ (ڽूੑ) • ࠶ར༻ɾϦϦʔε౳Ձͷݪଇ (REP) • ด࠯ੑڞ௨ͷݪଇ (CCP) • શ࠶ར༻ͷݪଇ (CRP)

Slide 14

Slide 14 text

CAΛߏ੒͢Δݪଇ • ίϯϙʔωϯτείʔϓ (ؔ࿈ੑ) • ඇ॥؀ґଘؔ܎ͷݪଇ (ADP) • ҆ఆґଘͷݪଇ (SDP) • ҆ఆ౓ɾந৅౓౳Ձͷݪଇ (SAP)

Slide 15

Slide 15 text

CAΛߏ੒͢Δݪଇ • Ϟδϡʔϧείʔϓ • DIP ←Ұ൪ॏཁ • Ϟδϡʔϧείʔϓ • SRP, OCP, LSP, ISP • ίϯϙʔωϯτείʔϓ(ڽूੑ) • REP, CCP, CRP • ίϯϙʔωϯτείʔϓ(ؔ܎ੑ) • ADP, SDP, SAP આ໌͠·͢ ࣗश

Slide 16

Slide 16 text

SOLIDݪଇ

Slide 17

Slide 17 text

୯Ұ੹೚ͷݪଇ “Ϟδϡʔϧ͸ͨͬͨҰͭͷΞΫλʔʹରͯ͠ ੹຿Λෛ͏΂͖Ͱ͋Δ”

Slide 18

Slide 18 text

୯Ұ੹೚ͷݪଇ ϙΠϯτ • มߋ͢Δཧ༝͕ඞͣڞ௨Ͱ͋Ε͹ɺ ڞ௨Ϟδϡʔϧͱͯ͠੾Γग़ͯ͠΋ྑ͍ ٯʹݴ͏ͱͲ͏ͳΔʁ

Slide 19

Slide 19 text

ΦʔϓϯɾΫϩʔζυͷݪଇ “ߏ੒ཁૉ͸֦ுʹରͯ͠͸։͍͍ͯͯɺमਖ਼ʹ ରͯ͠͸ด͍ͯ͡ͳ͚Ε͹ͳΒͳ͍”

Slide 20

Slide 20 text

ΦʔϓϯɾΫϩʔζυͷݪଇ ϙΠϯτ • interfaceʹΑͬͯ৽͍͠ػೳΛ؆୯ʹ औΓೖΕΔ͜ͱ͕Ͱ͖Δ • ͋ΔϞδϡʔϧ΁ͷมߋͷӨڹ͕ଞͷ Ϟδϡʔϧ΁Өڹ͠ͳ͍

Slide 21

Slide 21 text

Ϧείϑͷஔ׵ݪଇ “SܕͷΦϒδΣΫτͷo1ͷ֤ʑʹɺରԠ͢ΔTܕͷΦϒδΣΫτo2͕̍ͭ ଘࡏ͠ɺTΛ࢖ͬͯఆٛ͞ΕͨϓϩάϥϜPʹରͯ͠o2ͷ୅ΘΓʹo1Λ ࢖ͬͯ΋PͷৼΔ෣͍͕มΘΒͳ͍৔߹S͸Tͷ೿ੜܕͰ͋Δͱݴ͑Δ”

Slide 22

Slide 22 text

Ϧείϑͷஔ׵ݪଇ ϙΠϯτ • ϞδϡʔϧΛஔ׵Մೳͳঢ়ଶʹ͢Δ ΦʔϓϯɾΫϩʔζυͷݪଇͷ֦ுੑͷ಺༰ͱҰॹ

Slide 23

Slide 23 text

ΠϯλʔϑΣʔε෼཭ͷݪଇ ϙΠϯτ • ຊདྷඞཁͱ͠ͳ͍΋ͷʹ·Ͱґଘ͠ͳ͍Α͏ ʹɺΠϯλʔϑΣʔεΛڬΜͰૄ݁߹ʹ͢Δ

Slide 24

Slide 24 text

ґଘؔ܎ٯసͷݪଇ • interfaceΛ༻͍ͯґଘؔ܎Λٯసͤ͞Δ 6TFDBTF 3FQPTJUPSZ 42-)BOEMFS %*1ద༻લ %*1ద༻ޙ 6TFDBTF 3FQPTJUPSZ 42-)BOEMFS 3FQPTJUPSZ *OUFSGBDF 42-)BOEMFS *OUFSGBDF

Slide 25

Slide 25 text

ґଘؔ܎ٯసͷݪଇ ϙΠϯτ • มԽ͠΍͍͢ϞδϡʔϧΛࢀরɺܧঝɺ ΦʔόʔϥΠυɺ໊ࢦ͠Ͱࢀর͠ͳ͍ →CAͰϨΠϠʔΛ·͍ͨͰϞδϡʔϧΛ ࢀর͢Δͱ͖ʹ௒ॏཁʂ

Slide 26

Slide 26 text

CAͷ໨తɺಛੑ • ϑϨʔϜϫʔΫඇґଘ • ςετՄೳ • UIඇґଘ • σʔλϕʔεඇґଘ • ֎෦ΤʔδΣϯτඇґଘ →ݪଇΛར༻͢Ε͹࣮ݱͰ͖ͦ͏ʁ վΊͯɾɾɾ

Slide 27

Slide 27 text

CAͷϨΠϠʔߏ଄

Slide 28

Slide 28 text

CAͷ֤ϨΠϠʔ • ΤϯςΟςΟ • Ϣʔεέʔε • ΠϯλʔϑΣʔεΞμϓλ • ϑϨʔϜϫʔΫɺυϥΠό

Slide 29

Slide 29 text

• ΤϯςΟςΟ • Ϣʔεέʔε • ΠϯλʔϑΣʔεΞμϓλ • ϑϨʔϜϫʔΫɺυϥΠό ϙΠϯτ ୯ํ޲ґଘͰ͋Δ CAͷ֤ϨΠϠʔ ґଘ͞Ε͍ͯΔ ԁͷத ԁͷ֎ ґଘ͍ͯ͠Δ

Slide 30

Slide 30 text

ΤϯςΟςΟ • Ϗδωεࣗମͷ࠷ॏཁϧʔϧΛ·ͱΊͨ΋ͷ • γεςϜ͕webΞϓϦέʔγϣϯͱ͍͏ܗଶ Ͱͳ͔ͬͨͱͯ͠΋ଘࡏ͢Δ৘ใ

Slide 31

Slide 31 text

ΤϯςΟςΟ w ۀ຿ʹඞཁͳ৘ใ͕ೖͬͨߏ଄ମ w ඞཁͳ৘ใΛੜ੒͢ΔͨΊͷϝιου ྫTSDQLHEPNBJOVTFSHP

Slide 32

Slide 32 text

Ϣʔεέʔε • ΞϓϦέʔγϣϯݻ༗ͷϏδωεϧʔϧ ΛؚΉ • ΤϯςΟςΟͷϏδωεϩδοΫΛ૊Έ߹Θ ͤͯ࢖༻ɺ੍ޚ͢Δ

Slide 33

Slide 33 text

Ϣʔεέʔε ྫTSDQLHVTFDBTFUBTLJOUFSBDUPSHP w σʔλͷऔಘ SFQPTJUPSZ ͸JOUFSGBDFΛૠ͢ w ӬଓԽ͢ΔͨΊʹUBTLͷ৘ใΛ࢖ͬͯΞϓϦέʔγϣϯݻ༗ͷ σʔλͷܗʹม׵

Slide 34

Slide 34 text

ΠϯλʔϑΣʔεΞμϓλ • ϢʔεέʔεɺΤϯςΟςΟ͔ΒDB΍ϑϨʔ ϜϫʔΫͳͲ͕࢖͏ϑΥʔϚοτ΁σʔλΛ ม׵͢Δ(ͦͷٯ΋વΓ) • ೖྗɺग़ྗɺӬଓԽʹؔ͢ΔϞδϡʔϧ͕ॴ ଐ͢Δ

Slide 35

Slide 35 text

ΠϯλʔϑΣʔεΞμϓλ ྫTSDQLHJOUFSGBDFUBTLSFQPTJUPSZHP w ӬଓԽͷͨΊʹΫΤϦΛൃߦ͍ͯ͠Δ

Slide 36

Slide 36 text

ϑϨʔϜϫʔΫɺυϥΠό • ϑϨʔϜϫʔΫ΍πʔϧͳͲͷίʔυͰ ߏ੒͞Ε͍ͯΔ • WebͷUIͳͲ΋͜͜

Slide 37

Slide 37 text

ϑϨʔϜϫʔΫɺυϥΠό ྫTSDQLHJOGSBTRMIBOEMFSHP w EBUBCBTFTRMϥΠϒϥϦΛ࢖༻ w ԼҐ૚ͱ઀ଓ͠΍͍͢Α͏ʹXSBQ͢Δ

Slide 38

Slide 38 text

ϨΠϠʔͷڥքɺӽڥ

Slide 39

Slide 39 text

ϨΠϠʔͷڥքɺӽڥ ڥքͷҾ͖͔ͨ • γεςϜΛίϯϙʔωϯτʹ෼ׂ͢Δ • ݪଇɺϧʔϧΛݩʹ֤ϨΠϠʔʹ෼ྨ͢Δ • ґଘؔ܎ͷઢΛҾ͍ͯΈΔ

Slide 40

Slide 40 text

ϨΠϠʔͷڥքɺӽڥ ӽڥͷ͔ͨ͠ • DIPΛ࢖ͬͯґଘͷ޲͖Λίϯτϩʔϧ͢Δ 3FQPTJUPSZ 6TFDBTF 6TFDBTF 3FQPTJUPSZ JOUFSGBDF 3FQPTJUPSZ *OUFSGBDF"EBQUFS 6TFDBTF %*1ద༻લ %*1ద༻ޙ

Slide 41

Slide 41 text

ϨΠϠʔͷڥքɺӽڥ ӽڥͷ͔ͨ͠ TSDQLHVTFDBTFVTFSJOUFSBDUPSHP TSDQLHJOUFSGBDFVTFSDPOUSPMMFSHP ܕ͸VTFDBTF6TFS3FQPTJUPSZ ࣮ࡍʹೖΕͯΔͷ͸EBUBCBTF6TFS3FQPTJUPSZ

Slide 42

Slide 42 text

GoͰCA࠾༻͢ΔͱͲ͏ʁ

Slide 43

Slide 43 text

GoͰCA࠾༻͢ΔͱͲ͏ʁ ϥΠϒϥϦʹґଘ͗͢͠ͳ͍ • αʔυύʔςΟͷϥΠϒϥϦ࢖͍͗ͣ͢ɺ͋͘ ·Ͱwrapperͱͯ͠࢖͏ఔ౓ʹཹΊΔจԽ͕ ͋Δ • infra૚ҎԼ΁ͷ֎෦ίϯϙʔωϯτͷӨڹ͕ গͳ͍ →֎෦ίϯϙʔωϯτͷมߋʹͭΑ͍

Slide 44

Slide 44 text

GoͰCA࠾༻͢ΔͱͲ͏ʁ MockͭΒ͍໰୊ • CAΛ࠾༻͢Δͱinterface͍ͬͺ͍ੜ͑Δ • ࣗ࡞interface͸goMockͳͲͰMockੜ੒ HPMBOHNPDL IUUQTHJUIVCDPNHPMBOHNPDL

Slide 45

Slide 45 text

GoͰCA࠾༻͢ΔͱͲ͏ʁ ඪ४ύοέʔδΛMock͢Δʹ͸ɾɾɾʁ • ςετ͍ͨ͠ϥΠϒϥϦͷinterface, ߏ଄ମͱ ϝιου͕Ұக͢ΔinterfaceΛखݩͰ࡞Γ goMockͰMockੜ੒ ͩΔ͍

Slide 46

Slide 46 text

CAͷ·ͱΊ

Slide 47

Slide 47 text

CA·ͱΊ ”ਤͷԁ͸ɺ֓ཁΛࣔͨ͠΋ͷͰ͋Δɻ͕ͨͬͯ͠ɺ͜ͷ̐ͭ Ҏ֎ʹ΋ඞཁͳ΋ͷ͸͋ΔͩΖ͏ɻͨͩ͠ɺґଘੑͷϧʔϧ ͸ৗʹద༻͞ΕΔ” ”νʔϜͷن໛΍ϝϯόʔͷεΩϧ΍ιϦϡʔγϣϯͷෳࡶ ͞ɺͦͯ࣌ؒ͠ͱ༧ࢉͷ੍໿ͳͲΛߟྀ͠Α͏” 3PCFSU$.BSUJO

Slide 48

Slide 48 text

CA·ͱΊ • νʔϜ಺Ͱ߹ҙ͕औΕ͍ͯΕ͹ਖ਼௚ͳΜͰ ΋͍͍ͱࢥ͍ͬͯΔ • ԿΛୡ੒͍͔ͨ͠Λݟਾ͑ɺઌਓ͕࢒ͨ͠ ݪཧݪଇ΍νʔϜͷܦݧɺγεςϜͷಛੑɺ υϝΠϯ஌ࣝͳͲΛϑϧʹ׆༻ͯ͠ৗʹద ੾ͳߏ଄ʹͳΔΑ͏౒ྗ͢Δ

Slide 49

Slide 49 text

CA͓͢͢ΊυΩϡϝϯτ w $MFBO"SDIJUFDUVSFɹୡਓʹֶͿιϑτ΢ΣΞͷߏ଄ͱઃܭ IUUQTXXXBNB[PODPKQEQ#'4#)47SFGEQLJOEMFSFEJSFDU @FODPEJOH65'CULS w ࣮ફΫϦʔϯΞʔΩςΫνϟ IUUQTOSTMJCDPNDMFBOBSDIJUFDUVSF w $MFBO"SDIJUFDUVSFͰ"1*4FSWFSΛߏஙͯ͠ΈΔ IUUQTRJJUBDPNIJSPUBLBOJUFNTDGBDDBF

Slide 50

Slide 50 text

GoΛษڧ͢ΔͳΒ͜ΕಡΜͲ͚

Slide 51

Slide 51 text

GoΛษڧ͢ΔͳΒ͜ΕಡΜͲ͚ • ॳ৺ऀ w "5PVSPG(P IUUQTHPUPVSKQBQQTQPUDPNXFMDPNF w 1SPHBUF IUUQTQSPHDPNMBOHVBHFTHP

Slide 52

Slide 52 text

GoΛษڧ͢ΔͳΒ͜ΕಡΜͲ͚ • ॳ৺ऀ~தڃऀ w (PݴޠʹΑΔ8FCΞϓϦέʔγϣϯ։ൃ w (PͰଞ෼໺ͷษڧΛ͢Δ (PͳΒΘ͔ΔγεςϜϓϩάϥϛϯά (PݴޠͰͭ͘ΔΠϯλϓϦλ 3FBM8PSME)551 8SJUJOHdJO(Pܥ

Slide 53

Slide 53 text

GoΛษڧ͢ΔͳΒ͜ΕಡΜͲ͚ • தڃऀ~্ڃऀ w (PݴޠʹΑΔฒߦॲཧ w ϓϩάϥϛϯάݴޠ(P w ΈΜͳͷ(Pݴޠʲݱ৔Ͱ࢖͑Δ࣮ફςΫχοΫʳ w &⒎FDUJWF(P ӳޠ൛ɿIUUQTHPMBOHPSHEPDF⒎FDUJWF@HPIUNM ೔ຊޠ൛IUUQHPMBOHKQF⒎FDUJWF@HP

Slide 54

Slide 54 text

GoΛษڧ͢ΔͳΒ͜ΕಡΜͲ͚ GoDocಡΊ

Slide 55

Slide 55 text

͓ΘΓ