Method overloading — bir sinf yoki modul doirasida bir xil nomli, ammo parametrlar to‘plami bilan farqlanuvchi bir nechta metodni e’lon qilish usulidir. Chaqiruv vaqtida kompilyator yoki til muhiti argumentlarning soni, turi va ayrim hollarda nomiga qarab mos variantni tanlaydi. Bu imkoniyat bir mazmundagi amalni turli ko‘rinishdagi ma’lumotlarga yagona nom orqali qo‘llashga xizmat qiladi.
Signatura va tanlash qoidasi
Ortiqcha yuklangan metodlar odatda signatura orqali ajratiladi. Signaturaga metod nomi bilan birga parametrlar soni, tartibi va turlari kiradi. Qaytariladigan qiymat turi ko‘p tillarda signaturaning yetarli farqlovchi qismi emas, chunki chaqiruv yozuvidan qaysi natija turi kutilayotgani har doim aniqlanmaydi.
Masalan, Java tilida quyidagi variantlar alohida metodlar sanaladi:
int sum(int a, int b) { return a + b; }
double sum(double a, double b) { return a + b; }
int sum(int a, int b, int c) { return a + b + c; }
sum(2, 3) chaqiruvi birinchi, sum(2.5, 3.1) esa ikkinchi variantga mos keladi. Tanlash odatda kompilyatsiya paytida bajariladi; shu sababli method overloading statik polimorfizm shakli deb ham yuritiladi.
Turlarni moslashtirish
Aniq mos variant bo‘lmasa, ayrim tillar xavfsiz tur kengaytirishidan foydalanadi. Masalan, butun son double parametriga uzatilishi mumkin. Bir nechta variant bir xil darajada mos kelsa, chaqiruv noaniq bo‘lib, kompilyatsiya xatosi yuz beradi. Avtomatik o‘zgartirish, generik turlar, ixtiyoriy parametrlar va o‘zgaruvchan uzunlikdagi argumentlar to‘plami tanlashni murakkablashtiradi.
Yaxshi API eng aniq moslikni ko‘zda tutadi. Bir metod int, boshqasi long, uchinchisi esa umumiy Object qabul qilsa, dasturchi tilning ustuvorlik qoidalarini bilishi kerak. null kabi qiymatlar bir nechta havola turiga mos tushishi ham noaniqlik tug‘dirishi mumkin.
Qo‘llanish sohasi
Overloading konstruktorlar, matematik amallar, formatlash va turli manbalardan ma’lumot qabul qiluvchi APIlarda keng uchraydi. Masalan, fayl ochish metodi faqat yo‘lni, yo‘l bilan kodlash turini yoki yo‘l bilan kirish rejimini qabul qilishi mumkin. Barcha variantlarning semantik maqsadi bir xil bo‘lishi muhim: bir xil nom ostida mutlaqo boshqa ishlarni yashirish kodni tushunishni qiyinlashtiradi.
Ortiqcha variantlar hujjat va test hajmini oshiradi. Yangi overload qo‘shilganda ilgari boshqa variantga tushgan chaqiruv endi yangisiga tanlanishi mumkin. Kutubxona evolyutsiyasida manba kodi mosligi saqlansa ham, xatti-harakat o‘zgarishi ehtimoli tekshiriladi.
Overriding bilan chegarasi
Method overloading bir doirada bir xil nomli turli signaturalarga tegishli. Method overriding esa avlod sinfda ajdoddagi aynan mos metodning yangi amalga oshirilishini beradi va tanlov obyektning haqiqiy turiga qarab bajarilishi mumkin. Overloading chaqiruvdagi e’lon qilingan turlarga, overriding esa ko‘pincha dinamik dispatchga tayanganligi bilan farqlanadi.
Python kabi dinamik tillarda bir nomni qayta e’lon qilish avvalgi metodni odatda almashtirib yuboradi. Bunday tillarda o‘xshash natija standart qiymatlar, *args, tur tekshiruvi yoki maxsus ko‘p dispatch kutubxonalari orqali yaratiladi. Demak, atama tilning tipi va metod tanlash modeliga bog‘liq holda talqin qilinadi.
Dizayn mezonlari
Parametrlar o‘rtasidagi farq chaqiruvni o‘qigan odamga tushunarli bo‘lishi kerak. Ko‘p sonli boolean yoki bir xil turdagi parametrlar overload o‘rniga nomlangan parametr, konfiguratsiya obyekti yoki alohida metod nomini talab qilishi mumkin. Har bir variant chegaraviy qiymatlar, avtomatik tur almashtirish va noaniq chaqiruvlar bo‘yicha test qilinadi. Shunda qulay sintaksis aniqlik hisobiga qurilmaydi.
Bog‘liq tushunchalar
Method overriding, Static polymorphism, Method signature, Type conversion, Dynamic dispatch, Generic programming