Slide 1

Slide 1 text

Amebaͷઃܭͱ͜Ε͔Β ~ΧΦε͔Βͷ୤٫ͱ࠶ͼΧΦεΛੜΈग़͞ͳ͍౒ྗʙ 2020/1/30

Slide 2

Slide 2 text

1.ࣗݾ঺հ&ϓϩμΫτ঺հ 2.ΧΦε͗ͨ͢ઃܭ 3.ϦΞʔΩςΫνϟ:yatteiki: 4.݁Ռͱະདྷ

Slide 3

Slide 3 text

ࣗݾ঺հ&ϓϩμΫτ঺հ

Slide 4

Slide 4 text

ࣗݾ঺հˍϓϩμΫτ঺հ • ࡾ໦ ढ़࡞ • 2017೥த్ೖࣾ Ameba iOS։ൃϦʔμʔ • 2010೥ϦϦʔε • Twitter/shun_sakuuu • Github/shun-mk

Slide 5

Slide 5 text

ΧΦε͗ͨ͢ઃܭ

Slide 6

Slide 6 text

ΧΦε͗ͨ͢ઃܭ • 2010೥ʹϦϦʔε͞Ε10೥Ҏ্ӡ༻Λ͍ͯ͠ΔΞϓϦ • ࣌୅ͷྲྀΕͷதͰͨ͘͞Μͷస׵ظ • WebViewΞϓϦ͔ΒϑϧωΠςΟϒʹ • Objective-C͔ΒSwiftʹ • ౰વνʔϜͷϝϯόʔͷೖΕସΘΓ΋ܹ͍͠ • ࣌୅ͷྲྀΕͷதͰ౰࣌σϑΝΫτͩͱݴΘΕ͖ͯͨઃܭ΋ͨ͘͞Μ͋Δ • ΧΦε͔Β୤٫͠Α͏ͱͯ͠଍ૡ͍ͨࠟ੻΋ɻɻɻ

Slide 7

Slide 7 text

MVC • ଏʹݴ͏FatViewController • ΊͬͪΌViewControllerͰAPI௨৴ͯ͠Δ • ViewControllerͰAPI௨৴ͱ͔ॻ͍ͪΌͩΊͩΑʁ͍ͬͯ͏࣌୅ͷἤΓΛड͚ ͨͷ͔HogeHogeManagerͱ͔HogeHogeHelperͱ໋໊͔͔ΒԿ͢Δͷ͔Α͘ Θ͔Βͳ͍Ϋϥε͕API௨৴Λ࣋ͬͯͨΓ΋͢Δ • ౰વςετ͸ͳ͍

Slide 8

Slide 8 text

VIPER • Ұ෦VIPERͷߏ੒Ͱ࡞ΒΕͯΔը໘͕͋Δ • ͓ͦΒ͘͜Ε΋AmebaΛΧΦε͔Β୤٫͢ΔͨΊʹ௅ઓͨ͠Ұͭͳͷ͔ͳʁ • ઃܭࢿྉ౳͕ͳ͘Ͳ͏͍͏ࢥ૝ͰͲ͏͍͏ߏ੒ʹͳ͍ͬͯΔͷ͔͕ඇৗʹ෼ ͔ΓͮΒ͍ • ౰વςετ͸ͳ͍

Slide 9

Slide 9 text

ΧΦε͗ͨ͢ઃܭ • ৽نը໘Λ࣮૷͢Δ࣌Ͳ͏͍͏ઃܭʹ͢Ε͹͍͍͔ຖճ0͔Βߟ͑Δͷ݁ߏେ ม • ͔͠΋ਓͦΕͧΕ͜Ε͕͍͍͍ͬͯ͏ͷ͕ҧ͏ͷͰϨϏϡʔίετ੝Γ੝Γ • ͦͷઃܭʹͨ͠ΤϯδχΞ͕͍ͳ͘ͳΔͱෛ࠴ײ͕ੌ͍ • ઃܭ͕΅Μ΍Γ&ີ݁߹&ςετ΋ಛʹͳ͘Կ͕ਖ਼ͷಈ͖ͳͷ͔Θ͔Βͳ͍ͷ ࡾॏۤͰ࢓༷มߋ΍ػೳ௥Ճʹ༨෼ʹ޻਺͕ൃੜ͢Δঢ়ଶʹ

Slide 10

Slide 10 text

ϦΞʔΩςΫνϟ:yatteiki:

Slide 11

Slide 11 text

ͬ͘͟Γͱͨ͠ํ਑ • ࠓճͷϦΞʔΩςΫνϟͰ໨ࢦͨ͠࠷ऴܕ͸MVVM ʴ Flux • ಋೖ͕ਐΜͰ͍ͳ͔ͬͨRxSwift΋ϦΞʔΩςΫνϟʹ߹ΘͤͯਐΊΔ • ͔ͤͬ͘ઃܭ͠௚͢ͳΒςετͷ࣮૷·Ͱߟ͑ΒΕͯΔઃܭʹ͍ͨ͠ • ςετॻ͘ͳΒCIͷ؀ڥ΋ݟ௚ͯ͠ςετΛॻ͘͜ͱʹҙຯ͕͋Δঢ়ଶΛ࡞ Γ͍ͨ • ઃܭҊʹؔͯ͠͸ৗʹνʔϜͰ͢Γ߹ΘͤΛߦ͏(୭͔ҰਓͷઃܭΛօ͕ਅࣅ ͯ͠ॻ͚ͩ͘ͷঢ়ଶ͸ආ͚͍ͨ)

Slide 12

Slide 12 text

MVVM • Ұൠతʹࢥ͍ු͔ͿMVVMͱ΄΅มΘΒͳ͍ߏ੒ • 1ը໘ͷϩδοΫ͕ෳࡶͳը໘͕ͦͦ͋͜͜Δͷͱෳ਺ͷը໘͕ಉظ͠ͳͯ͘ ͸͍͚ͳ͍Α͏ͳ࢓༷͕ଟ͍Θ͚Ͱ͸ͳ͔ͬͨͷͰγϯϓϧͳMVVMΛ࠾༻ ͨ͠ • ViewͱViewModelͷbindingΛ͢ΔͨΊͷFramework͸RxSwiftΛ࠾༻(ࣾ಺ʹ ͓͚Δ࠾༻࣮੷౳ΛؑΈܾͯఆ)

Slide 13

Slide 13 text

MVVM • ॳظViewModelͷߏ૝͸init಺ͰPublishSubject౳Λੜ੒͠Observerͱ ObservableͷϓϩύςΟʹηοτͯ͠ߪಡ͢Δܗʹ͍ͯͨ͠ • ؆୯ͳը໘ͳΒˢͷ࣮૷ͰࠔΔ͜ͱ͸ಛʹͳ͍ • ViewModelͷIn-OutͷI/F͕࣮૷ऀʹҕͶΒΕ͓ͯΓϨϏϡʔίετ͕ංେԽ • ෳࡶͳॲཧ͕ೖͬͯ͘Δͱinit͕ஶ͘͠ංେԽ͠ϝϯςίετ͕ര૿ͨ͠

Slide 14

Slide 14 text

MVVM • ViewModelͷinitͰߦ͍ͬͯͨObservableͷՃ޻΍API௨৴ɺViewදࣔ༻ͷ Model΁ͷTranslatorݺͼग़͠ΛUsecaseͱͯ͠੾Γग़͠ • ViewModelͷInputͱOutputΛProtocolʹ੾Γग़͠In-OutͷI/FΛڞ௨Խ • ViewModel಺ͷinitͰߦΘΕ͍ͯͨॲཧΛͦΕͧΕͷ੹຿ຖʹ੾Γग़͠ංେԽ Λ๷͙ͱͱ΋ʹখ͍͞୯ҐͰςετ͕ॻ͚ΔΑ͏ʹ

Slide 15

Slide 15 text

Flux • MVVMͷ࢓૊Έͩͱ࣮ݱ͢Δͷʹ൥ࡶԽ͢ΔΑ͏ͳ࢓༷͕ग़͖ͯͨ • ϩάΠϯ/ϩάΞ΢τʹΑͬͯΞϓϦશମͷঢ়ଶΛ੾Γସ͑ͨΓɺλϒͷΑ͏ ͳը໘Ͱߋ৽௨஌ΛϒϩʔυΩϟετͨ͠Γ౳ • ࠷ॳ͸ObserverͱObservableΛI/Fʹ࣋ͭSingletonͷΦϒδΣΫτΛར༻ͯ͠ ղܾ͍ͯ͠ΔՕॴ΋͕͋ͬͨ೗Կ༷ʹ΋ѱ͍͜ͱ͕Ͱ͖ͯ͠·͏ͷͱεέʔ ϧ͢ΔΠϝʔδ͕ͳ͔ͬͨͨΊղܾ͔ͨͬͨ͠

Slide 16

Slide 16 text

Flux • Fluxര஀ • σʔλϑϩʔ͸FacebookͷFluxͱಉ༷ • ඇRxґଘ -> Store͸ViewModelͱbindͤͨ͞΄͏͕౎߹͕ྑ͍Օॴ͕͋ΔͷͰ StoreͷϕʔεΫϥεʹExtensionͰObservableʹม׵͢ΔॲཧΛ௥Ճ͍ͯ͠Δ

Slide 17

Slide 17 text

Flux • Fluxͷར༻ऀ͸StoreͷΠϯελϯεΛੜ੒͠దٓbind͢Δ • SingletonͰ࣮૷͍ͯͨ࣌͠ͱҧ͍ར༻ऀଆ͕ඞཁͳΠϕϯτ΍StateΛ࣋ͭ Store͚ͩΛݟΕ͹͍͍ͨΊෆཁͳObservableΛߪಡ͢Δ͜ͱΛ๷͛Δ • ංେԽ͠ଓ͚Δະདྷ͔͠ݟ͑ͳ͔ͬͨSingleton͔ΒඞཁʹԠͯ͡ܗΛม͑Δ StoreΛੜ੒Ͱ͖ΔΑ͏ʹͳͬͨͷͰεέʔϧ͢Δײ • σʔλϑϩʔ΋୯ํ޲ͳͷͰAPI௨৴౳͕ඞཁʹͳΔॲཧͰ΋ΩϨΠͳߏ੒Λ อͭ͜ͱ͕Ͱ͖ΔΑ͏ʹ

Slide 18

Slide 18 text

ͨͩ͠

Slide 19

Slide 19 text

Flux • ར༻Օॴ͸ͪΌΜͱߟ͑Δ͜ͱ • FluxΛར༻͢Δඞཁ͕ͳ͍ը໘΋FluxͰ࣮૷͢Δͱٯʹ൥ࡶʹͳͬͯ͠·͏ ՄೳੑΛሃΜͰ͍Δ • MVVMͰ͸ΩϨΠʹ࡞Εͳ͍ॲཧͷྲྀΕ͕͋ΔΑ͏ͳͱ͖ʹબ୒ࢶͱͯ͠ར ༻ • ݸਓతʹ͸NotificationCenterͱ͔ObserverύλʔϯͰຖճಠࣗͷศརΫϥε ࡞ΔΑΓ͸அવFlux೿

Slide 20

Slide 20 text

݁Ռͱະདྷ

Slide 21

Slide 21 text

ྑ͔ͬͨ఺ • ৽࣮͘͠૷͞ΕΔը໘ͷ࡞Γ͕͋Δఔ౓౷Ұ͞Ε͍ͯΔͷ͸ϨϏϡʔίετ ౳Λߟ͑ͯ΋ѹ౗తʹྑ͍ • Ұਓ͕ઃܭ͢ΔͷͰ͸ͳ͘ɺνʔϜ಺Ͱ͖ͬͪΓೝࣝΛ߹Θͤͳ͕ΒਐΊΔ ͜ͱͰઃܭΛߟ͑Δେࣄ͕͞ਁಁͨ͠ײ͕ͨ͡͠ • ઃܭͷࢿྉͳͲ͕ࣾ಺ͷυΩϡϝϯτʹ࢒͞Ε͍ͯΔঢ়ଶΛ࡞Εͨ • ෭࣍తͰ͸͋Δ͕ςετͷࣄΛߟྀ͢ΔΑ͏ʹͳͬͨ͜ͱͰCI؀ڥͷݟ௚͠ ͳͲ΋ਐΊΔ͜ͱ͕Ͱ͖ͨ(ϝϯςφʔ͕ଐਓԽ͍ͯͨ͠Jenkins͔ΒBitrise ΁)

Slide 22

Slide 22 text

ΠϚΠνͩͬͨ఺ • ࢼߦࡨޡ͠ͳ͕ΒͷϦΞʔΩςΫνϟͩͬͨͷͰίʔυͷதʹຊདྷඞཁͳ͍ ෛ࠴͕࢒ͬͨ • ͕࣌ؒڐ͞ΕΔͳΒ΋ͬͱ৭ʑߟ͑Δ΂͖ͩͬͨ(init͕ංେԽ͢Δ໰୊΍ϨΠ ϠʔΛҙࣝͨ͠ઃܭ౳ʣ • શը໘Λࠓճͷઃܭʹ͢ΔϚΠϧετʔϯͳͲ͸Ҿ͚͓ͯΒͣࠜຊʹ͋ΔΧ Φε͕·ͩͳ͍ͤͯ͘ͳ͍

Slide 23

Slide 23 text

େࣄͳͷ͸͜ΕΒΛ౿·͑ͯ ͜Ε͔ΒͲ͏͍ͯ͘͠ͷ͔

Slide 24

Slide 24 text

͜Ε͔ΒͷAmebaͷઃܭ • ݱঢ়՝୊ͩͱײ͍ͯ͡Δͷ͕ViewModelΑΓཪଆͷ෦෼ͷ࡞Γ(Usecaseͱ͔ Repositoryͱ͔) • ࠓ͸ઃܭΛͨ͠ϝϯόʔ͕·ͩνʔϜ಺ʹἧ͍ͬͯΔͷͰடং͕อͨΕ͍ͯ Δ͚ͩ • શһ͍ͳ͘ͳͬͨ͋ͱΧΦεΛੜΈग़͢ةݥੑ͸·ͩ·ͩሃΜͰ͍Δ • Ͱ͸ԿΛ͢Δͷ͔ʁʁʁ

Slide 25

Slide 25 text

͜Ε͔ΒͷAmebaͷઃܭ • Layered Architectureͷߟ͑ํΛࢀߟʹऔΓೖΕ͍͖͍ͯͨ

Slide 26

Slide 26 text

͜Ε͔ΒͷAmebaͷઃܭ • Layered Architectureͷߟ͑ํ΍ଊ͑ํɺ࣮ࡍͷ࣮૷ʹࢸΔ·Ͱ৭ʑͳߟ͑ํ Λ࣋ͬͯΔਓ͕͍Δ • ݪཧओٛͰ͸ͳ͋͘͘·ͰAmebaͱͯ͠औΓೖΕΔͳΒͲͷܗ͕ཧ૝ͳͷ͔ Λߟ͍͖͍͑ͯͨ • ྫ͑͹Entity͸Domain૚ͳͷ͔Data૚ͳͷ͔౳ɺ༷ʑͳߟ͑ํ͸͋Δͱࢥ͏ ͕Amebaͷಛੑ΍EmbedFrameworkͱͯ͠੾Γग़ͨ͠ͱ͖ʹෆՄղͳґଘঢ় ଶʹͳΒͳ͍Α͏ߟྀ͖͍ͯͨ͠

Slide 27

Slide 27 text

·ͱΊ • ௕͘ӡӦͯ͠ΔαʔϏεͩͱΧΦε͕ੜ·Εͯ͠·͏ͷ͸࢓ํͳ͍͜ͱ • ݱঢ়ʹҤ͑Δ͚ͩ͡Όͳͯ͘Ή͠Ζ৳ͼ͠Ζͩͱଊ͑ΒΕΔϝϯόʔͱঢ়گ ͕ἧ͍ͬͯΕ͹ΨϯΨϯ΍͍ͬͯͬͨ΄͏͕͍͍͜ͱ͕͋Δ • ઃܭʹۜͷ஄ؙ͸ͳ͍ͷͰ৽͍͠΋ͷΛΩϟον্ͨ͠ͰαʔϏεಛੑʹ Ϛον͢Ε͹ΨγΨγऔΓೖΕ͍ͯ͘ • ಠΓΑ͕ΓͷઃܭͰ͸ͳ͘ઃܭ΁ͷνʔϜશମͰͷίϛοτํ๏΋ઃܭ͢Δ ඞཁ͕͋Δ

Slide 28

Slide 28 text

͋Γ͕ͱ͏͍͟͝·ͨ͠☺