iOSアプリの設計とDependency Injection

iOSアプリの設計とDependency Injection

iOSオールスターズ2
https://eventdots.jp/event/602872

3fe447a7f9238108e6c50e97ac12717a?s=128

Kenichi Yonekawa

November 20, 2016
Tweet

Transcript

  1. 2.
  2. 3.
  3. 4.
  4. 5.
  5. 7.

    Dependency? TUSVDU5XFFUFS\ GVODUXFFU UXFFU4USJOH \ MFUBQJ5XJUUFS"QJ  BQJQPTU5XFFU UXFFU 

    ^ ^ TUSVDU5XJUUFS"QJ\ GVODQPTU5XFFU UXFFU4USJOH \ MFUDPOGJH/463-4FTTJPO$POGJHVSBUJPOEFGBVMU4FTTJPO$POGJHVSBUJPO  MFUTFTTJPO/463-4FTTJPO DPOGJHVSBUJPODPOGJH  MFUSFRVFTUCVJMESFRVFTU TFTTJPOEBUB5BTL8JUI3FRVFTU SFRVFTU  ^ ^ MFUUXFFUFS5XFFUFS  UXFFUFSUXFFU )FMMP  Tweeter TwitterApi HTTP Client
  6. 8.

    Dependency? TUSVDU5XFFUFS\ GVODUXFFU UXFFU4USJOH \ MFUBQJ5XJUUFS"QJ  BQJQPTU5XFFU UXFFU 

    ^ ^ TUSVDU5XJUUFS"QJ\ GVODQPTU5XFFU UXFFU4USJOH \ MFUDPOGJH/463-4FTTJPO$POGJHVSBUJPOEFGBVMU4FTTJPO$POGJHVSBUJPO  MFUTFTTJPO/463-4FTTJPO DPOGJHVSBUJPODPOGJH  MFUSFRVFTUCVJMESFRVFTU TFTTJPOEBUB5BTL8JUI3FRVFTU SFRVFTU  ^ ^ MFUUXFFUFS5XFFUFS  UXFFUFSUXFFU )FMMP  Tweeter TwitterApi HTTP Client
  7. 10.

    Solution TUSVDU5XFFUFS\ MFUBQJ5XJUUFS"QJ GVODUXFFU UXFFU4USJOH \ BQJQPTU5XFFU UXFFU  ^

    ^ TUSVDU5XJUUFS"QJ\ MFUIUUQ$MJFOU)551$MJFOU GVODQPTU5XFFU UXFFU4USJOH \ MFUSFRVFTUCVJMESFRVFTU IUUQ$MJFOUTFOE SFRVFTU  ^ ^ MFUBQJ5XJUUFS"QJ IUUQ$MJFOU)UUQ$MJFOU8JUI63-4FTTJPO  MFUUXFFUFS5XFFUFS BQJBQJ  UXFFUFSUXFFU )FMMP
  8. 11.

    Solution TUSVDU5XFFUFS\ MFUBQJ5XJUUFS"QJ GVODUXFFU UXFFU4USJOH \ BQJQPTU5XFFU UXFFU  ^

    ^ TUSVDU5XJUUFS"QJ\ MFUIUUQ$MJFOU)551$MJFOU GVODQPTU5XFFU UXFFU4USJOH \ MFUSFRVFTUCVJMESFRVFTU IUUQ$MJFOUTFOE SFRVFTU  ^ ^ MFUBQJ5XJUUFS"QJ IUUQ$MJFOU)UUQ$MJFOU8JUI63-4FTTJPO  MFUUXFFUFS5XFFUFS BQJBQJ  UXFFUFSUXFFU )FMMP
  9. 15.

    Pseudocode SFHJTUFS )551$MJFOUTFMG \ )551$MJFOUJO SFUVSO)UUQ$MJFOU8JUI63-4FTTJPO  ^ SFHJTUFS 5XJUUFS"QJTFMG

    \ 5XJUUFS"QJJO MFUVSM4FTTJPODPNQPOFOU /463-4FTTJPOTFMG  SFUVSO5XJUUFS"QJ VSM4FTTJPOVSM4FTTJPO  ^ SFHJTUFS 5XFFUFSTFMG \ 5XFFUFSJO MFUBQJDPNQPOFOU 5XJUUFS"QJTFMG  SFUVSO5XFFUFS BQJBQJ  ^ MFUUXFFUFSDPNQPOFOU 5XFFUFSTFMG  UXFFUFSUXFFU )FMMP 
  10. 16.

    Pseudocode SFHJTUFS )551$MJFOUTFMG \ )551$MJFOUJO SFUVSO"MBNPGJSF$MJFOU  ^ SFHJTUFS 5XJUUFS"QJTFMG

    \ 5XJUUFS"QJJO MFUVSM4FTTJPODPNQPOFOU /463-4FTTJPOTFMG  SFUVSO5XJUUFS"QJ VSM4FTTJPOVSM4FTTJPO  ^ SFHJTUFS 5XFFUFSTFMG \ 5XFFUFSJO MFUBQJDPNQPOFOU 5XJUUFS"QJTFMG  SFUVSO5XFFUFS BQJBQJ  ^ MFUUXFFUFSDPNQPOFOU 5XFFUFSTFMG  UXFFUFSUXFFU )FMMP 
  11. 22.

    Swinject Style MFUDPOUBJOFS$POUBJOFS  DPOUBJOFSSFHJTUFS "OJNBM5ZQFTFMG \@JO$BU OBNF.JNJ ^ DPOUBJOFSSFHJTUFS

    1FSTPO5ZQFTFMG \SJO 1FU0XOFS QFUSSFTPMWF "OJNBM5ZQFTFMG   ^ MFUQFSTPODPOUBJOFSSFTPMWF 1FSTPO5ZQFTFMG  QFSTPOQMBZ 
  12. 24.

    Cleanse Style TUSVDU"OJNBM.PEVMF$MFBOTF.PEVMF\ GVODDPOGJHVSF##JOEFS CJOEFSCJOEFS# \ CJOEFSCJOE "OJNBM5ZQFTFMG UP WBMVF$BU

    OBNF.JNJ  ^ ^ TUSVDU0XOFS$PNQPOFOU$MFBOTF$PNQPOFOU\ UZQFBMJBT3PPU1FSTPO5ZQF GVODDPOGJHVSF##JOEFS CJOEFSCJOEFS# \ CJOEFSJOTUBMM NPEVMF"OJNBM.PEVMF  CJOEFSCJOE 1FSTPO5ZQFTFMG UP GBDUPSZ1FU0XOFSJOJU  ^ ^ MFUQFSTPOUSZ0XOFS$PNQPOFOU CVJME  QFSTPOQMBZ
  13. 27.

    Protocol Oriented • ίϯϙʔωϯτؒΛૄ݁߹ʹ͢Δʹ͸ίϯϙʔωϯτͷΠ ϯλϑΣʔεΛ໌ࣔతʹ͠ͳ͍ͱ͍͚ͳ͍ɻΠϯλϑΣʔε ͕ಉ͡ͳΒ࣮૷ͷࠩ͠ସ͕͑༰қʹͳΔɻ QSPUPDPM)551$MJFOU\ GVODTFOE  ^

    DMBTT/463-4FTTJPO$MJFOU)551$MJFOU\ GVODTFOE \ /463-4FTTJPO EBUB5BTL8JUI3FRVFTU ǘ  ^ ^ DMBTT"MBNPGJSF$MJFOU)551$MJFOU\ GVODTFOE \ "MBNPGJSFSFRVFTU ǘ  ^ ^
  14. 28.

    Constructor Injection vs Property Injection • Property Injection͸֎෦ʹϓϩύςΟΛެ։͢Δඞཁ͕͋ ΓMutableʹ͠ͳ͍ͱ͍͚ͳ͍ͷͰجຊతʹ͸Constructor InjectionΛ͓קΊ͍ͨ͠

    • CleanseͷυΩϡϝϯτͰ͸Property Injection͸ AppDelegate΍StoryboardͳͲΠϯελϯεੜ੒Λ੍ޚͰ ͖ͳ͍έʔεͰ࢖͏ͱ͞Ε͍ͯΔ
  15. 29.

    prepareForSegue • ભҠݩͷViewController͕ભҠઌͷViewControllerʹ͍ͭͯ ஌Βͳ͍ͱ͍͚ͳ͍ɻભҠઌͷ࢓༷͕มΘͬͨΒભҠݩΛ ௚͞ͳ͍ͱ͍͚ͳ͍ɻ • ΠϯελϯεԽ͸StoryboardʹΑͬͯߦΘΕΔͷͰ PropertyInjectorΛ࢖ͬͯ஫ೖ͢Δ PWFSSJEFGVODQSFQBSF'PS4FHVF TFHVF6*4UPSZCPBSE4FHVF

    TFOEFS "OZ0CKFDU \ JGMFUWDTFHVFEFTUJOBUJPO7JFX$POUSPMMFSBT /FYU7JFX$POUSPMMFS\ MFUJOKFDUPSUSZ/FYU7JFX$POUSPMMFS$PNQPOFOU CVJME  JOKFDUPSJOKFDU1SPQFSUJFT JOUPWD  ^ ^
  16. 31.

    DI with arguments (Cleanse) TUSVDU/FYU7JFX$PNQPOFOU$MFBOTF$PNQPOFOU\ MFUJUFN*UFN UZQFBMJBT3PPU1SPQFSUZ*OKFDUPS/FYU7JFX$POUSPMMFS GVODDPOGJHVSF##JOEFS CJOEFSCJOEFS# \

    CJOEFSJOTUBMM NPEVMF7JFX.PEFM.PEVMF  CJOEFS CJOE1SPQFSUZ*OKFDUJPO0G /FYU7JFX$POUSPMMFSTFMG  UP\ WD/FYU7JFX$POUSPMMFS WJFX.PEFM7JFX.PEFM JO WJFX.PEFMJUFNJUFN WDWJFX.PEFMWJFX.PEFM ^ ^ ^ PWFSSJEFGVODQSFQBSF'PS4FHVF TFHVF6*4UPSZCPBSE4FHVF TFOEFS"OZ0CKFDU \ JGMFUWDTFHVFEFTUJOBUJPO7JFX$POUSPMMFSBT /FYU7JFX$POUSPMMFS\ MFUJUFN MFUJOKFDUPSUSZ/FYU7JFX$PNQPOFOU JUFNJUFN CVJME  JOKFDUPSJOKFDU1SPQFSUJFT JOUPWD  ^ ^
  17. 32.

    DI with arguments (Cleanse) TUSVDU/FYU7JFX$PNQPOFOU$MFBOTF$PNQPOFOU\ MFUJUFN*UFN UZQFBMJBT3PPU1SPQFSUZ*OKFDUPS/FYU7JFX$POUSPMMFS GVODDPOGJHVSF##JOEFS CJOEFSCJOEFS# \

    CJOEFSJOTUBMM NPEVMF7JFX.PEFM.PEVMF  CJOEFS CJOE1SPQFSUZ*OKFDUJPO0G /FYU7JFX$POUSPMMFSTFMG  UP\ WD/FYU7JFX$POUSPMMFS WJFX.PEFM7JFX.PEFM JO WJFX.PEFMJUFNJUFN WDWJFX.PEFMWJFX.PEFM ^ ^ ^ PWFSSJEFGVODQSFQBSF'PS4FHVF TFHVF6*4UPSZCPBSE4FHVF TFOEFS"OZ0CKFDU \ JGMFUWDTFHVFEFTUJOBUJPO7JFX$POUSPMMFSBT /FYU7JFX$POUSPMMFS\ MFUJUFN MFUJOKFDUPSUSZ/FYU7JFX$PNQPOFOU JUFNJUFN CVJME  JOKFDUPSJOKFDU1SPQFSUJFT JOUPWD  ^ ^
  18. 33.

    Mock Testing • API௨৴෦෼ͳͲΛϢχοτςετͷ࣌ʹ͸ϞοΫ࣮૷ʹࠩ ͠ସ͍͑ͨɻ • Cleanse͸ModuleΛOverride͢Δ͜ͱ͕Ͱ͖ΔͷͰϞοΫ ࣮૷ͱͷࠩ͠ସ͕͑༰қ͚ͩͲɾɾɾ TUSVDU'BLF.PEVMF0WFSSJEF.PEVMF\ UZQFBMJBT0WFSSJEFT5XFFUFS$PNQPOFOU

    GVODDPOGJHVSF##JOEFS CJOEFSCJOEFS# \ CJOEFSJOTUBMM NPEVMF'BLF5XJUUFS"QJ.PEVMF  ^ ^ JGVTF'BLF.PEF\ JOKFDUPSUSZ$PNQPOFOU XJUI0WFSSJEFT PWFSSJEF.PEVMF'BLF.PEVMF CVJME  ^FMTF\ JOKFDUPSUSZ$PNQPOFOU CVJME  ^
  19. 34.

    Do Not Use Fake Mode • ίϯϙʔωϯτఆٛΛ্ॻ͖͢Δͷ͸ίϯϙʔωϯτؒͷґଘͷ ࿈࠯ΛಡΈͮΒ͘͢ΔͷͰΑ͘ͳ͍ʢCleanseͰ΋͜ͷػೳΛ࡟ আ͢ΔPR͕ग़ͯΔʣ •

    ૉ௚ʹϢχοτςετ࣌ʹϞοΫ͢Δ΂͖ɻґଘΦϒδΣΫτ͸ ԿΒ͔ͷܗͰ֎෦͔Β౉ͤΔઃܭʹͳ͍ͬͯΔ͔Β؆୯ͳ͸ͣ DMBTT5XJUUFS"QJ5FTUT9$5FTU$BTF\ WBSTVCKFDU5XJUUFS"QJ MFUTFTTJPO.PDL63-4FTTJPO  PWFSSJEFGVODTFU6Q \ TVQFSTFU6Q  TVCKFDU5XJUUFS"QJ TFTTJPOTFTTJPO  ^ ^
  20. 36.