Кіріспе

Полиморфтық функцияларды әртүрлі типтегі аргументтерге қолдану

Бағдарламалау тілдерінде, ad hoc полиморфизмі – полиморфтық функцияларды әртүрлі типтегі аргументтерге қолдануға мүмкіндік беретін полиморфизмнің бір түрі. Себебі полиморфтық функция, оған қолданылған аргумент(тер) түріне байланысты, бірнеше ерекше және мүмкін гетерогендік іске асыруларды білдіре алады. Объектіге бағытталған немесе процедуралық ұғымдарға қатысты қарастырылғанда, бұл функцияны немесе операторды жүктеу деп те аталады. Бұл контексте ad hoc термині жағымсыз мағынада қолданылмайды; ол жай ғана осы полиморфизм түрі типтік жүйенің негізгі ерекшелігі емес екенін көрсетеді. Бұл параметрлік полиморфизмге қарсы, онда полиморфтық функциялар нақты типті көрсетпей жазылады, соның салдарынан бір абстрактілі іске асыруды кез келген типке ашық түрде қолдануға болады. Бұл жіктеме 1967 жылы Кристофер Стречимен енгізілген.

Ертеде міндетті түрде

Ad hoc полиморфизм – бұл жөнелту механизмі: бір атаулы функция арқылы басқару бірнеше функцияға жіберіледі, осы функциялардың қайсысы шақырылатынын нақты көрсетудің қажеті жоқ. Ашығу (overloading) әртүрлі типтегі бірнеше функцияны бірдей атаумен анықтауға мүмкіндік береді; компилятор немесе интерпретатор дұрыс функцияның шақырылуын автоматты түрде қамтамасыз етеді. Осылайша, бүтін сандар тізімдерін, жолдар тізімдерін, нақты сандар тізімдерін және т.б. қосатын функцияларды жазуға болады, және олардың барлығы append деп аталады – ал қосылатын тізімдердің типіне байланысты дұрыс append функциясы шақырылады. Бұл параметрлік полиморфизмнен өзгеше, онда функция кез келген тізіммен жұмыс істеу үшін жалпы түрде жазылуы керек. Ашығуды пайдалану арқылы функцияға берілген кіріс типіне байланысты екі толыққандай әртүрлі нәрсені орындау мүмкін; мұндай мүмкіндік параметрлік полиморфизмде жоқ. Ашығуға тағы бір көзқарас – реттілік (routine) тек атауымен емес, атауының және оның параметрлерінің санының, ретінің және типтерінің комбинациясымен бірегей түрде анықталады. Полиморфизмнің бұл түрі объектіге бағытталған бағдарламалау тілдерінде кең таралған, олардың көпшілігі операторларды функциялар сияқты ашып (overload) беруге мүмкіндік береді (операторларды ашып беру қараңыз). Динамикалық түрде типтелмеген және ad hoc полиморфизмі жоқ (түр кластарын қоса алғанда) кейбір тілдерде print int, print string сияқты ұзын функция атаулары қолданылады. Мұны адамның көзқарасына байланысты артықшылық (түсініктірек) немесе кемшілік (әртүрлі сөздерге толы) деп қарастыруға болады. Ашып беруден кейде пайда болатын артықшылық – маманданудың көрінуі, яғни бір атаудағы функция әртүрлі жолдармен іске асырылуы мүмкін, әрқайсысы жұмыс істейтін нақты дерек типіне оңтайландырылған. Бұл өнімділік үшін бірнеше жағдайға мамандану қажет код үшін ыңғайлы интерфейс бере алады. Бірақ кемшілігі – типтік жүйе әртүрлі іске асырулардың дәйіндігін кепілдей алмайды. Ашып беру компиляция уақытында орындалатындықтан, ол кіші типтегі полиморфизмдегі кеш байланысқа (late binding) балама болып табылмайды.

Кейін байлау

Алдыңғы бөлімге қарамастан, ad hoc полиморфизмінің басқа да жолдары бар. Мысалы, Smalltalk тілін қарастырайық. Smalltalk-та жүктеме орындалу кезінде жасалады, себебі әрбір жүктелген хабарламаның ("жүктелген функция") әдістері ("функцияны іске асыру") орындалуға дайын тұрғанда анықталады. Бұл бағдарлама компиляцияланғаннан кейін орындалу кезінде болады. Сондықтан полиморфизм басқа тілдердегідей, субтип полиморфизмі арқылы беріледі, және орындалу уақытында ad hoc полиморфизмімен функционалдығы кеңейтіледі. Жақын қарағанда, Smalltalk арнайы полиморфизмнің сәл өзгеше түрін ұсынатынын көреміз. Smalltalk-та кеш байланыс орындалу моделі бар, және ол объектілерге түсінілмеген хабарламаларды өңдеу қабілетін береді, сондықтан нақты хабарламаны арнайы жүктеместен полиморфизмді қолдана отырып, функционалдықты іске асыруға болады. Бұл күнделікті бағдарламалау үшін әдетте ұсынылмайтын тәжірибе болғанымен, проксилерді іске асыру кезінде өте пайдалы болуы мүмкін. Сонымен қатар, жалпы алғанда, әдеттегі сынып әдістері мен конструкторларды жүктеу полиморфизм деп есептелмейді, бірақ сыныптар тұрақты объектілер болып табылатын біркелкі тілдер бар. Мысалы, Smalltalk-та сыныптар тұрақты нысандар. Бұл өз кезегінде сыныптарға жіберілген хабарламаларды жүктеуге мүмкіндік береді, сондай-ақ сыныптар иерархиясынан мұрагерлік алмайтын, сыныптар сияқты әрекет ететін объектілерді құруға болады. Бұл Smalltalk-тің қуатты рефлексия мүмкіндіктерін пайдалануға арналған тиімді техникалар. Осыған ұқсас тәсілдер Self және Newspeak сияқты тілдерде де қолданылуы мүмкін.