Кіріспе

Бағдарламалық жасақтаманы бағдарламалау техникасы

Бағдарламалық жасақтамада басқаруды кері айналдыру (IoC) – компьютерлік бағдарламаның арнайы жазылған бөліктері жалпы фреймворктен басқару ағынын қабылдайтын жобалау принципі. “Инверсия” термині тарихи: осы жобалау үлгісінде бағдарламалық жасақтама процедуралық бағдарламалауға қарағанда басқаруды “кері” бұрады. Процедуралық бағдарламалауда бағдарламаның жеке коды жалпы тапсырмаларды орындау үшін қайта пайдалануға болатын кітапханаларды шақырады, бірақ басқаруды кері айналдыру арқылы фреймворк жеке кодты шақырады. Басқаруды кері айналдыру графикалық пайдалану ортасының пайда болуынан бастап қолданбаларды әзірлеу фреймворктерінде кеңінен қолданылып келеді және GUI орталарында да, веб-серверлік қолданба фреймворктерінде де қолданыла береді. Басқаруды кері айналдыру бағдарламаны қолданбалы бағдарламалаушы анықтаған әдістер арқылы кеңейтуге мүмкіндік береді. Оқиғаға негізделген бағдарламалау көбінесе IoC-ті қолдана отырып жүзеге асырылады, сондықтан жеке код тек оқиғаларды өңдеумен ғана айналысуы керек, ал оқиғалар циклін және оқиғалар/хабарламаларды жіберуді фреймворк немесе орындау уақыты ортасы басқарады. Веб-серверлік қолданбалар фреймворктерінде диспетчерді әдетте маршрутизациялау деп атайды, ал өңдеушілерді – соңғы нүктелер деп атауға болады. “Басқаруды кері айналдыру” деген сөз тіркесі Java бағдарламалаушылар қауымдастығында, атап айтқанда, Java фреймворктеріндегі “IoC контейнерлері” сияқты Spring фреймворкі сияқты, объектінің тәуелділіктерін енгізу үлгілеріне қатысты қолданылады. Осы басқа мағынада “бақылауды кері айналдыру” дегеніміз – қолданба объектілері қолданатын тәуелділіктердің іске асырылуына фреймворк бақылауын беру. Сөйтіп, кітапхана таңдалған опцияны функция шақырудың мәні ретінде қайтарады, ал негізгі функция осы мәнді байланысты команданы орындау үшін пайдаланады. Бұл стиль мәтінге негізделген интерфейстерде жиі кездеседі. Мысалы, электрондық пошта клиенті жаңа поштаны жүктеу, ағымдағы поштаға жауап беру, жаңа пошта жасау және т.б. командалары бар экранды көрсете алады, ал бағдарламаның орындалуы пайдаланушы команданы таңдау үшін перне басуын тоқтатады. Басқаруды кері бұру арқылы бағдарлама әдеттегі мінез-құлық және графикалық элементтерді, мысалы терезелер жүйесін, мәзірлерді, тышқанды басқаруды және т.б. білетін бағдарламалық жасақтаманы қолдана отырып жазылады. Әдеттегі код фреймворк үшін “бос орындарды толтырады”, мысалы, мәзір элементтерінің кестесін қамтамасыз ету және әрбір элемент үшін кодты ішкі бағдарламаны тіркеу, бірақ бұл пайдаланушының әрекеттерін бақылайтын және мәзір элементі таңдалған кезде ішкі бағдарламаны шақыратын фреймворк. Пошта клиенті мысалында фреймворк пернетақта мен тышқанның кіруін қадағалап, пайдаланушы шақырған команданы шақыра алады және сонымен бірге жаңа хабарламалар келіп түскенін білу үшін желі интерфейсін бақылап, желідегі кейбір белсенділік анықталған кезде экранды жаңарта алады. Осыны кестелік кесте бағдарламасының немесе мәтін редакторының қаңқасы ретінде қолдануға болады. Керісінше, фреймворк веб-браузерлер, электронды кестелер немесе мәтіндік редакторлар туралы ештеңе білмейді; олардың функционалдығын іске асыру үшін арнайы код қажет. Басқаруды кері айналдыру қайта қолдануға болатын код пен проблемаға тән код бір қолданбада бірге жұмыс істесе де, олар өздігінен әзірленеді дегенді білдіреді. Callback, scheduler, event loops және template әдісі – бұл бақылау принципіне кері қарайтын дизайн үлгілерінің мысалдары, дегенмен бұл термин көбінесе объектіге бағдарланған бағдарламалау аясында қолданылады. (Тәуелділік инъекциясы – Java фреймворктері кеңінен тараған “тәуелділіктердің іске асырылуын кері басқару” деген жеке, нақты идеяның мысалы.) Бұл бағдарламаның инверсиялық тұжырымдамасымен тығыз байланысты, оны Майкл Джексон 1970 жылдары өзінің “Джексонның құрылымды бағдарламалау” әдістемесінде сипаттаған. Төменнен жоғары қарай талдаушыны жоғарыдан төмен қарай талдаушының инверсиясы ретінде қарастыруға болады: бір жағдайда басқару талдаушыда, ал екінші жағдайда – қабылдаушы қолданбада болады. Бұл терминді Майкл Маттсон диссертациясында қолданған (оның бастапқы мағынасы керісінше емес, қолданбалық кодты шақыратын фреймворк) және одан кейін Стефано Маццоччи одан алып, 1999 жылы Apache Software Foundation-ның Avalon жобасы бойынша танымал болған. Бұл жерде ол ата-ана объектісінің орындау ағынын басқарумен қатар, бала объектісінің тәуелділіктерін беруін білдірді. Бұл фраза 2004 жылы Роберт К. Мартин және Мартин Фаулер тарапынан одан әрі танымал болды, соңғысы бұл терминнің бастауын 1980 жылдарға дейін жегізеді.

Веб-қосымшалар фреймворктері

Бұл ASP.Net Core веб-қосымшасының мысал коды веб-қосымша хостын құрайды, соңғы нүктені тіркейді, содан кейін басқаруды фреймворкке жүктейді:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Сәлем, әлем!");
app.Run();