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ë:
- Ne shtuam
@objc
opsionale përpara metodësrun()
. - Ne kemi shtuar
@objc
para deklaratës së protokollit. - Ne e bëmë klasën
Elephant
të trashëgojë nga klasaNSObject
. - Ne hoqëm metodën
run()
nga klasaElephant
.
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ë:
- Ne hoqëm gjurmët
NSObject
dhe@objC
. - Shtuam një shtesë në protokollin
Animal
me një trup bosh të metodësrun()
.
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.