Kaip susieti tiltus tarp rėmų „iOS“ programoje

Jei jūsų programos kodas atrodo taip ...

„Noriu eksportuoti tą savo programos dalį, bet ji yra pririšta prie likusios programos kaip spagečių plokštelė!“

Bandoma eksportuoti nedidelę programos dalį, kuri yra per daug priklausoma

Kai pradėjau modifikuoti tą programos dalį, kurioje dirbau, įbėgau į sieną.

Norėjau eksportuoti paslaugą (iš tikrųjų tai buvo sekimo paslauga) į atskirą sistemą. Problema buvo ta, kad ši paslauga buvo per sunkiai susieta su programa. Jis naudojosi kita paslauga, kuri pati naudojosi kita, programoje giliai įtvirtinta.

Norėdamas eksportuoti stebėjimo paslaugą, turėčiau reaguoti ir perdaryti visą paslaugų rinkinį naujoje sistemoje!

Bet iš tikrųjų aš neturėjau laiko tai padaryti, o regresijos testai būtų buvę košmaras ir dėl daugelio kitų priežasčių, kurias galėjote turėti bet kurioje įmonėje (procesas, biudžetas, terminas).
Taigi aš turėjau sužinoti, kaip eksportuoti šią savo programos dalį, nereaguojant į viską.

Pradėkime nuo konkretaus pavyzdžio!

Geriausias būdas mokytis ir suprasti, kaip viskas veikia, yra praktika - čia mes esame! (Šio įrašo pabaigoje pateiksiu šio pavyzdžio „Github“ repą)
Taigi leiskite man nustatyti kontekstą. Turime nedidelę programą, kurioje yra tik 2 ekranai:

  • Pradinis ekranas
  • Mokėjimo ekranas (norime tą ekraną eksportuoti į sistemą)

Mokėjimo puslapyje yra teksto laukas kortelės numeriui įvesti ir mygtukas Mokėti. Paspaudus mygtuką, turėtų būti pradėtas mokėjimas.
Bet! Iššūkis priklauso nuo mokėjimo būdo. Tarkime, kad tiesiog negalime eksportuoti mokėjimo paslaugos dėl tam tikrų priežasčių, apie kurias aš atkreipiau dėmesį šiek tiek anksčiau.

Pradinis ekranas ir Mokėjimo ekranas

Taigi mes turime šiuos du ekranus, paskelbtus dviem skirtingais taikiniais. Pagrindinis ekranas deklaruojamas pagrindiniame programos taikinyje, o mokėjimo ekranas - kitame modulyje, vadinamame „PaymentModule“. Mes taip pat turime „PayService“, deklaruotą pagrindiniame programos taikinyje, kaip nurodyta toliau:

Mokėjimo metodas yra metodas, kurio negalime išgauti iš programos, nes jis yra per daug priklausomas. Bet mes norime tai naudoti iš mokėjimo modulio.

Turime „PaymentViewController“, apibrėžtą „Mokėjimo modulyje“, jei bandysime paskambinti „PaymentService“, turėsime klaidą, nes šios paslaugos nėra modulyje. Negalite importuoti pagrindinio tikslo į modulį (tai būtų nesąmonė)

Taigi kaip mes naudosime šį metodą iš „PaymentViewController“?

Apibrėžkite protokolą modulyje

Tai bus mūsų tiltas. Modulyje turite apibrėžti protokolą su metodu, apibūdinančiu, ką norite naudoti pagrindiniame programos taikinyje.

Taigi apibrėžkime protokolą pavadinimu „PaymentServiceProtocol“ su mokėjimo metodu:

Protokolo įgyvendinimas programoje

Dabar turime pasakyti „PayService“, kad atitiktų šį protokolą. Mes tiesiog turime pridėti tai:

„Kodėl protokole deklaruojamas metodas neįdiegtas šiame plėtinyje?“

Jūs teisus, kad vykdydami protokolą turite įgyvendinti jo savybes ir metodus. Apgaulė yra ta, kad metodo pavadinimas protokole yra visiškai tas pats kaip metodo pavadinimas „PayService“, kurį mes paskelbėme šiek tiek anksčiau. Tokiu būdu sistema žinos, kad prisijungdama prie protokolo metodo ji turės naudoti „PayService“ klasėje deklaruotą metodinį užmokestį.

Susieja dvi dalis

Dabar turime sujungti abi dalis.
Kai „HomeViewController“ spustelėjame mygtuką „Eiti į mokėjimo puslapį“, mes iškart suaktyviname „PayViewController“. Tuo metu mes perduosime nuorodą į „PaymentService“ klasę, tačiau modulio mokėjimo kontrolierius matys ją kaip „PaymentServiceProtocol“ tipą.

Štai triukas:

Mes perduodame „PaymentService.self“, o modulio kodas mato „PaymentServiceProtocol.Type“.
Dabar galime naudoti skambinimo mokėjimo metodą, apibrėžtą programoje iš modulio!

Naudodamiesi tiltu

Dabar labai lengva naudotis mūsų sukurtu tiltu:

Metodas „didTapPayButton“ iškviečiamas kiekvieną kartą, kai paspaudžiate mygtuką „Mokėti“ (skamba teisingai, ar ne?). Patikrinkite 23 eilutėje: mes naudojame mokėjimo metodą pagal protokolą, kurį gavome iš programos.

Kadangi „PayService“ atitinka šį protokolą, sistema vykdys kodą, nurodytą metodikoje pay, kuris apibrėžtas „PayService.swift“.

Kitaip tariant, mes naudojame metodą, kurio iš pradžių negalėjome paskambinti iš modulio! Tiltas jau pastatytas.

Štai kaip atrodo, kai bakstei mygtuką mokėti.

Naudojant pagrindiniame tiksle esantį mokėjimo metodą iš mokėjimo modulio

Išvada

Apibendrinant galima pasakyti, kad šis sujungimo metodas gali būti naudojamas, jei norite eksportuoti programos komponentą į sistemą.

Ši technika leis jums išpjaustyti makaronus iš dubenėlio, jei būsite priversti eksportuoti tą programos dalį į rėmus, bet negalėsite eksportuoti viso daikto dėl kokių nors priežasčių, kurias galėjote turėti.

Manau, kad tai yra laikinas sprendimas, prieš išleidžiant visą komponentą rėmuose, kai turėsite laiko, pavyzdžiui. (Pagal šį scenarijų kada nors turėsite eksportuoti mokėjimo metodą „Mokėjimo modulio“ viduje)

Aš pripažįstu, kad idealiame pasaulyje, kuriame būtų vienaragiai ir išgalvoti daiktai, mes nieko panašaus nepadarytume. Geriau eksportuoti visą komponentą, bet, kaip jau ne kartą sakiau, tai ne visada įmanoma.

Čia galite rasti šio projekto „Github“ repo, nedvejodami patikrinkite, kaip atliekamas tiltas, ir patys išbandykite.
Tikiuosi, kad šis įrašas gali padėti, nedvejodami užduokite bet kokį mintį!

Ši istorija paskelbta didžiausiame „Medium“ verslumo leidinyje „The Startup“, kurį seka +442 678 žmonės.

Prenumeruokite ir gaukite mūsų populiariausias istorijas čia.