Amebaͷઃܭͱ͜Ε͔Β~ΧΦε͔Βͷ٫ͱ࠶ͼΧΦεΛੜΈग़͞ͳ͍ྗʙ2020/1/30
View Slide
1.ࣗݾհ&ϓϩμΫτհ2.ΧΦε͗ͨ͢ઃܭ3.ϦΞʔΩςΫνϟ:yatteiki:4.݁Ռͱະདྷ
ࣗݾհ&ϓϩμΫτհ
ࣗݾհˍϓϩμΫτհ• ࡾ ढ़࡞• 2017த్ೖࣾ Ameba iOS։ൃϦʔμʔ• 2010ϦϦʔε• Twitter/shun_sakuuu• Github/shun-mk
ΧΦε͗ͨ͢ઃܭ
ΧΦε͗ͨ͢ઃܭ• 2010ʹϦϦʔε͞Ε10Ҏ্ӡ༻Λ͍ͯ͠ΔΞϓϦ• ࣌ͷྲྀΕͷதͰͨ͘͞Μͷసظ• WebViewΞϓϦ͔ΒϑϧωΠςΟϒʹ• Objective-C͔ΒSwiftʹ• વνʔϜͷϝϯόʔͷೖΕସΘΓܹ͍͠• ࣌ͷྲྀΕͷதͰ࣌σϑΝΫτͩͱݴΘΕ͖ͯͨઃܭͨ͘͞Μ͋Δ• ΧΦε͔Β٫͠Α͏ͱͯ͠ૡ͍ͨࠟɻɻɻ
MVC• ଏʹݴ͏FatViewController• ΊͬͪΌViewControllerͰAPI௨৴ͯ͠Δ• ViewControllerͰAPI௨৴ͱ͔ॻ͍ͪΌͩΊͩΑʁ͍ͬͯ͏࣌ͷἤΓΛड͚ͨͷ͔HogeHogeManagerͱ͔HogeHogeHelperͱ໋໊͔͔ΒԿ͢Δͷ͔Α͘Θ͔Βͳ͍Ϋϥε͕API௨৴Λ࣋ͬͯͨΓ͢Δ• વςετͳ͍
VIPER• Ұ෦VIPERͷߏͰ࡞ΒΕͯΔը໘͕͋Δ• ͓ͦΒ͘͜ΕAmebaΛΧΦε͔Β٫͢ΔͨΊʹઓͨ͠Ұͭͳͷ͔ͳʁ• ઃܭࢿྉ͕ͳ͘Ͳ͏͍͏ࢥͰͲ͏͍͏ߏʹͳ͍ͬͯΔͷ͔͕ඇৗʹ͔ΓͮΒ͍• વςετͳ͍
ΧΦε͗ͨ͢ઃܭ• ৽نը໘Λ࣮͢Δ࣌Ͳ͏͍͏ઃܭʹ͢Ε͍͍͔ຖճ0͔Βߟ͑Δͷ݁ߏେม• ͔͠ਓͦΕͧΕ͜Ε͕͍͍͍ͬͯ͏ͷ͕ҧ͏ͷͰϨϏϡʔίετΓΓ• ͦͷઃܭʹͨ͠ΤϯδχΞ͕͍ͳ͘ͳΔͱෛ࠴ײ͕ੌ͍• ઃܭ͕΅ΜΓ&ີ݁߹&ςετಛʹͳ͘Կ͕ਖ਼ͷಈ͖ͳͷ͔Θ͔Βͳ͍ͷࡾॏۤͰ༷มߋػೳՃʹ༨ʹ͕ൃੜ͢Δঢ়ଶʹ
ϦΞʔΩςΫνϟ:yatteiki:
ͬ͘͟Γͱͨ͠ํ• ࠓճͷϦΞʔΩςΫνϟͰࢦͨ͠࠷ऴܕMVVM ʴ Flux• ಋೖ͕ਐΜͰ͍ͳ͔ͬͨRxSwiftϦΞʔΩςΫνϟʹ߹ΘͤͯਐΊΔ• ͔ͤͬ͘ઃܭ͢͠ͳΒςετͷ࣮·Ͱߟ͑ΒΕͯΔઃܭʹ͍ͨ͠• ςετॻ͘ͳΒCIͷڥݟͯ͠ςετΛॻ͘͜ͱʹҙຯ͕͋Δঢ়ଶΛ࡞Γ͍ͨ• ઃܭҊʹؔͯ͠ৗʹνʔϜͰ͢Γ߹ΘͤΛߦ͏(୭͔ҰਓͷઃܭΛօ͕ਅࣅͯ͠ॻ͚ͩ͘ͷঢ়ଶආ͚͍ͨ)
MVVM• Ұൠతʹࢥ͍ු͔ͿMVVMͱ΄΅มΘΒͳ͍ߏ• 1ը໘ͷϩδοΫ͕ෳࡶͳը໘͕ͦͦ͋͜͜Δͷͱෳͷը໘͕ಉظ͠ͳ͍͚ͯ͘ͳ͍Α͏ͳ༷͕ଟ͍Θ͚Ͱͳ͔ͬͨͷͰγϯϓϧͳMVVMΛ࠾༻ͨ͠• ViewͱViewModelͷbindingΛ͢ΔͨΊͷFrameworkRxSwiftΛ࠾༻(ࣾʹ͓͚Δ࠾༻࣮ΛؑΈܾͯఆ)
MVVM• ॳظViewModelͷߏinitͰPublishSubjectΛੜ͠ObserverͱObservableͷϓϩύςΟʹηοτͯ͠ߪಡ͢Δܗʹ͍ͯͨ͠• ؆୯ͳը໘ͳΒˢͷ࣮ͰࠔΔ͜ͱಛʹͳ͍• ViewModelͷIn-OutͷI/F͕࣮ऀʹҕͶΒΕ͓ͯΓϨϏϡʔίετ͕ංେԽ• ෳࡶͳॲཧ͕ೖͬͯ͘Δͱinit͕ஶ͘͠ංେԽ͠ϝϯςίετ͕ര૿ͨ͠
MVVM• ViewModelͷinitͰߦ͍ͬͯͨObservableͷՃAPI௨৴ɺViewදࣔ༻ͷModelͷTranslatorݺͼग़͠ΛUsecaseͱͯ͠Γग़͠• ViewModelͷInputͱOutputΛProtocolʹΓग़͠In-OutͷI/FΛڞ௨Խ• ViewModelͷinitͰߦΘΕ͍ͯͨॲཧΛͦΕͧΕͷຖʹΓग़͠ංେԽΛ͙ͱͱʹখ͍͞୯ҐͰςετ͕ॻ͚ΔΑ͏ʹ
Flux• MVVMͷΈͩͱ࣮ݱ͢ΔͷʹࡶԽ͢ΔΑ͏ͳ༷͕ग़͖ͯͨ• ϩάΠϯ/ϩάΞτʹΑͬͯΞϓϦશମͷঢ়ଶΛΓସ͑ͨΓɺλϒͷΑ͏ͳը໘Ͱߋ৽௨ΛϒϩʔυΩϟετͨ͠Γ• ࠷ॳObserverͱObservableΛI/Fʹ࣋ͭSingletonͷΦϒδΣΫτΛར༻ͯ͠ղܾ͍ͯ͠ΔՕॴ͕͋ͬͨԿ༷ʹѱ͍͜ͱ͕Ͱ͖ͯ͠·͏ͷͱεέʔϧ͢ΔΠϝʔδ͕ͳ͔ͬͨͨΊղܾ͔ͨͬͨ͠
Flux• Fluxര• σʔλϑϩʔFacebookͷFluxͱಉ༷• ඇRxґଘ -> StoreViewModelͱbindͤͨ͞΄͏͕߹͕ྑ͍Օॴ͕͋ΔͷͰStoreͷϕʔεΫϥεʹExtensionͰObservableʹม͢ΔॲཧΛՃ͍ͯ͠Δ
Flux• Fluxͷར༻ऀStoreͷΠϯελϯεΛੜ͠దٓbind͢Δ• SingletonͰ࣮͍ͯͨ࣌͠ͱҧ͍ར༻ऀଆ͕ඞཁͳΠϕϯτStateΛ࣋ͭStore͚ͩΛݟΕ͍͍ͨΊෆཁͳObservableΛߪಡ͢Δ͜ͱΛ͛Δ• ංେԽ͠ଓ͚Δະདྷ͔͠ݟ͑ͳ͔ͬͨSingleton͔ΒඞཁʹԠͯ͡ܗΛม͑ΔStoreΛੜͰ͖ΔΑ͏ʹͳͬͨͷͰεέʔϧ͢Δײ• σʔλϑϩʔ୯ํͳͷͰAPI௨৴͕ඞཁʹͳΔॲཧͰΩϨΠͳߏΛอͭ͜ͱ͕Ͱ͖ΔΑ͏ʹ
ͨͩ͠
Flux• ར༻ՕॴͪΌΜͱߟ͑Δ͜ͱ• FluxΛར༻͢Δඞཁ͕ͳ͍ը໘FluxͰ࣮͢Δͱٯʹࡶʹͳͬͯ͠·͏ՄೳੑΛሃΜͰ͍Δ• MVVMͰΩϨΠʹ࡞Εͳ͍ॲཧͷྲྀΕ͕͋ΔΑ͏ͳͱ͖ʹબࢶͱͯ͠ར༻• ݸਓతʹNotificationCenterͱ͔ObserverύλʔϯͰຖճಠࣗͷศརΫϥε࡞ΔΑΓஅવFlux
݁Ռͱະདྷ
ྑ͔ͬͨ• ৽࣮͘͠͞ΕΔը໘ͷ࡞Γ͕͋Δఔ౷Ұ͞Ε͍ͯΔͷϨϏϡʔίετΛߟ͑ͯѹతʹྑ͍• Ұਓ͕ઃܭ͢ΔͷͰͳ͘ɺνʔϜͰ͖ͬͪΓೝࣝΛ߹Θͤͳ͕ΒਐΊΔ͜ͱͰઃܭΛߟ͑Δେࣄ͕͞ਁಁͨ͠ײ͕ͨ͡͠• ઃܭͷࢿྉͳͲ͕ࣾͷυΩϡϝϯτʹ͞Ε͍ͯΔঢ়ଶΛ࡞Εͨ• ෭࣍తͰ͋Δ͕ςετͷࣄΛߟྀ͢ΔΑ͏ʹͳͬͨ͜ͱͰCIڥͷݟ͠ͳͲਐΊΔ͜ͱ͕Ͱ͖ͨ(ϝϯςφʔ͕ଐਓԽ͍ͯͨ͠Jenkins͔ΒBitrise)
ΠϚΠνͩͬͨ• ࢼߦࡨޡ͠ͳ͕ΒͷϦΞʔΩςΫνϟͩͬͨͷͰίʔυͷதʹຊདྷඞཁͳ͍ෛ࠴͕ͬͨ• ͕࣌ؒڐ͞ΕΔͳΒͬͱ৭ʑߟ͑Δ͖ͩͬͨ(init͕ංେԽ͢ΔϨΠϠʔΛҙࣝͨ͠ઃܭʣ• શը໘Λࠓճͷઃܭʹ͢ΔϚΠϧετʔϯͳͲҾ͚͓ͯΒͣࠜຊʹ͋ΔΧΦε͕·ͩͳ͍ͤͯ͘ͳ͍
େࣄͳͷ͜ΕΒΛ౿·͑ͯ͜Ε͔ΒͲ͏͍ͯ͘͠ͷ͔
͜Ε͔ΒͷAmebaͷઃܭ• ݱঢ়՝ͩͱײ͍ͯ͡Δͷ͕ViewModelΑΓཪଆͷ෦ͷ࡞Γ(Usecaseͱ͔Repositoryͱ͔)• ࠓઃܭΛͨ͠ϝϯόʔ͕·ͩνʔϜʹἧ͍ͬͯΔͷͰடং͕อͨΕ͍ͯΔ͚ͩ• શһ͍ͳ͘ͳͬͨ͋ͱΧΦεΛੜΈग़͢ةݥੑ·ͩ·ͩሃΜͰ͍Δ• ͰԿΛ͢Δͷ͔ʁʁʁ
͜Ε͔ΒͷAmebaͷઃܭ• Layered Architectureͷߟ͑ํΛࢀߟʹऔΓೖΕ͍͖͍ͯͨ
͜Ε͔ΒͷAmebaͷઃܭ• Layered Architectureͷߟ͑ํଊ͑ํɺ࣮ࡍͷ࣮ʹࢸΔ·Ͱ৭ʑͳߟ͑ํΛ࣋ͬͯΔਓ͕͍Δ• ݪཧओٛͰͳ͋͘͘·ͰAmebaͱͯ͠औΓೖΕΔͳΒͲͷܗ͕ཧͳͷ͔Λߟ͍͖͍͑ͯͨ• ྫ͑EntityDomainͳͷ͔Dataͳͷ͔ɺ༷ʑͳߟ͑ํ͋Δͱࢥ͏͕AmebaͷಛੑEmbedFrameworkͱͯ͠Γग़ͨ͠ͱ͖ʹෆՄղͳґଘঢ়ଶʹͳΒͳ͍Α͏ߟྀ͖͍ͯͨ͠
·ͱΊ• ͘ӡӦͯ͠ΔαʔϏεͩͱΧΦε͕ੜ·Εͯ͠·͏ͷํͳ͍͜ͱ• ݱঢ়ʹҤ͑Δ͚ͩ͡Όͳͯ͘Ή͠Ζ৳ͼ͠Ζͩͱଊ͑ΒΕΔϝϯόʔͱঢ়گ͕ἧ͍ͬͯΕΨϯΨϯ͍ͬͯͬͨ΄͏͕͍͍͜ͱ͕͋Δ• ઃܭʹۜͷؙͳ͍ͷͰ৽͍͠ͷΛΩϟον্ͨ͠ͰαʔϏεಛੑʹϚον͢ΕΨγΨγऔΓೖΕ͍ͯ͘• ಠΓΑ͕ΓͷઃܭͰͳ͘ઃܭͷνʔϜશମͰͷίϛοτํ๏ઃܭ͢Δඞཁ͕͋Δ
͋Γ͕ͱ͏͍͟͝·ͨ͠☺