Pse unë këshilloj të shmangni metodat opsionale në protokolle

Shanset janë që të keni hasur në një situatë ku dëshironi të shtoni një metodë opsionale në një protokoll Swift. Ky është një rast shumë i zakonshëm kur bëhet fjalë për përdorimin e protokolleve për të detyruar metodat në klasa, struktura dhe numra. Në këtë artikull, ne do të shohim se si mund të arrijmë sjelljen e metodës opsionale dhe pse nuk e këshilloj atë.

Problemi

Klasa Elephant duhet të përputhet me walk() dhe run() edhe pse e dimë që elefantët nuk mund të vrapojnë. Le ta rregullojmë këtë.

Zgjidhja #1: Qasja ObjC

Një mënyrë është të shënoni protokollin dhe funksionin me @objc, siç tregohet më poshtë. Do të vini re se ne kemi hequr metodën run() nga klasa Elephant dhe sheshi i lojërave nuk ankohet.

Le të kuptojmë se çfarë bëmë më poshtë:

  1. Ne shtuam @objc opsionale përpara metodës run().
  2. Ne kemi shtuar @objc para deklaratës së protokollit.
  3. Ne e bëmë klasën Elephant të trashëgojë nga klasa NSObject.
  4. Ne hoqëm metodën run() nga klasa Elephant.

E di që kjo është një qasje Objektivi-C dhe ju duhet ta bëni klasën tonë të trashëgojë nga NSObject — dhe askush nuk e pëlqen këtë. Por është një nga opsionet që kemi.

Zgjidhja #2: Qasje e shpejtë

Le të kthehemi te Swift dhe të hedhim @objC. Ja çfarë bëmë më poshtë:

  1. Ne hoqëm gjurmët NSObject dhe @objC.
  2. Shtuam një shtesë në protokollin Animal me një trup bosh të metodës run().

Kjo eshte. Metoda run() tani është opsionale për të gjitha klasat, strukturat dhe numrat që përputhen me protokollin Animal.

Pse është kjo e keqe?

Kur jeni duke bërë opsionale ndonjë metodë protokolli, po merrni një vendim të keq të projektimit sepse protokollet nuk janë menduar të përdoren në këtë mënyrë.

"Një protokoll përcakton një plan të metodave, veçorive dhe kërkesave të tjera që i përshtaten një detyre të caktuar ose një pjese të funksionalitetit." - "Dokumentacioni zyrtar i Swift"

Ajo që duhet të bëjmë është të ndajmë protokollin Animal në dy protokolle të ndryshme: njëri është WalkableAnimal dhe tjetri RunnableAnimal.

Në këtë mënyrë, ne po i ndajmë protokollet në shumë protokolle më të vogla dhe po e bëjmë kodin tonë më të qartë për t'u lexuar gjithashtu. Unë besoj se kjo është një mënyrë më e mirë për të përdorur protokollet dhe përfundimisht për të lëvizur drejt programimit të orientuar drejt protokollit.

Përndryshe, ne mund të përdorim trashëgiminë Protocol. Ashtu si mmalc Crawford sugjeruar këtu:



konkluzioni

Faleminderit që lexuat. Do të doja të dëgjoja nga ju në seksionin e komenteve.