SwiftでわかるSOLID原則 iOSDC 2020

SwiftでわかるSOLID原則 iOSDC 2020

iOSDC 2020の発表に用いた資料

0e742980c48d689f31700b208f22fd5a?s=128

Kohei Kawaguchi

September 21, 2020
Tweet

Transcript

  1. J04%$+BQBO!L@LPIFZJ 4XJGUͰΘ͔Δ40-*%ݪଇ J04ͷ։ൃࣄྫʹ߹Θͤͯ෼Ͱ঺հ 

  2.  ֶੜ࣌୅ελʔτΞοϓͰ J04ΞϓϦ։ൃΛ͍ͯͨ͠ ࢲ͸౓ʑ͜ͷΑ͏ͳ͜ͱΛ ߟ͍͑ͯ·ͨ͠ 

  3.  ࣗ෼͸ ࣗ෼͸ػೳ௥ՃΛ ͍ͯ͠Δ͕

  4.  ࣗ෼͸ ͦͷ࣮ ௥Ճ͍ͯ͠Δͷ͸ ػೳͰ͸ͳ͘ όάͳͷͰ͸ʁʁ

  5.  IUUQTXXXESPQCPYDPNTIOTJHWQSNJNWKSB""$//LWD8/I:&SHBJ4876B EM ϦϦʔεຖʹൃੜ͢Δόά  ͦΕΛमਖ਼͢Δෛͷϧʔϓ

  6. 40-*%ݪଇ มߋʹڧ͘ཧղ͠΍͍͢γεςϜΛ࡞ΔͨΊͷݪଇ ͭͷઃܭݪଇͷ಄จࣈΛऔ໊ͬͨલʹͳ͍ͬͯΔ 

  7. J04։ൃʹབྷΊͯ 40-*%ݪଇ Ұ෦ Λઆ໌͠Α͏ ͱ͍͏ࢼΈͰ͢ ͜ͷൃද͸ 

  8. ୯Ұ੹೚ͷݪଇ  4JOHMF3FTQPOTJCJMJUZ1SJODJQMF

  9. ୯Ұ੹೚ͷݪଇ ֓ཁ w ͋ΔΫϥεʢߏ଄ମ΍ྻڍܕʹؔͯ͠΋ಉ͡ʣ͸ͭͷΞΫλʔʹରͯ͠ ੹຿Λෛ͏΂͖Ͱ͋Δ w ΞΫλʔσβΠφʔ΍ϓϥϯφʔ౳ͷεςʔΫϗϧμʔɽࢀߟจݙͰ͸$50΍ $&0͕֘౰͢Δͱઆ໌͞Ε͍ͯΔɽ 

  10. ୯Ұ੹೚ͷݪଇ ֓ཁ w ͋ΔΫϥεʢߏ଄ମ΍ྻڍܕʹؔͯ͠΋ಉ͡ʣ͸ͭͷΞΫλʔʹରͯ͠ ੹຿Λෛ͏΂͖Ͱ͋Δ w ΞΫλʔσβΠφʔ΍ϓϥϯφʔ౳ͷεςʔΫϗϧμʔɽࢀߟจݙͰ͸$50΍ $&0͕֘౰͢Δͱઆ໌͞Ε͍ͯΔɽ ͋ΔΞΫλʔͷཁٻʹΑΔมߋ͕ ผͷΞΫλʔͷཁٻΛյͯ͠͠·͏Մೳੑ͕͋Δ

    
  11. ୯Ұ੹೚ͷݪଇʹ ै͍ͬͯͳ͍ྫ 

  12.  ୯Ұ੹೚ͷݪଇ ै͍ͬͯͳ͍ྫ ͳΜͰ΋೚ͤͯԼ͍͞ʂʂ ੹೚ײڧ͗͢Δ

  13. 破…!!! 破…!!!  ͋ΔΞΫλʔͷཁٻ͕΋͏ҰํͷΞΫλʔͷมߋΛഁյ͢Δ౳ͷӨڹΛٴ΅͢Մೳੑ͕͋Δɽ খ͍͞Өڹͩͱɼ(JUͷίϯϑϦΫτͳͲ͕ߟ͑ΒΕΔɽ

  14. ୯Ұ੹೚ͷݪଇʹ ै͏Α͏ʹΫϥεΛ ෼͚Δ 2͡Ό͋Ͳ͏͢Δͷʁ 

  15. ୯Ұ੹೚ͷݪଇʹैͬͯ੹຿Λ෼཭ͨ͠Ұྫ 6*7JFX$POUSPMMFS ભҠઌΛܾఆ͢Δॲཧ $PPSEJOBUPS ભҠΞχϝʔγϣϯ σβΠφʔ ભҠΞχϝʔγϣϯ ΛϦονʹʂ มߋΛཁٻ ϓϥϯφʔ

    ભҠॲཧΛҕৡ ભҠઌͷը໘Λ มߋ͍ͨ͠ʂ มߋΛཁٻ  $PPSEJOBUPSύλʔϯը໘ભҠʹؔ͢Δ੹຿Λ$PPSEJOBUPSͱݺ͹ΕΔΫϥε΁ҕৡ͢Δ࣮૷ύλʔϯ
  16. ୯Ұ੹೚ͷݪଇʹैͬͯ੹຿Λ෼཭ͨ͠Ұྫ 6*7JFX$POUSPMMFS ભҠઌΛܾఆ͢Δॲཧ $PPSEJOBUPS ભҠΞχϝʔγϣϯ σβΠφʔ ભҠΞχϝʔγϣϯ ΛϦονʹʂ มߋΛཁٻ ϓϥϯφʔ

    ભҠॲཧΛҕৡ ભҠઌͷը໘Λ มߋ͍ͨ͠ʂ มߋΛཁٻ  $PPSEJOBUPSύλʔϯը໘ભҠʹؔ͢Δ੹຿Λ$PPSEJOBUPSͱݺ͹ΕΔΫϥε΁ҕৡ͢Δ࣮૷ύλʔϯ
  17. ୯Ұ੹೚ͷݪଇʹैͬͯ੹຿Λ෼཭ͨ͠Ұྫ 6*7JFX$POUSPMMFS ભҠઌΛܾఆ͢Δॲཧ $PPSEJOBUPS ભҠΞχϝʔγϣϯ σβΠφʔ ભҠΞχϝʔγϣϯ ΛϦονʹʂ มߋΛཁٻ ϓϥϯφʔ

    ભҠॲཧΛҕৡ ભҠઌͷը໘Λ มߋ͍ͨ͠ʂ มߋΛཁٻ  $PPSEJOBUPSύλʔϯը໘ભҠʹؔ͢Δ੹຿Λ$PPSEJOBUPSͱݺ͹ΕΔΫϥε΁ҕৡ͢Δ࣮૷ύλʔϯ
  18. ୯Ұ੹೚ͷݪଇʹैͬͯ੹຿Λ෼཭ͨ͠Ұྫ 6*7JFX$POUSPMMFS ભҠઌΛܾఆ͢Δॲཧ $PPSEJOBUPS ભҠΞχϝʔγϣϯ σβΠφʔ ભҠΞχϝʔγϣϯ ΛϦονʹʂ มߋΛཁٻ ϓϥϯφʔ

    ભҠॲཧΛҕৡ ભҠઌͷը໘Λ มߋ͍ͨ͠ʂ มߋΛཁٻ 9$PPSEJOBUPSΛ༻͍ͨྫ IUUQTHJUIVCDPNRVJDLCJSETUVEJPT9$PPSEJOBUPS͔ΒҰ෦Ҿ༻ 
  19. ݪଇʹै͏ͱ֤ΞΫλʔʹΑΔมߋ͕͓ޓ͍ʹׯব͠ͳ͍ͨΊ յΕʹ͍͘ઃܭͱͳͬͨ 6*7JFX$POUSPMMFS ભҠઌΛܾఆ͢Δॲཧ $PPSEJOBUPS ભҠΞχϝʔγϣϯ σβΠφʔ ભҠΞχϝʔγϣϯ ΛϦονʹʂ มߋΛཁٻ

    ϓϥϯφʔ ભҠॲཧΛҕৡ ભҠઌͷը໘Λ มߋ͍ͨ͠ʂ มߋΛཁٻ 
  20. Ϧείϑͷஔ׵ݪଇ  -JTLPWTVCTUJUVUJPOQSJODJQMF

  21. Ϧείϑͷஔ׵ݪଇ ֓ཁ ͋Δܕ"ͱަ׵Մೳͳܕ#Λ࢖༻Ͱ͖Δ৔߹ɼ#͸"ͱಉ͡ৼΔ෣͍Λ͢Δ͜ͱ Λอূ͞Εͳ͍ͱ͍͚ͳ͍ 

  22. Ϧείϑͷஔ׵ݪଇ ֓ཁ ͋Δܕ"ͱަ׵Մೳͳܕ#Λ࢖༻Ͱ͖Δ৔߹ɼ#͸"ͱಉ͡ৼΔ෣͍Λ͢Δ͜ͱ Λอূ͞Εͳ͍ͱ͍͚ͳ͍ ͋ΔܕΛ֦ு͢Δຖʹमਖ਼͕ ඞཁʹͳΔՄೳੑ͕͋Δ 

  23. Ϧείϑͷஔ׵ݪଇ ໰͍ ΦϒδΣΫτࢦ޲ݴޠͳΒܧঝʹΑͬͯৗʹຬͨͤͦ͏ʁ BEE4VC7JFX 6*7JFX ʹରͯ͠ 6*7JFXͷαϒλΠϓʢ&MMJQTF7JFXʣΛ ౉͢͜ͱ͕Ͱ͖Δ 

  24. Ϧείϑͷஔ׵ݪଇ ໰͍ ΦϒδΣΫτࢦ޲ݴޠͳΒܧঝʹΑͬͯৗʹຬͨͤͦ͏ʁ BEE4VC7JFX 6*7JFX ʹରͯ͠ 6*7JFXͷαϒλΠϓʢ&MMJQTF7JFXʣΛ ౉͢͜ͱ͕Ͱ͖Δ 

  25. ৼΔ෣͍·Ͱަ׵ՄೳʹͳΔ͜ͱ͸୲อ͞Εͳ͍ 7JFXͷഎܠͱڥքઢͷ৭Λม͑Δ6*7JFXͷ֦ுؔ਺ͷྫ  ͜ͷϝιου͸શͯͷ6*7JFXͷαϒλΠϓ ʹ͓͍ͯಉ͡Α͏ʹৼΔ෣͏͔ʁʁ

  26. ৼΔ෣͍·Ͱަ׵ՄೳʹͳΔ͜ͱ͸୲อ͞Εͳ͍ 6*4UBDL7JFXΛ༻͍ͨ൓ྫʢ9DPEFҎલʣ )PHF7JFX 'VHB7JFX 6*7JFX pMM*ODMVEJOH#PSEFS 6*4UBDL7JFX 9DPEF͔ΒCBDLHSPVOE$PMPSʹΑΔഎܠ৭ͷมߋ͕ՄೳͱͳΓ·ͨ͠IUUQTUXJUUFSDPNMBZPVU4VCWJFXTTUBUVT T આ໌ͷͨΊʹ6*4UBDL7JFXΛ࣋ͪग़͕ͨ͠ɼ6*,JU͸ͦΜͳʹසൟʹมߋ͕ೖΔ΋ͷͰ͸ͳ͍͠ɼ͜ͷ-41ҧ൓͸େͨ͠໰୊Ͱ͸ͳ͍ͱ͍͏ೝࣝͰ͢

    
  27. ৼΔ෣͍·Ͱަ׵ՄೳʹͳΔ͜ͱ͸୲อ͞Εͳ͍ 6*4UBDL7JFXΛ༻͍ͨ൓ྫʢ9DPEFҎલʣ )PHF7JFX 'VHB7JFX 6*7JFX pMM*ODMVEJOH#PSEFS 6*4UBDL7JFX ͜͜Ͱॲཧͷ෼ذ ͕ඞཁʹͳΔ 

  28. ৼΔ෣͍·Ͱަ׵ՄೳʹͳΔ͜ͱ͸୲อ͞Εͳ͍ 6*4UBDL7JFXΛ༻͍ͨ൓ྫ )PHF7JFX 'VHB7JFX 6*7JFX pMM*ODMVEJOH#PSEFS 6*4UBDL7JFX ͜͜Ͱॲཧͷ෼ذ ͕ඞཁʹͳΔ 

    UIKit͸සൟʹมߋ͕ՃΘΒͳ͍ͨΊ͞΄Ͳ໰୊ʹͳΒͳ͍͕ αϒλΠϓΛ௥Ճ͢Δ౓ʹ ྫ֎ͷ֬ೝͱରԠΛ͢Δඞཁ͕͋Δͷ͸ ඇৗʹ໽հ
  29. Ϧείϑͷஔ׵ݪଇҧ൓ͷ؆қνΣοΫ ࣗ਎͕ఆٛͨ͠ܕ͕มߋʹڧ͍͔Λ֬ೝ͢Δͷʹ࢖͑Δ w ܧঝઌͰୀԽ͍ͯ͠ΔϝιουŋϓϩύςΟ͸ͳ͍͔ w ྫʣܧঝݩͰ͸࣮૷͕͋ΔͷʹɼܧঝઌͰ͸ۭ࣮૷ʹͳ͍ͬͯΔϝιου w ܧঝઌͰܧঝݩͰ౤͍͛ͯͳ͍ྫ֎Λ౤͍͛ͯͳ͍͔ w ྫʣ4XJGUͰ͸ΤϥʔΛ౤͛ͳ͍ϝιουΛΦʔόʔϥΠυͯ͠

    ΤϥʔΛ౤͛ΔΑ͏ͳมߋ͸Ͱ͖ͳ͍ɽ w ແཧ΍ΓGBUBM&SSPSΛى͜͢͜ͱ͸Մೳɽ 
  30. ґଘੑٯసͷݪଇ  %FQFOEFODZJOWFSTJPOQSJODJQMF

  31. ґଘੑٯసͷݪଇ ֓ཁ w ؆୯ʹݴ͏ͱɼʮந৅ʹґଘͤΑɽʯͱ͍͏ܦݧଇɽ w มߋ͞Ε΍͍͢۩৅ΫϥεΛܧঝͨ͠Γ໊ࢦ͠Ͱࢀরͨ͠Γͯ͠͸͍͚ͳ͍  ٯసͱ͸ɼґଘͷ޲͖͕ٯ޲͖ʹͳΔ͜ͱɼґଘͷํ޲ͱΠϯλϑΣʔεͷॴ༗ݖ͕ٯʹͳΔ͜ͱΛࢦ͢

  32. ґଘੑٯసͷݪଇ ֓ཁ w ؆୯ʹݴ͏ͱɼʮந৅ʹґଘͤΑɽʯͱ͍͏ܦݧଇɽ w มߋ͞Ε΍͍͢۩৅ΫϥεΛܧঝͨ͠Γ໊ࢦ͠Ͱࢀরͨ͠Γͯ͠͸͍͚ͳ͍ ଟ͘ͷ৔߹ʹ͓͍ͯ۩৅ΫϥεΑΓ ΠϯλϑΣʔεͷํ͕มߋ͞Εʹ͍ͨ͘Ί ͜ͷݪଇʹै͏ͱมߋʹڧ͍ઃܭʹͳΔ 

    ٯసͱ͸ɼґଘͷ޲͖͕ٯ޲͖ʹͳΔ͜ͱɼґଘͷํ޲ͱΠϯλϑΣʔεͷॴ༗ݖ͕ٯʹͳΔ͜ͱΛࢦ͢
  33. ґଘੑٯసͷݪଇ ֓ཁ w ؆୯ʹݴ͏ͱɼʮந৅ʹґଘͤΑɽʯͱ͍͏ܦݧଇɽ w มߋ͞Ε΍͍͢۩৅ΫϥεΛܧঝͨ͠Γ໊ࢦ͠Ͱࢀরͨ͠Γͯ͠͸͍͚ͳ͍ ଟ͘ͷ৔߹ʹ͓͍ͯ۩৅ΫϥεΑΓ ΠϯλϑΣʔεͷํ͕มߋ͞Εʹ͍ͨ͘Ί ͜ͷݪଇʹै͏ͱมߋʹڧ͍ઃܭʹͳΔ 

    ٯసͱ͸ɼґଘͷ޲͖͕ٯ޲͖ʹͳΔ͜ͱɼґଘͷํ޲ͱΠϯλϑΣʔεͷॴ༗ݖ͕ٯʹͳΔ͜ͱΛࢦ͢ Մೳͳͷ͔ʁ
  34. ໊ࢦ͠ͷࢀরΛ࠷খݶʹ͢Δํ๏ ґଘੑ஫ೖΛ༻͍ͨࣄྫ w 4XJOKFDUͷΑ͏ͳґଘੑ஫ೖΛߦ͏࣮૷Λ༻͍Δ͜ͱʹΑͬͯɼ۩৅Ϋϥε ͷࢀরΛ࠷খݶʹͰ͖Δɽ ϓϩτίϧͱ ॳظԽʹඞཁͳ ύϥϝʔλ ۩৅Ϋϥεͷ Πϯελϯε

    ίϯςφʹ͋Δ 1FSTPOBMϓϩτίϧ ʹ४ڌͨ͠ΠϯελϯεΛԼ͍͞ 4VQFS1FSTPOͷΠϯελϯε ͕ొ࿥͞Ε͍ͯΔͷͰ ίϨΛ࢖͍ͬͯͩ͘͞ʂ  ຊൃදͰ͸ΠϯλϑΣʔεͱϓϩτίϧΛҙຯతʹ࢖Θ͚ͳ͍ɽͨͩ͠ɼϓϩτίϧͱ࢖͏ͱ͖͸ΑΓ4XJGUͷݴޠ࢓తͳഎܠ͕ڧ͍ɽ
  35. ໊ࢦ͠ͷࢀরΛ࠷খݶʹ͢Δํ๏ ґଘੑ஫ೖΛ༻͍ͨࣄྫ w 4XJOKFDUͷΑ͏ͳґଘੑ஫ೖΛߦ͏࣮૷Λ༻͍Δ͜ͱʹΑͬͯɼ۩৅Ϋϥε ͷࢀরΛ࠷খݶʹͰ͖Δɽ %*ίϯςφʹ͸ ۩৅Ϋϥεͷొ࿥ʢࢀরʣ ͕ඞཁ 

  36. ໊ࢦ͠ͷࢀরΛ࠷খݶʹ͢Δํ๏ ґଘੑ஫ೖΛ༻͍ͨࣄྫ w 4XJOKFDUͷΑ͏ͳґଘੑ஫ೖΛߦ͏࣮૷Λ༻͍Δ͜ͱʹΑͬͯɼ۩৅Ϋϥε ͷࢀরΛ࠷খݶʹͰ͖Δɽ 1SPUPDPM͑͞஌͍ͬͯΕ͹ ۩৅ΫϥεΛࢀর͢Δ͜ͱͳ͘ ͦͷΠϯελϯεΛऔಘͰ͖Δ 

  37. ໊ࢦ͠ͷࢀরΛ࠷খݶʹ͢Δํ๏ ґଘੑ஫ೖΛ༻͍ͨࣄྫ w 4XJOKFDUͷΑ͏ͳґଘੑ஫ೖΛߦ͏࣮૷Λ༻͍Δ͜ͱʹΑͬͯɼ۩৅Ϋϥε ͷࢀরΛ࠷খݶʹͰ͖Δɽ 1SPUPDPM͑͞஌͍ͬͯΕ͹ ۩৅ΫϥεΛࢀর͢Δ͜ͱͳ͘ ͦͷΠϯελϯεΛऔಘͰ͖Δ  ݪଇʹै͏͜ͱʹΑͬͯ

    มߋ͞Ε΍͍͢ ۩৅ΫϥεͷࢀরΛආ͚ͳ͕Β ։ൃ͕Ͱ͖ΔΑ͏ʹͳͬͨ
  38. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ 4XJGUͰΘ͔Δ40-*%ݪଇ!L@LPIFZJ w 40-*%ݪଇ w มߋʹڧ͘ཧղ͠΍͍͢γεςϜΛ࡞ΔͨΊʹ༗ӹ w ୯Ұ੹೚ͷݪଇ w ͋ΔΫϥε͸ͭͷΞΫλʔ܈ʹରͯ͠੹຿Λෛ͏΂͖Ͱ͋Δ

    w Ϧείϑͷஔ׵ݪଇ w ͋Δܕ"ͱަ׵Մೳͳܕ#Λ࢖༻Ͱ͖Δ৔߹ɼ#͸"ͱಉ͡ৼΔ෣͍Λ͢ Δ͜ͱΛอূ͞Εͳ͍ͱ͍͚ͳ͍ w ґଘੑٯసͷݪଇ w ந৅ʹґଘͤΑ w ͦͷଞͷݪଇ w ͕࣌ؒ଍ΓͣൃදͰ͖·ͤΜͰͨ͠ϒϩάʹ·ͱΊ·͢ɽ   5XJUUFSʢ!L@LPIFZJʣ ͜ͷࢿྉ͓Αͼ ΑΓৄࡉͳݪଇͷઆ໌ࢿྉ ΛπΠʔτ͍ͯ͠·͢
  39. ࢀߟจݙ ॻ੶ • <>3PCFSU$.BSUJOɼ੉୩ܒհɽΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛୈ൛ΦϒδΣΫτࢦ޲։ൃͷਆ਷ͱঊͷٕʢʣ4#ΫϦΤΠ ςΟϒ • <>3PCFSU$.BSUJOɼ֯੐యɼߴ໦ਖ਼߂ɽ$MFBO"SDIJUFDUVSFୡਓʹֶͿιϑτ΢ΣΞͷߏ଄ͱઃܭʢʣ,"%0,"8" هࣄ • ΠϯλʔϑΣΠε෼཭ͷݪଇIUUQTUIJOLPOPCKFDUCMPHTQPUDPNJOUFSGBDFTFHSFHBUJPOQSJODJQMFJTQUPQIUNM

    • 40-*%ݪଇΛཧղ͢ΔIUUQTTIUOLHNDPNTPMJEIUNM • ΠϯλʔϑΣʔε෼཭ͷ๏ଇ *41 IUUQIBSVNJTBLVSBOFKQXPSEQSFTT &"&#&#'&#$&&"&#$&#& &#"&"&&#&JTQ • 4XJGUJ04ʹ͓͚Δ40-*%Š4JOHMF3FTQPOTJCJMJUZ1SJODJQMFIUUQTNFEJVNDPN!SJ[VNJUBTXJGU JPT&"#&"&&#TPMJETJOHMFSFTQPOTJCJMJUZQSJODJQMFBFBEEF • Α͘Θ͔Δ40-*%ݪଇ%ʢґଘੑٯసͷݪଇʣIUUQTOPUFDPNFSVLJUJOOFF • աڈʹ։࠵ͨ͠ňΞδϟΠϧιϑτ΢ΣΞ։ൃͷԞٛʼnͷษڧձʹͯ༻͍ΒΕͨࢿྉͨͪ ◦ IUUQTTQFBLFSEFDLDPNDIJHJDIBOBQQMJDBUJPOEFTJHONJBORJBOHIVJOVNCFS ◦ IUUQTTQFBLFSEFDLDPNL@LPIFZBQQMJDBUJPOEFTJHONJBORJBOHIVJOVNCFS