Upgrade to Pro — share decks privately, control downloads, hide ads and more …

クリーンアーキテクチャとiOSアプリ開発のためのVIPERと

7d1521d950d9bc5697868830cb04ff2f?s=47 yimajo
January 20, 2020

 クリーンアーキテクチャとiOSアプリ開発のためのVIPERと

7d1521d950d9bc5697868830cb04ff2f?s=128

yimajo

January 20, 2020
Tweet

Transcript

  1. ΫϦʔϯΞʔΩςΫνϟͱ J04ΞϓϦ։ൃͷͨΊͷ 7*1&3ͱ J04$MFBO"SDIJUFDUVSFษڧձTQPOTPSFECZ4BOTBO !ZJNBKP

  2. w ΫϦʔϯΞʔΩςΫνϟຊʢҎԼ$"ຊʣ͸ࢲʹ͸ಡΈͮΒ͍ w ख์͠Ͱྑ͍ຊʂͱ͸ݴ͍ͮΒ͍ w ࣗ෼͕ཧղͰ͖͔ͨͲ͏͔ո͍͠ ͸͡Ίʹ

  3. ΫϦʔϯΞʔΩςΫνϟͰ΋࢖͏ ʰґଘؔ܎ٯసͷݪଇʢ%*1ʣʱ ʹ͍ͭͯͷٙ໰

  4. ϓϩάϥϛϯάͷجૅͰ͋Δ ʮந৅ʹରͯ͠ϓϩάϥϛϯάͤΑʯͱ͍͏ࣄͱ ʰґଘؔ܎ٯసͷݪଇ %*1 ʱ ͱ͍͏ݴ༿ͷҧ͍͸Կʁ ͓Μͳ͜͡ͱΛΘ͟Θ͟ݪଇʹ͢Δͷʁ

  5. $"ຊΛԿ౓΋ಡ ΜͰ΍ͬͱ ٯసΛཧղͰ͖ͨ

  6. ໰࣍ͷਤ͸ґଘؔ܎ٯసͷݪଇͰ͔͢ DMBTT 3FQPSU(FOFSBUPS DMBTT $PSF%BUB.BOBHFS ίʔυͷݺͼग़͠ QSPUPDPM %BUB(BUFXBZ ४ڌ ͜Ε͸୯७ʹେੲ͔ΒݴΘΕͯΔ

    ʮந৅ʹରͯ͠ϓϩάϥϛϯάͤΑʯΛ ࣮ݱ͍ͯ͠Δ͚ͩͰ͸ʁ
  7. ࢲͷײ૝ ͜ͷ୯७ͳந৅ܕͷར༻ςΫχοΫ͸ ʰґଘؔ܎ٯసʱ͚ͩͲ ʰґଘؔ܎ٯసͷݪଇʱ Ͱ͸ͳ͍

  8. ࢲͷײ૝ ʰґଘؔ܎ٯసͷݪଇʱ͸ݫີʹ͸ɺ ෳ਺Ϟδϡʔϧ͕͋Δ৔߹ʹɺ Ϟδϡʔϧͷґଘؔ܎͕ٯస͢Δͱ͖ ͷΈͦΕ͕ద༻͞ΕΔͷͰ͸

  9. Θ͔Γ΍͢͞ͷͨΊ J04ΞϓϦ։ൃతʹ &NCFEEFE'SBNFXPSLʹΑΓ Ϟδϡʔϧ෼ׂͯ͠ ̎ͭͷϞδϡʔϧͰͷྫΛߟ͑·͢

  10. DMBTT 3FQPSU(FOFSBUPS Ϟδϡʔϧ" Ϟδϡʔϧ# ίʔυͷݺͼग़͠ ґଘؔ܎ Ϟδϡʔϧ"͸Ϟδϡʔϧ#ʹґଘ͍ͯ͠Δɻ Ϟδϡʔϧ"͕#ΛݺͿྫ DMBTT $PSF%BUB.BOBHFS

    JNQPSU.PEVMF# DMBTT3FQPSU(FOFSBUPS\ MFUEBUB$PSF%BUBNBOBHFS  ʜ ^
  11. DMBTT 3FQPSU(FOFSBUPS Ϟδϡʔϧ" Ϟδϡʔϧ# ίʔυͷݺͼग़͠ ґଘؔ܎ Ϟδϡʔϧ"͸Ϟδϡʔϧ#ʹґଘ͍͕ͯͨ͠ɺϓϩτίϧར༻ʹΑͬͯɺ Ϟδϡʔϧ#͕Ϟδϡʔϧ"ʹґଘ͠͸͡Ίͨʂʂʜٯసʂʂʂʂ QSPUPDPM %BUB(BUFXBZ

    ४ڌ Ϟδϡʔϧ#͕"ͷϓϩτίϧʹ४ڌͤ͞Δ DMBTT $PSF%BUB.BOBHFS ͜ͷ৔߹ͷϓϩτίϧ͸Ϟδϡʔϧ"ʹॴଐͤ͞ͳ͚Ε͹ٯస͠ͳ͍
  12. $"ຊͰ͸ w ͨͩͷந৅ܕͷར༻Λʰґଘؔ܎ٯసʱͱ͍ͯ͠Δͷ͕ฆΒΘ͍͠ w $"ຊୈ̑ষʢਤʣ w zιʔείʔυͷґଘؔ܎ͱ੍ޚͷํ޲ͱٯస w ຊ౰ʹϞδϡʔϧͷґଘؔ܎͕ٯస͢Δ͜ͱ͕ʰґଘؔ܎ٯసͷݪ ଇʱͱ͍ͯ͠Δ

    w $"ຊୈ̔ষʢਤʣ w z*OUFSBDUPSίϯϙʔωϯτ͔Β%BUBCBTFίϯϙʔωϯτ΁ͷ ґଘؔ܎Λٯస
  13. ʰґଘؔ܎ٯసͷݪଇʱ ʰґଘؔ܎ٯసͷݪଇʱ Ͱ͸ͳ͍ *OUFSBDUPSϞδϡʔϧ $POUSPMMFSϞδϡʔϧ %BUBCBTFϞδϡʔϧ

  14. ࣗݾ঺հ w ג ΩϡϦΦγςΟιϑτ΢ΣΞ w J04ΞϓϦ։ൃΛੜۀ

  15. ࣗݾ঺հ w BTZODBXBJUݚڀಡຊ w  w 3Y4XJGUݚڀಡຊ* ** *** w

     w 7*1&3ݚڀಡຊ* w  IUUQTTXJGUCPPUIQN
  16. ຊ୊

  17. ࠓճൃද͍ͨ͜͠ͱ w ͳͥ7*1&3͔ w ΫϦʔϯΞʔΩςΫνϟ $" ͷJ04࣮૷ύλʔϯͰ͋Δ 7*1&3ͷαϯϓϧίʔυൺֱ w େ఍ͷ7*1&3͸$"ຊʹ͋Δґଘؔ܎ٯసͷݪଇ

    %*1 Λద ༻͍ͯ͠ͳ͍
  18. ͳͥ7*1&3͔ w 7*1&3͸ΫϦʔϯΞʔΩςΫνϟ $" ΛJ04ΞϓϦ։ൃʹ෦෼తʹద༻͠ ͨ΋ͷ w 7JFX *OUFSBDUPS 1SFTFOUFS

    &OUJUZ 3PVUFSͷύʔπ͝ͱʹ੹೚Λ෼ ׂ͍ͯ͠Δ 7JFX 3PVUFS 1SFTFOUFS *OUFSBDUPS &OUJUZ %FMFHBUF *OUFSBDUPSΛॴ࣋͠ ߋ৽Λཁٻ͢Δ ૢ࡞ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU4VDDFTT &SSPS  ໾ׂ ΠϕϯτΛ1SFTFOUFSʹ఻͑ɺ σʔλͷදࣔΛߦ͏ɻ ໾ׂ ը໘ભҠͷͨΊ࣍ͷը໘΁ͷ੍ޚΛ୲౰͢Δɻ ΤϥʔΛදࣔ͢Δ͚ͩͷ6*"MFSU$POUSPMMFSදࣔ΋ߦ͍΍͍͢ɻ ໾ׂ ϏδωεϩδοΫΛ୲౰͢Δ ໾ׂ σʔλΛΧϓηϧԽ͢Δ ໾ׂ 7JFX͔ΒͷೖྗΛड৴͠ɺ *OUFSBDUPS΁σʔλΛཁٻ͢Δɻ 6*,JUʹґଘͤͣɺ දࣔ͢Δ΋ͷΛ7JFXʹ఻͑Δɻ ॴ࣋ ௨஌ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ఻͑Δ
  19. 7*1&3ͷܥේ ຊՈPCKDJPJTTVFWJQFS ຊՈPCKDJPJTTVFWJQFSTXJGU QFESPIQFSBMUB"SUJDMFTJ047*1&3 KB[[CQO7*1&3%&.0 ΞϯΫϧϘϒʹΑΔΫϦʔϯΞʔΩςΫνϟ ʜ ʜ

  20. ͳ༷ͥʑͳ7*1&3͕ʜ

  21. ຊՈ7*1&3 w  w PCKDJPʹدߘ w 50%0ΞϓϦ w $PSF%BUBΛ࢖ͬͯΔ w

    ܕ΍ม਺ͷ໋໊͕ΠϚΠν w ΞϓϦىಈ࣌ʹશը໘ͷґଘ ؔ܎Λղܾ
  22. QFESPIQFSBMUB"SUJDMFT J047*1&3 w ೥ w $IFFTDBLF-BCT w 344ͷهࣄΛදࣔ w "MBNPpSF3Y4XJGUΛ࢖ͬͯ

    Δ w ܕ΍ม਺ͷ໋໊͕ྑ͘ͳͬͨ w 3PVUFS͕ґଘؔ܎Λղܾ
  23. 7*1&3αϯϓϧͷڞ௨఺ w $PSF%BUB΍3Y4XJGU"MBNPpSFͳͲͷϑϨʔϜϫʔΫʹʰґଘؔ ܎ٯసͷݪଇʱΛద༻͍ͯ͠ͳ͍ w *OUFSBDUPS͕$PSF%BUBʹґଘ w *OUFSBDUPS͕"MBNPpSF3Y4XJGUʹґଘ

  24. %*1Λ࢖Θͳ͍͜ͱͷ σϝϦοτΛղܾ͢Δʹ͸ w $PSF%BUB΍"MBNPpSFΛ੾Γ ସ͍͑ͨͳΒ w *OUFSBDUPSࣗମΛೖΕସ͑Δ 7JFX 3PVUFS 1SFTFOUFS

    *OUFSBDUPS &OUJUZ %FMFHBUF *OUFSBDUPSΛॴ࣋͠ ߋ৽Λཁٻ͢Δ ૢ࡞ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU4VDDFTT &SSPS  ໾ׂ ΠϕϯτΛ1SFTFOUFSʹ఻͑ɺ σʔλͷදࣔΛߦ͏ɻ ໾ׂ ը໘ભҠͷͨΊ࣍ͷը໘΁ͷ੍ޚΛ୲౰͢Δɻ ΤϥʔΛදࣔ͢Δ͚ͩͷ6*"MFSU$POUSPMMFSදࣔ΋ߦ͍΍͍͢ɻ ໾ׂ ϏδωεϩδοΫΛ୲౰͢Δ ໾ׂ σʔλΛΧϓηϧԽ͢Δ ໾ׂ 7JFX͔ΒͷೖྗΛड৴͠ɺ *OUFSBDUPS΁σʔλΛཁٻ͢Δɻ 6*,JUʹґଘͤͣɺ දࣔ͢Δ΋ͷΛ7JFXʹ఻͑Δɻ ॴ࣋ ௨஌ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ఻͑Δ
  25. %*1Λ࢖Θͳ͍͜ͱͷ σϝϦοτΛղܾ͢Δʹ͸ w $PSF%BUB3FBMNͳͲʹґଘ ͠ͳ͍Α͏ʹ w σʔλߏ଄ ʢ.BOBHFE0CKFDU 3FBMN0CKFDUʣΛϓϨʔϯ ͳ4USVDUʹม׵ͯ͠7JFX·

    Ͱ͍࣋ͬͯ͘ 7JFX 3PVUFS 1SFTFOUFS %FMFHBUF *OUFSBD ߋ৽Λ 3PVUFSΛॴ࣋͠ ը໘ભҠٴͼ දࣔΛߦ͏ 7JFXΛॴ࣋͠ ը໘ભҠΛ࣮ߦ͢Δ DPNQMFUJPO 3FTVMU ໾ׂ ΠϕϯτΛ1SFTFOUFSʹ఻͑ɺ σʔλͷදࣔΛߦ͏ɻ ໾ׂ ը໘ભҠ ΤϥʔΛ ໾ׂ 7JFX͔ΒͷೖྗΛड৴͠ *OUFSBDUPS΁σʔλΛཁ 6*,JUʹґଘͤͣɺ දࣔ͢Δ΋ͷΛ7JFXʹ఻ ॴ࣋ ௨஌ ૢ࡞ 1SFTFOUFSΛॴ࣋͠ ΞΫγϣϯΛ఻͑Δ ٭஫͜Ε͸ಛผ7*1&3తͳղܾํ๏ͱ͍͏Θ͚Ͱ͸͋Γ·ͤΜ
  26. ͜͜·Ͱͷ7*1&3·ͱΊ w ͳΜͰ͜Μͳ৭ʑͳ7*1&3͋Δͷʁ w ݫີʹ$"ʹԊ͓ͬͯΒͣϑϨʔϜϫʔΫґଘ͕͋Δ w ຊՈͷܕ໊ม਺໊ͷϨΨγʔײ w ݫີʹ$"ʹԊͬͯͳ͍͜ͱͷσϝϦοτ͸ʁ w

    ׂͱղܾͰ͖Δ w ͦ΋ͦ΋%#΍௨৴ϥΠϒϥϦΛஔ͖׵͑Δ͜ͱͬͯ͋Δ ͷ͔ʁͱ͍͏ׂΓ੾Γ΋ʜ
  27. ࢀߟʹͳΔ 7*1&3࣮૷͸ʁ

  28. 7*1&3ݚڀಡຊ w ͜ͷຊͳΓͷ7*1&3αϯϓϧ࡞੒ w νʔϜͰ΍ͬͯ͘ͷʹ͓͢͢Ί ͳ6TF$BTFϓϩτίϧ w ςετίʔυͷར༻Օॴ

  29. 6TF$BTF protocol UseCase where Failure: Error { associatedtype Parameters //

    Ҿ਺ͷܕ associatedtype Success // ੒ޭͨ͠ࡍͷܕ associatedtype Failure // ࣦഊ࣌ͷError΋NeverʹͰ͖ΔΑ͏ʹ func execute(_ parameters: Parameters, completion: ((Result<Success, Failure>) -> ())?) func cancel() } 7*1&3Λ࢖͍ͨ͘ͳΔཁٻͬͯɺܕʹቕΊΒΕ੍ͨ໿ͷ΋ͱͰ νʔϜͰϒϨͳ͘ϓϩάϥϛϯά͕͍ͨ͠Μ͡Όͳ͍ͷ͔ͳͱ
  30. 1SFTFOUFSΛςετ͍ͨ͠ͳΒ 5FTU%PVCMF 7JFX 5FTU%PVCMF 3PVUFS 1SFTFOUFS 5FTU%PVCMF *OUFSBDUPS &OUJUZ ςετ༻ͷσʔλ

    ΋͘͠͸ςετ༻ΤϥʔΛग़ྗ͢Δ ༻ҙͨ͠ςετσʔλΛηοτ͠ɺ ৗʹͦΕΛग़ྗ͢Δɻ 1SFTFOUFSͷΤϥʔϋϯυϦϯάΛ ςετ͚ͨ͠Ε͹ɺ ΤϥʔΛฦͤΔผͷ5FTU%PVCMF΋ ༻ҙ͢Δɻ 1SFTFOUFSͷग़ྗͱͯ͠7JFXͷEFMFHBUFϝιου͕ಈ࡞ɻ ͦͷϝιου͔Βظ଴஋ͱΛൺֱ͢Δ ظ଴஋ͱͷൺֱݕূՕॴ ςετίʔυ͔Βͷݺͼग़͠ 1SFTFOUFSͷग़ྗͱͯ͠3PVUFSʹσʔλ͕౉͞ΕΔ ͦͷϝιου͔Βظ଴஋ͱΛൺֱ͢Δ
  31. ॲཧܦ࿏Λ௵ͨ͢Ίʹ ςετίʔυ͸όϦΤʔγϣϯΛ૿΍͢

  32. ༨ஊ w ΫϦʔϯΞʔΩςΫνϟͰ΋ந৅Ͱ͸ͳ͘۩৅Λ࢖͍ͬͯ Δྫ͸͋Δʢ$"ຊୈষʣ w 4USJOH͸҆ఆͨ͠۩৅ͳͷͰґଘ͍͍ͯ͠ w 4USJOH͕ίϩίϩมΘΔ͜ͱ͸ؾʹ͠ͳ͍͍ͯ͘ w ґଘͨ͘͠ͳ͍ͷ͸มԽ͠΍͍͢۩৅ཁૉ

    ͨ·ʹϝδϟʔόʔδϣϯͰ࢓༷มΘͬͨΓ͢Δ3Y4XJGUΛ શϨΠϠʔͰ࢖ͬͯͦΕʹґଘ͢Δͷ͸ΫϦʔϯΞʔΩςΫνϟతͰ͸ͳ͍͚Ͳ ͦΕ͸֮ޛ͕͋ͬͯ΍ΔΜͳΒྑ͍ͱࢥ͍·͢