Кіріспе

Дерек ретінде беріліп, басқа функциямен шақырылатын функция. Компьютерлік модемдермен кері шақыру тақырыбы. Компьютерлік бағдарламалауда кері шақыру – дерек түрінде (анықтама) сақталатын және басқа функциямен шақырылатын функция, көбінесе бастапқы абстракция деңгейіне. Кері шақыру параметрін қабылдайтын функция, шақырушысына қайтып оралғанға дейін кері шақыру үшін жасалуы мүмкін, мұндай жағдай синхронды немесе тоқтатушы деп аталады. Кері шақыруды қабылдайтын функция, оны қайтарғаннан кейін шақыру үшін сақтауға мүмкіндік беретіндей етіп жасалуы мүмкін, бұл асинхронды, тоқтатушы емес немесе кейінге шегерілген деп аталады. Бағдарламалау тілдері кері шақыруды әртүрлі тәсілдермен қолдайды, мысалы, функциялық көрсеткіштер, лямбда өрнектері және блоктар арқылы.

Салыстырмалылық

Бұл ұғымды түсінуге көмектесу үшін, өмірден алынған мысал келтірейік. Бір клиент дүкенге тапсырыс беру үшін келеді. Бұл – бірінші шақыру сияқты. Клиент сатушыға тауарлар тізімін, олардың құнына төлем жасау үшін чек пен жеткізу туралы нұсқауларды береді. Бұл бірінші шақырудың параметрлері, соның ішінде кері шақыру, яғни жеткізу нұсқаулары. Чек ақшаға айналдырылады және нұсқаулар орындалады деп түсініледі. Қызметкерлер мүмкіндігі болғанда, тапсырыс бойынша тауарларды жеткізеді, бұл кері шақыруды іске қосу сияқты. Маңыздысы, тапсырысты қабылдаған сатушы міндетті түрде жеткізуді жүзеге асырмауы мүмкін. Кері шақыруды параметр ретінде қабылдаған функция оны шақыруға міндетті емес. Сондай-ақ, жеткізу клиентке тікелей жасалуы міндетті емес. Кері шақыру шақырушы функцияға жасалуы да міндетті емес. Шындығында, функция әдетте өзін кері шақыру ретінде жібермейді. Кейбір адамдар кері шақыруды қолдануды шатастыратындықтан, кері шақыру телефон қоңырауындағыдай бастапқы шалушыға қайтарылмайды, деп санайды.

Қолдану

Бұғатталған кері шақыру, кері шақыруды жіберген функцияның орындалу контекстінде іске асады. Ал кейінге қалдырылған кері шақыру, үзіліс кезінде немесе басқа жіптен (thread) сияқты, бөлек контекстте іске қосылуы мүмкін. Сондықтан, кейінге қалдырылған кері шақыруды синхрондау үшін және жұмысты басқа жіпке жүктеу үшін қолдануға болады.

Оқиғаларды басқару

Қайта шақыруды оқиғаларды өңдеу үшін пайдалануға болады. Көбінесе, кодты пайдаланатын бөлік белгілі бір оқиға түрі үшін қайта шақыруды тіркейді. Оқиға орын алғанда, қайта шақыру іске қосылады. Қайта шақырулар жиі терезелік жүйеде жұмыс істейтін бағдарламаның графикалық пайдаланушы интерфейсін (GUI) бағдарламалау үшін қолданылады. Бағдарлама терезелік жүйенің шақыруы үшін арнайы қайта шақыру функциясына сілтеме береді. Терезелік жүйе бұл функцияны тышқанның басуы және пернелерді басу сияқты оқиғалар туралы бағдарламаны хабардар ету үшін шақырады.

Асинхронды әрекет

Асинхронды өңдеуді іске асыру үшін кері шақыру қолданылуы мүмкін. Шақырушы бір әрекетті сұрайды және сол әрекет аяқталғанда шақырылатын кері шақыруды береді, бұл сұраныс жасалғаннан кейін көп уақыт өткен соң болуы мүмкін.

Іске асыру

Қайта шақыру технологиясы бағдарламалау тіліне қарай әртүрлі жүзеге асырылады. Ассемблер, C, C++, Паскаль, Modula2 және басқа тілдерде кері шақыру функциясы функцияның нұсқауы ретінде ішкі жадта сақталады. Ортақ жадты пайдалану арқасында әртүрлі тілдер жобалау немесе орындау кезінде өзара әрекеттесу қабатынсыз кері шақыруларды тікелей бөлісе алады. Мысалы, Windows API бірнеше тіл, компилятор және ассемблер арқылы қолжетімді. C++ нысандарға функцияны шақыру операциясын жүзеге асыру мүмкіндігін де береді. Стандартты үлгілер кітапханасы осы нысандарды (функторлар деп аталады) параметрлер ретінде қабылдайды. JavaScript, Lua, Python, Perl және PHP сияқты көптеген динамикалық тілдер функция объектісін беруге мүмкіндік береді. C# және VB.NET сияқты CLI тілдері типтік қауіпсіздікті қамтамасыз ететін функция нұсқауын қамтиды, ол делегат деп аталады. NET тілдерінде қолданылатын оқиғалар мен оқиғаларды өңдеушілер кері шақыруды қамтамасыз етеді. Функционалдық тілдер әдетте бірінші дәрежелі функцияларды қолдайды, оларды басқа функцияларға кері шақыру ретінде беруге, дерек ретінде сақтауға немесе функциялардан қайтаруға болады. Perl, Python, Ruby, Smalltalk, C++ (11+), C# және VB.NET (жаңа нұсқалары) және көптеген функционалдық тілдер сияқты көптеген тілдер, ламбда өрнектерін, атаусыз функцияларды, тікелей синтаксиспен жазылатын және көбінесе кері шақыру ретінде әрекет ететін функцияларды қолдайды. Схема, ML, JavaScript, Perl, Python, Smalltalk, PHP (5.3.0 нұсқасынан бастап), C++ (11+), Java (8 нұсқасынан бастап) және тағы да басқа тілдерде ламбда жабылу болып табылуы мүмкін, яғни ламбда анықталған контексттегі жергілікті анықталған айнымалыларға қол жеткізе алады. Java сияқты объектіге бағытталған бағдарламалау тілінде, функциялық аргументтерге дейінгі нұсқаларда кері шақыру мінез-құлқы интерфейсті жүзеге асыратын объектіні беру арқылы қамтамасыз етіледі. Бұл объектінің әдістері кері шақырулар болып табылады. PL/I және ALGOL 60 тілдерінде кері шақыру процедурасы оны қамтитын блоктардағы жергілікті айнымалыларға қол жеткізуі қажет болуы мүмкін, сондықтан ол кіру нүктесі мен контексттік ақпаратты қамтитын кіру айнымалысы арқылы шақырылады.

C++ тілінде

C++ тілінде функциялық көрсеткіштермен қатар функторларды да қолдануға болады.