#11 – Interface. Umumiy dasturlash teoriyasi. Dasturlashni o’rganish kursi

Video variantida ko’rish: https://www.youtube.com/watch?v=kuDo66QYteI

Mashina haydash uchun uning motori qanaqa ishlashini bilish shart emas. Porshen (рус: По́ршень) nima ekanligini bilish kerak emas. Mashina murakkab mexanizmlardan iborat, lekin ularni tushunmasdan – mashinaga ta’sir qilish mumkin, u haqida har hil ma’lumotarni olish mumkin.

Misol uchun tormoz va gaz pedallari orqali mashinaning tezligiga ta’sir qilamiz. Maxsus ko’rsatkichlar orqali hozirgi tezlikni bilib olishimiz mumkin. Rul orqali esa mashinaning yo’nalishini boshqaramiz.

Ushbu rul, pedallar va tezlik ko’rsatgichlari interface deyiladi. Interface ni kelishuv deb tushunsak bo’ladi. Demak odamlar mashinalarda gaz va tormoz pedallari, rul va tezlik ko’rsatkichi bo’lishini kelishib olishgan. Bundan ko’proq narsalar bo’lishi mumkin, masalan 3-pedal. Lekin kamida kelishivdagi barcha elementlar bo’lishi shart. Ularning qanday ishlashlari – mashina chiqaruvni kompaniyalarga havola.

Ya’ni VolksWagen kompaniyasi mashinalar Chevrolet kompaniyasi mashinalaridan keskin farq qilishi mumkin. Tashqi ko’risnishi, ularning motorlari, yoqilg’i turlari – o’zga bo’lishi mumkin. Lekin uning ruli, kamida ikkita pedali va tezlik ko’rsatkichi bo’ladi.

Shuning uchun ham, qanaqa mashina sotib olishimizni bilmasakda, mashina haydashni o’rgana boshlashimiz mumkin.

Kompyuterda ham shunaqa – oynalik interfeys degan tushuncha bor. Ushbu interfeysda barcha dasturlar oyna shaklida bo’lib, ularni joylashuvini o’zgartirishimiz, yoki x (iks) tugmachasi orqali oynani yopisimiz mumkin. Oynalik interfeyslar har hil: Windows operatsion tizimining oynalik interfeysi, Mac OTning oynalik interfeysi bor. Linux operatsion tizimida esa bir qancha – har hil oynalik interfeyslar bor. Ushbu dasturlar har hil dasturchilar tomonidan yozilagan. Har hil tillarda yozilgan – lekin asosiy qoidalari bir. Shuning uchun bir oynalik interfeysni o’rganib, ikkinchisiga o’tish qiyin emas.


interface Foo
{
    void bar(string baz);
}

Dasturlarshda ham Interface – sinfda qanaqa usullar bo’lishi kerakligini aniqlab beradi, lekin usullarda qanaqa kod bo’lishini sinfning o’ziga havola qilib beriladi.


void bar(string baz)

Usul ikki – bosh va tan’a qismlaridan iboratdir. Bosh qismga uning nomi, qaytarish turi va parametrlari kiradi.


{
    print bar;
}

Usulning komandalar guruhi esa – tan’a qismi deyiladi.


{
    void bar(string baz);
    void foo2(int bar2, bool baz2);
}

Tushinib turganingizdek interface yaratish uchun – usul bosh qismlarini bir guruh qilib,


interface
{
    void bar(string baz);
    void foo2(int bar2, bool baz2);
}

guruh oldidan interface kalit so’zini yozamiz.


interface Foo
{
    void bar(string baz);
    string foo2(int bar2, bool baz2);
}

Interface so’zidan so’ng – uning nomini yozamiz.


interface FooInterface
{
    void bar(string baz);
    string foo2(int bar2, bool baz2);
}

Oddiy sinf nomlaridan farq qilishi uchun, keling har bir yaratadigan interface-lar nomi oxirida “interface”  so’zini qo’shamiz. Huddi sinflarda bo’lgani kabi, endi biz FooInterface nomli yangi tur ham yaratdik.


void someFunction(FooInterface foo)
{
    print foo.foo2(1, true);
}

Bu yerda usulga qanaqa obyekyt kelishidan qat’iy nazar, be’malol uning foo2() nomli usulini chaqirishimiz mumkin. Sababi biz faqa usulda FooInterface turga mansub obyektni qabul qilayapmiz. Bu turdagi interface da esa foo2() usuli borligini bilamiz.


class Bar
{
}

Bar foo = new Bar;
someFunction(foo); // bu yerda xato

Keling, ushbu funksiyani chaqiramiz. Buning uchun avval biror obyekt yarataylik. Lekin funksiyani chaqirmoqchi bo’lsak kompilyator bizga xatolikni ko’rsatadi. Chunki funksiyamiz FooInterface turiga tegishli bo’gan obyekt kutayapti, biz esa Bar turig tegishli obyekt yubordik.


class Bar implements FooInterface
{
}

Bar foo = new Bar;
someFunction(foo);

Bar sinfimizda FooInterface da bor usullarni amalga oshirish uchun – sinf nomidan so’ng implements kalit so’zini yozamiz. Undan so’ng esa FooInterface so’zini yozamiz. Implements so’zi –  biror bir sinf, qaysidir interface ni amalga oshiradi, ya’ni interface da ko’rsatilgan usul nomlarining ta’nalarini yozib chiqadi degani. Ushbu kodda Bar sinfi FooInterface interface ini amalga oshiradi demoqdamiz.


class Bar implements FooInterface // bu yerda xato
{
}

Bar foo = new Bar;
someFunction(foo);

Kodni yurg’izmoqchi bo’lsak yana xatolik yuz beradi. Kompilyator bizga: “Bar sinfida FooInterface da ko’rsatilgan usullar yo`q” demoqda.


class Bar implements FooInterface
{
    void bar(string baz)
    {
        print "Bar usuli chaqirildi";
    }

    string foo2(int bar2, bool baz2)
    {
        print "foo2 usuli chaqirildi";
        return "text";
    }
}

Bar foo = new Bar;
someFunction(foo);

Keling, ushbu FooInterface da ko’rsatilgan usullarni qo’shamiz. Bu safar kodimiz to’g’ri ishlaydi. Demak biz foo obyektini yaratdik va uni someFunction funksiyasiga yubordik. U yerda ushbu obyektning foo2 usuli chaqirildi. Demak ekranga ushbu tekst chiqadi: “foo2 usuli chaqirildi”. 


interface LogInterface
{
    void info(string text);
}

Endi esa haqiqatga yaqinroq misol ko’ramiz: LogInterface yarataylik. Log deb tizimning habarlarni yozib qoldiruvchi sinflarga aytiladi.


class FileLog implements LogInterface
{
    void info(string text)
    {
        // bu yerda tekstni fayda saqlovchi 
        // kod bo’ladi
    }
}

Habarlarni faylda saqlovchi sinf yaratamiz.


FileLog logger = new FileLog;
logger.info("Test");

Dasturimiz kerakli joylarida ushbu obyektimizni ishlatishimiz mumkin. Dasturning hech qaysi usullari Filelog sinfini qabul qilmasin, uning o`rniga LogInterface interface-i qabul qilinsa, ushbu FileLog sinfimizni vaqti kelganda oson boshqa sinf bilan almashtirishimiz mumkin.


class DbLog implements LogInterface
{
    void info(string text)
    {
        // bu yerda tekstni ma’lumotlar
        // omborida saqlovchi kod bo’ladi
    }
}

// FileLog logger = new FileLog;
DbLog logger = new DbLog;
logger.info("Test");

Misol uchun habarlarni ma’lumotlar omborida saqlovchi sinf ham yarataylik. Endi bizda LogInterface interface-ini amalga oshiruvchi 2 ta sinf bor. Endi osongina FileLog sinfini DbLog sinfi bilan almashtirib qo’yishimiz mumkin.

Agar Interface mavzusini tushinishga qiynalgan bo’lsangiz havotir olmang. Boshlovchi dasturchilar odatda interface ishlatishmaydi. Agar tushingan bo’lsangiz, ofarin, chunki bu rostdan ham qiyin mavzu. Esingizdan chiqmasin: usullar biror bir sinfni emas, interface ni qa’bul qilishi to’g’riroq hisoblanadi.

MULTILINE COMMENT

// bu bir qatorlik izoh

Dasturlashda bir qatorlik izohlardan tashqari, bir necha qatorlik izoh qoldirish iloji ham bor.


/*
 Bu izoh
 Bu ham izoh
 Bunisi ham izoh
*/

Ushbu turdagi izohlarni boshlash uchun / va * belgisini qo’yamiz. Uzohni yakunlash uchun esa aksincha – * va / belgisini qo’yishimiz kerak.

22+

#11 – Interface. Umumiy dasturlash teoriyasi. Dasturlashni o’rganish kursi” ga 1 fikr qoldirilgan

  1. 7021020lochinbek

    Assakomu Aleykum Anvar aka, dasrlarni yaxshi tushunirgansiz bundan muammo yoq, biroq kodlarni yozayotganizda kodlarni hammasini bitta ekranga yozganizda chalkashliklar bolmas edi chunki o’zim shunda juda chalkashdim, biron-bir kod yozganizda bu koddan oldin yozgan kodiz shu kodga tegishli ekanini boshida tushunmay 15-20 martalab ko’dim 🙂 Sizga omad!!!!!!!

    14+

Fikr bildirish