Slide 1

Slide 1 text

VIPER with ΞʔΩςΫνϟબఆ ࣮ફೖ໳ @hirothings

Slide 2

Slide 2 text

Agenda • VIPERͱ͸ʁ • ͳ࣮ͥ຿ͷΞʔΩςΫνϟʹVIPERΛબΜͩͷ͔ • (͓·͚)Embedded Frameworkʹ͍ͭͯ • એ఻ • ΞʔΩςΫνϟબఆʹ͍ͭͯ

Slide 3

Slide 3 text

ࣗݾ঺հ • @hirothings (Objective-ͻΖC) • ݩϥʔϝϯ԰ళ௕ϓϩάϥϚʔ • ౬੾ΓΛ͜ͷ··͍͍ͯͯ͠ͷ͔ࢥ্ཱ͍ͪژ • ݱࡏiOSσϕϩούʔ

Slide 4

Slide 4 text

VIPERͱ͸ʁ

Slide 5

Slide 5 text

VIPERͱ͸ʁ • View • Interactor • Presenter • Entity • Router ֤ϨΠϠʔͷ಄จࣈͷ૊Έ߹ΘͤͰ VIPER ͱݺͼ·͢ɻ

Slide 6

Slide 6 text

VIPERͷಛ௃ • ΫϦʔϯΞʔΩςΫνϟΛiOSΞϓϦʹద༻ͨ͠ΞʔΩςΫ νϟ(1) • ֤ϨΠϠʔ͸Interface(Protocol)ʹґଘ • SOLIDݪଇͷ୯Ұ੹೚ͷݪଇʹجͮ͘ (1) • “VIPER is an application of Clean Architecture to iOS apps. “ • ग़య: https://www.objc.io/issues/13-architecture/viper/

Slide 7

Slide 7 text

VIPERͷϨΠϠʔ

Slide 8

Slide 8 text

VIPERͷϨΠϠʔ: Entity • όϦϡʔΦϒδΣΫτ

Slide 9

Slide 9 text

VIPERͷϨΠϠʔ: Interactor • PresenterͷϦΫΤετʹԠͯ͡ΞϓϦͷϢʔεέʔ ε͝ͱʹϏδωεϩδοΫΛ࣮ߦ͢Δ૚ • EntityΛ஌͍ͬͯΔ • Viewͷ͜ͱ͸஌Βͳ͍

Slide 10

Slide 10 text

VIPERͷϨΠϠʔ: Presenter • Viewʹର͢ΔϓϨθϯςʔγϣϯϩδοΫΛ࣋ͭ૚ • ViewͱRouter, Interactorͷڮ౉͠తଘࡏ • View͔Βड͚औͬͨΠϕϯτΛ΋ͱʹ • InteractorʹϦΫΤετ • Routerʹը໘ભҠΛґཔ͢Δ • Interactor͔Βड͚औͬͨσʔλΛViewʹ౉͢

Slide 11

Slide 11 text

VIPERͷϨΠϠʔ: Presenter • Viewʹର͢ΔϓϨθϯςʔγϣϯϩδοΫΛ࣋ͭ૚ • ViewͱRouter, Interactorͷڮ౉͠తଘࡏ • View͔Βड͚औͬͨΠϕϯτΛ΋ͱʹ • InteractorʹϦΫΤετ • Routerʹը໘ભҠΛґཔ͢Δ • Interactor͔Βड͚औͬͨσʔλΛViewʹ౉͢

Slide 12

Slide 12 text

VIPERͷϨΠϠʔ: View • View, ViewController • ϓϨθϯςʔγϣϯϩδοΫ͸࣋ͨͳ͍

Slide 13

Slide 13 text

VIPERͷϨΠϠʔ: Router • ը໘ભҠΛ؅ཧ͢Δ • ֤ϨΠϠʔͷΠϯελϯεΛੜ੒͠ɺը໘Λඳը͢ Δ(ґଘੑΛͻͱ·ͱΊʹղܾ͢Δ૚͸͜͜)

Slide 14

Slide 14 text

ͳ࣮ͥ຿ͷΞʔΩςΫνϟʹ VIPERΛબΜͩͷ͔

Slide 15

Slide 15 text

• ϧʔςΟϯά͕ͳ͘VCؒͰݸผʹը໘ભҠͤͯ͞ΔͨΊભҠͷϩ δοΫ͕ࢄΒ͹Δ • σʔλͷऔಘɾՃ޻͚ͩΛ͢Δ૚͕ͳ͍ • ݁ՌɺϓϨθϯςʔγϣϯϩδοΫͱσʔλʹؔ͢ΔϩδοΫ͕ ࠞࡏ͢Δ • ґଘੑΛͻͱ·ͱΊʹղܾ͢Δ૚͕ͳ͍ • Α࣮ͬͯ૷͕ଐਓԽ͢Δ MVCɺMVVMΞʔΩςΫνϟͰΞ ϓϦΛ࡞ͬͯײͨ͡՝୊ ޻෉͠ͳ͍ͱ..

Slide 16

Slide 16 text

બఆʹࢸͬͨܦҢ ੍໿ • ॳظϦϦʔεʹؒʹ߹ΘͤΔʹ͸ͦ͜·Ͱ͕࣌ؒͳ͍ લఏ৚݅ • σʔλόΠϯσΟϯάΛଟ༻͢Δ΄ͲͷΠϯλϥΫςΟϒͳ ΞϓϦͰ͸ͳ͍ • API͔ΒσʔλΛऔͬͯग़͚ͩ͢ͷΞϓϦ(ϩʔΧϧDB΋࢖༻ ͠ͳ͍) • ։ൃϝϯόʔ2, 3ਓ • ԣల։͢ΔΞϓϦͷج൫ͱͯ͠ɺϨΠϠʔ͸͔ͬͪΓ͓ͯ͠ ͘ඞཁ͕͋ͬͨ

Slide 17

Slide 17 text

બఆʹࢸͬͨܦҢ ઌͷ՝୊͸࢓૊ΈԽͯ͠ղܾ͍ͨ͠ ϨΠϠʔυΞʔΩςΫνϟͷબఆ.. VIPER͕ྑͦ͞͏ αϯϓϧΞϓϦΛ ࡞ͬͯ൑அ͠·ͨ͠

Slide 18

Slide 18 text

՝୊ͱιϦϡʔγϣϯ ࠓ·Ͱͷઃܭʹ๊͍ͨ՝୊ VIPERͷιϦϡʔγϣϯ ϧʔςΟϯά͕ͳ͍ Router͕୲อͯ͘͠ΕΔ ϓϨθϯςʔγϣϯϩδοΫͱσʔ λʹؔ͢ΔϩδοΫ͕ࠞࡏ Presenter, InteractorͰ໌֬ʹ෼཭͞Ε͍ͯΔ ґଘੑΛͻͱ·ͱΊʹղܾ͢Δ૚͕ ͳ͍ Router͕ΠϯελϯεΛੜ੒͠ґଘੑΛ·ͱΊΔ ໾ׂΛ୲͍ͬͯΔ ଐਓԽ͢Δ ϨΠϠʔ͕໌֬ͳͨΊଐਓԽͮ͠Β͍

Slide 19

Slide 19 text

VIPERʹ࣮ͯ͠ࡍΑ͔ͬͨ఺ Router૚ͷଘࡏ • ը໘ભҠͷίʔυΛView͔Β෼཭Ͱ͖Δ • ͋ΒΏΔը໘ભҠʹରԠ͕Մೳ(ex. Universal Links͔ΒͷભҠ) • ґଘੑΛͻͱ·ͱΊʹ͢Δ૚͕͋Δ

Slide 20

Slide 20 text

Routerʹؔͯ͠ ΞϓϦέʔγϣϯ޲͚ΞʔΩςΫνϟͷVIPERͰClean Architecture ʹΞυΦϯ͞ΕͨϨΠϠʔͰ͕͢ɺ Routerʹ͍ͭͯৄ͘͠஌Γ͍ͨํ͸iOSઃܭຊͷApplication CoordinatorͱRouterͷষ͕ࢀߟʹͳΓ·͢ɻ IUUQTQFBLTDDCPPLTJ04@BSDIJUFDUVSF ࠷ߴ!

Slide 21

Slide 21 text

VIPERʹ࣮ͯ͠ࡍΑ͔ͬͨ఺ ςετ͠΍͍࣮͢૷Λ”ޙԡ͠”ͯ͘͠ΕΔ • ֤ϨΠϠʔΛInterfaceͷΈͰґଘͤ͞ΔͨΊɺstub, spyʹมߋ ͠΍͍͢ • ओʹνΣοΩϯά(खಈςετͷίετ͕͔͔ΔՕॴ)ʹࣗಈςε τΛಋೖ • ॻ͖ͮΒ͍৔߹͸ίʔυʹ໰୊͕͋Δ ࢀߟ • ୯ମςετͷϋδϝ • https://speakerdeck.com/yokoyas000/dan-ti-tesutofalsehazime

Slide 22

Slide 22 text

ςετͷྫ ※આ໌ͷͨΊ؆ུԽͯ͠·͢ Presenterͷςετˠ ɾίετେ ɾϏδωεϩδοΫ - ViewͷҰ؏ͨ͠ςε τ͕Մೳ Interactorͷςετ ɾίετখ ɾ୯ೖྗ / ग़ྗͷςετ

Slide 23

Slide 23 text

͞Βʹେن໛։ൃʹͳΔͱ͡Θ͡Θײ͡ΔϝϦοτ • Domain, Data૚ͱView૚Ͱ୲౰Λ෼͚ΒΕͨΓ͢Δ • ෆ֬ఆཁૉʹର͢ΔରԠָ͕ͳͷͰ݁Ռૣ͍ • APIͱซ૸Ͱ։ൃ͢Δͱ͖=>ελϒͰ੩తͳ࣮૷ • ViewΛ࡞Γ௚ͯ͠΋Өڹൣғখ VIPER(Clean Architecture)։ൃͰΑ͍఺

Slide 24

Slide 24 text

+Embedded Framework ΋ରԠ • ΞϓϦέʔγϣϯͷϞδϡʔϧ෼ׂ • ୯ํ޲ʹ͔͠ࢀরͰ͖ͳ͍ͨΊૄ݁߹ͳ࣮૷͕ڧ੍Ͱ͖Δ Embedded Frameworkͱ͸ • ը໘ʹؔ࿈͢ΔϨΠϠʔͱؔ࿈͠ͳ͍ϨΠϠʔͰߏ੒Λ෼͚ͨ • ը໘ʹؔ࿈͠ͳ͍ϨΠϠʔΛผϞδϡʔϧʹ෼ׂ ෼ׂͷํ਑

Slide 25

Slide 25 text

ਖ਼͘͠෼ׂ͢Δ͜ͱΑΓը໘୯ҐͰӨڹൣғ͕ࢹ ֮తʹ෼͔ΔDXΛ༏ઌ Scene • View • Presenter • Interactor • Router ը໘ʹؔ࿈͠ͳ͍ϨΠϠʔ • API Request • DataStore • Entity • Utility • Components (Button..etc) "QQ ผϞδϡʔϧ

Slide 26

Slide 26 text

ਖ਼͘͠෼ׂ͢Δ͜ͱΑΓը໘୯ҐͰӨڹൣғ͕ࢹ ֮తʹ෼͔ΔDXΛ༏ઌ Scene • View • Presenter • Interactor • Router ը໘ʹؔ࿈͠ͳ͍ϨΠϠʔ • API Request • DataStore • Entity • Utility • Components (Button..etc) "QQ ผϞδϡʔϧ ඍົͳϥΠϯ͕ͩ རศੑʹدͤͨՕॴ

Slide 27

Slide 27 text

ϑϧFirebaseͰݸਓΞϓϦ࡞Γ·ͨ͠

Slide 28

Slide 28 text

ݸਓΞϓϦͷΞʔΩςΫνϟͳΜͰ͔͢ʁ

Slide 29

Slide 29 text

ݸਓΞϓϦͷΞʔΩςΫνϟͳΜͰ͔͢ʁ MVCͰ͢㊙

Slide 30

Slide 30 text

ΞʔΩςΫνϟͷબఆʹ͍ͭͯ૝͏͜ͱ

Slide 31

Slide 31 text

ΞʔΩςΫνϟͷબఆʹ͍ͭͯ • ΞϓϦͷ੒௕ͱෳࡶ͞ʹΑͬͯऔΔ΂͖ख๏͕ม Θͬͯ͘Δ

Slide 32

Slide 32 text

ΞʔΩςΫνϟͷબఆʹ͍ͭͯ ྫ) ചΕΔ͔෼͔Βͳ͍ݸਓΞϓϦ <։ൃ؀ڥ> ɾ1ਓ <ΞϓϦͷෳࡶੑ> ɾγϯϓϧ(͡Όͳ͍ͱϠό͍) <ऩӹ> ɾZERO ചΕΔ͔Ͳ͏͔෼͔Βͳ͍ΞϓϦʹ͍ͨͦ͏ͳ ΞʔΩςΫνϟ͸ෆཁ

Slide 33

Slide 33 text

ΞʔΩςΫνϟͷબఆʹ͍ͭͯ ΞϓϦͷ੒௕ʹ߹ΘͤͯΞϓϦͷػೳɾ։ൃ؀ ڥͷෳࡶੑ͕૿͢ "1*ϦΫΤετ ։ൃϝϯόʔ"

Slide 34

Slide 34 text

ΞʔΩςΫνϟͷબఆʹ͍ͭͯ "1*ϦΫΤετ ։ൃϝϯόʔ" ։ൃϝϯόʔ# ։ൃϝϯόʔ$ ϩʔΧϧ%#อଘ ଟݴޠల։ $* 2" $% ΞϓϦͷ੒௕ʹ߹ΘͤͯΞϓϦͷػೳɾ։ൃ؀ ڥͷෳࡶੑ͕૿͢

Slide 35

Slide 35 text

ΞʔΩςΫνϟͷબఆʹ͍ͭͯ ෳ਺"1*ϦΫΤετ ։ൃϝϯόʔ" ։ൃϝϯόʔ# ։ൃϝϯόʔ$ ϩʔΧϧ%#อଘ ଟݴޠల։ $* 2" $% ΞϓϦͷ੒௕ʹ߹ΘͤͯΞϓϦͷػೳɾ։ൃ؀ ڥͷෳࡶੑ͕૿͢ ։ൃϝϯόʔ% ίϯϑϦΫτ໰୊ $4ରԠ ύϑΥʔϚϯε໰୊ "#ςετ ίʔσΟϯάελΠϧ ͕όϥόϥ ΞϓϦԣల։ ։ൃϝϯόʔ&

Slide 36

Slide 36 text

ΞʔΩςΫνϟͷબఆʹ͍ͭͯ ԿΛղܾ͍͔ͨ͠ʁ ͸ɺΞϓϦͷ੒௕ͱෳࡶੑʹΑͬͯมΘΔɻ ΞϓϦͷ੒௕ʹ߹ΘͤͨΞʔΩςΫνϟͷબఆɾվળ͕ॏཁɻ

Slide 37

Slide 37 text

• View • Interactor • Presenter • Entity • Router ࣮ࡍͷϓϩδΣΫτͷվળࣄྫ

Slide 38

Slide 38 text

• View • Interactor • Presenter • Entity • Router "1*͚ͩͰ͸ͳ͘ϩʔΧϧ͔ Β΋σʔλऔಘ͢Δ૚ΛϦ ϑΝΫλϦϯά ಉ͡&OUJUZͰ΋ը໘͝ͱʹද ࣔ͢Δ಺༰͕શવҧ͏ +Model +DataStore +Translator ࣮ࡍͷϓϩδΣΫτͷվળࣄྫ Ұ෦'MVYΛಋೖ ผҊ݅

Slide 39

Slide 39 text

ΞϓϦͷ੒௕ʹ߹ΘͤͯঃʑʹϦϑΝΫλϦϯά͠ɺ ΞʔΩςΫνϟΛ͏·͘औΓೖΕ͍͖ͯ·͠ΐ͏ Fin