Найти в Дзене

Делегатлар

Чыганак:

Чыннан да матур тел, бик матур үзенчәлекләргә ия. Алар аркасында кушымтаны эшләү кызыклы һәм мавыктыргыч тәҗрибәгә әйләнә. Бу үзенчәлекләрнең берсе тапшырылган үзлекләр. Мин сезгә делегациянең андроид уйлап табучы тормышын гадиләштерергә ничек ярдәм итәчәген әйтермен.

Баштан: делегат нәрсә ул һәм ул ничек эшли? Чынлыкта, барысы да күренгәнчә катлаулы түгел

Делегат - мөлкәткә кыйммәт бирүче һәм аның үзгәрүләрен эшкәртүче класс. Моның ярдәмендә без милекне үзеннән аерым класска күчерә алабыз яки логиканы кабат куллана алабыз.

Әйтик, безгә ip милеге кирәк, ул һәрвакыт киселгән сызыкны үз эченә ала, ягъни әйдәп баручы яки эзсез урыннарсыз. Без моны милек урнаштыручысында эшли алабыз:

-2

Синтаксис ярдәмендә ярдәм кирәк булса, документлардагы Сыйфат битенә керегез.

Хәер, бу функцияне бүтән сыйныфта кабат кулланырга кирәк икән? Делегатлар уенга керәләр:

-3

Шулай итеп, делегат - ике ысул белән класс: милеккә кыйммәт алу һәм билгеләү. Күбрәк мәгълүмат алу өчен, ул бу объектка ия булган объектның класс инстанциясендә эшли торган мөлкәтне ала! Менә без яңа төзелгән делегатны ничек куллана алабыз:

-4

:: класс инстанциясен милеккә кайтаручы оператор.

Билгеле, бу делегатларда супер-серле нәрсә юк. Ләкин гадилегенә карамастан, алар еш ярдәмгә килә. Әйдәгез, Android өчен кайбер мисалларны карап чыгыйк.

Сез рәсми документларда делегатлар турында күбрәк укый аласыз.

Еш кына безгә кайбер параметрларны фрагментка бирергә кирәк. Гадәттә бу шулай:

-5

Шуңа күрә без статик ысул ярдәмендә фрагмент ясап параметрларны узабыз. Эчтә параметрларны соңрак алу өчен фрагмент аргументларына куябыз.

Кодны аргумент белән бәйле логиканы алучыларга һәм милек урнаштыручыларга күчереп, кодны бераз матуррак итү безнең көчебездә.

-6

Ләкин барыбер, безгә һәр милек өчен бер үк код турында язарга кирәк. Алар күп булганда, процесс бик күңелсез. Моннан тыш, код аргументлар белән бу ачык эш белән бераз буталчык булып күренә.

Yetәм шулай да, аннан соң кодны матур итү ысулы бармы? Yesавап әйе. Youәм сез уйлаганча, без тапшырылган әйберләрне кулланачакбыз.

Стартка әзерләник. Фрагмент аргументлары төрле типтагы кыйммәтләр өчен аерым ысуллары булган объектта саклана. Шуңа күрә, әйдәгез, очраклы тип кыйммәтен тупларга тырышучы һәм төр ярдәм итмәсә, искәрмә ташлый торган киңәйтү функциясен ясыйк.

-7

Хәзер без делегатны булдырырга әзер:

-8

Делегат фрагмент аргументларыннан милек кыйммәтен укый, һәм милекнең бәясе үзгәргәч, ул фрагмент аргументларын чыгарып җибәрә (яки фрагмент булмаса, аргумент итеп яңасын ясый һәм куя). Делегат аннары без булдырган киңәйтү функциясен кулланып, бу аргументларга яңа кыйммәт яза.

Ике төр параметрны кабул итүче гомуми интерфейс. Беренчедән, без шулай эшләячәкбез, бу делегат фрагмент эчендә генә урнашачак. Аннан соң, без аның аргументлары белән идарә итеп фрагмент мисалына керә алырбыз.

Игътибар итегез, без милек исемен аргумент өчен ачкыч итеп кулланабыз, шуңа күрә ачкычларны тотрыклы итеп сакларга кирәкми.

Икенче төр параметры милекнең нинди кыйммәтләргә ия булуын билгели. Без, әлбәттә, төрне нульсез итеп куябыз, кыйммәтне укып булмаса, искәрмә ташлыйбыз. Бу безгә фрагменттагы нуль булмаган үзлекләр белән эшләргә мөмкинлек бирә, процессны нуль өчен рәнҗетүче тикшерүләрдән саклый.

Ләкин кайвакыт безгә милек юкка чыгарылырга тиеш. Шуңа күрә, әйдәгез, бүтән делегат булдырыйк, ул аргумент табылмаган очракта ташлама, киресенчә нульгә кайта:

-9

Хәзер уңайлыклар өчен кайбер функцияләр булдырыйк. Бу кирәк түгел, ләкин эстетик максатларда гына, нигә:

-10

Бик матур булып күренә, шулай бит?

Киләсе тапкыр кушымта башлангач, аларны тиз искә төшерү өчен, без еш кына кайбер кыйммәтләрне хәтердә сакларга тиеш. Мәсәлән, без кушымтаны көйләргә ярдәм итүче кайбер кулланучылар өстенлекләрен сакларга теләр идек. Моның гомуми ысулы - аларга төп кыйммәтне куллану.

Өч параметрны саклау һәм алу өчен җаваплы класс бар дип әйтик:

-11

Монда без демократик алдык һәм параметрларыбыз өчен кыйммәтләр алу һәм саклау ысулларын бирәбез. Без шулай ук махсус өстенлек ачкычын куллана һәм стандарт булмаган килешү кыйммәтенә ия булдык.

Againәм тагын, кабатланган код кисәкләре бар. Әлбәттә, без аларның кайберләрен шәхси ысулларга күчерә алабыз. Шуңа да карамастан, бездә бик авыр код бар. Шулай ук, без бу логиканы бүтән классларда кабат кулланырга телибез икән? Делегатлар кодны ничек чистарта алуларын карыйк.

Бу юлы без объект экспрессияләрен кулланачакбыз һәм класс өчен киңәйтү функцияләрен булдырачакбыз.

-12

Монда без киңәйтү функциясен ясадык, ул безнең делегат өчен билгесез төркемнең объектын кайтара.

Делегат милек кыйммәтен өстенлек ачкычы өчен функция кулланып өстенлек итеп укый. Килешү буенча, ачкыч - милекнең исеме, шуңа күрә без тотрыклыларны сакларга һәм узарга тиеш түгел. Шул ук вакытта, бездә, гадәттәгечә, төп каршылыкны өстенлекләр аша үтәргә яки ачкычка ачык керергә теләсәк, махсус ачкычны күчерү мөмкинлеге бар. Без шулай ук милек өчен өстенлекле булмаса, килешү бәясен бирә алабыз. када

Делегат шул ук төп функцияне кулланып, өстенлекләрдә яңа милек кыйммәтен саклау турында кайгырта.

Exampleзебезнең үрнәк эшләсен өчен, безгә төрләр өчен тагын ике делегат өстәргә кирәк, алар бер үк диярлек эшлиләр:

-13

Хәзер без сыйныфны матур итә алабыз:

-14

Хәзер код күпкә яхшырак күренә. Киләчәктә безгә яңа параметр кирәк булса, без аны туры мәгънәдә бер кодка өсти алабыз!

Бездә өч кыр булган гадәти күренеш бар дип уйланыла: исем, субтитр һәм тасвирлау. Allәм барысы да шулай:

-15

Weәм без бу өлкәдәге текстка керү һәм үзгәртү ысуллары белән тәэмин итүне телибез:

-16

Монда без макет эчендәге күренешләргә керү өчен бәйләнешләрне кулланабыз. KotlinAndroidExtensions

Билгеле, бездә аерым кодка җиңел күчерелә торган кайбер кодлар бар. Әйдәгез моны делегатлар ярдәмендә эшлик! Делегатны тексты белән эшләргә кайтаручы киңәйтү функциясен язабыз: TextViev,

-17

Сыйфатлар блоктагы күренешне тутырганнан соң башланганына инаныгыз, чөнки алар нуль булмаган булырга тиеш. init

Бу оригиналь кодтан зур үзгәрешләр кебек тоелмаска мөмкин, ләкин сүз делегатларның көчен күрсәтү иде. Моннан тыш, язу кызык.

Әлбәттә, сез чикләнмисез. Мәсәлән, монда күренүчәнлекне күрсәтү өчен делегат бар (ул вәкиллекнең макетта урын алып тору-булмавын билгели).

-18

Ләкин безнең клиентларда булса, без аларны ничек кулланырга тиеш:

-19

Билгеле, сез теләсә нинди әйберне тапшыра аласыз - һәм күк кенә сезнең чикләнүегез булсын!

Шулай итеп, без үсеш очраклары өчен үзлекләрне тапшыруның кайбер мисалларын карап чыктык, әлбәттә, сезнең заявкагызда аларны куллануның башка ысуллары бар дип уйларга хокукыгыз бар. Максат милек делегациясенең никадәр көчле булуын, һәм аның белән нәрсә эшләп була икәнен күрсәтү иде.

Шулай ук укыгыз:

Безне телеграммада укыгыз һәм.

Мәкәлә тәрҗемәсе

https://zen.yandex.ru/media/nuancesprog/delegaty-v-kotlin-dlia-android-5ed6838137f6715bef3af226