OOP: Qora quti yoxud dasturlash mag'zi
Salom, hammaga. OOP seriasidagi darslarimizni boshlasak ham bo'ladi. Deyarli barcha dastrurchilar va ko'pchilik dasturlashni o'rganayotganlar uchun «OOP» degan atama tanish va uni tushunish, tasavvur etish yetarlicha bilim hamda tajribani talab qiladi. Professional dasturchilar uchun bu «ajoib narsa, dasturlash mag'zi» bo'lsa, dasturlashga endi kirib kelayotganlar uchun esa «qora quti», talabalar uchun esa «domladan boshqa hech kim tushunmaydigan keraksiz mavzu» sifatida qaraladi. Aslida u nima?
Domla tili bilan aytganda: "OOP — dasturlash konsepsiyasi bo'lib, bunda dasturlashdagi barcha narsa obyekt va obyektlar tizimi sifatida talqin qilinadi va ...", dexqonchasiga esa: "OOP — obyektlarni obyektlar yordamida yaratish", dasturchi tilida esa "OOP — klass, metod, obyekt, obyektlar". Bu turlicha gaplarning mantig'i bitta fikr "OOP — dasturlashni obyektlar yordamida tashkil qilish usuli" desak menimcha hech kim hafa bo'lmaydi. Iltimos, ushbu abzatsni qayta qayta o'qib chiqing toki nimanidir tushungunizcha.
Endi «Obyekt» atamasi ortida aynan nima yashiringanligiga to'xtalsak. Obyekt — bu jism. Uni keng ma'noda «jismlar», «jarayon», «tizim»(sistema) deb ham tushunsak bo'ladi. Jism bu real hayotdagi narsa, mavjudod, buyum va hodisa. Demak bu terminlarni hammasini bitta so'z bilan — «obyekt» deb atasak. Ixtiyoriy obyekt — bir nechta obyektlardan tashkil topgan. Ixtiyoriy jarayon yoki voqelikda ham ko'plab obyektlar qatnashadi. Shu o'rinda «tizim» — bir necha obyektdan tashkil topgan murakkab obyekt ekanligini etiborga olsak ixtiyoriy obyektni tizim sifatida yoki tizimni obyekt sifatida qarashimiz mumkin. Masalan real hayotdagi mashina — bu obyekt. Avtomashina ko'plab obyektlar (dvigatel, korpus, akkumlyator, g'ildirak va boshqa ichki mexanizmlar) dan tashkil topgan. Demak mashinani tizim sifatida qarasak ham bo'ladi. O'z navbatida dvigatel ham ko'plab obyektlar (tsilindr, porshen, svecha)dan tashkil topgan. Va hakazo, shu kabi ixtiyoriy obyekt yoki tizimni mayda qismlarga bo'lib tashlasak bo'ladi. Bu real hayotdagi obyektlardir.
Endi dasturlashdagi obyekt nima, qanday tuzilgan, nima uchun dasturlashga obyektni olib kirdik? Avval quyidagilarni aniqlashtirib olsak:
Birinchidan, dasturlashning maqsadi nima? — Maqsad real hayotdagi tizim yoki jarayonlarni kompyuterlashtirish ya'ni ularni modellashtirish yoki dasturlashtirish, ularni boshqaruvchi virtual tizim yaratish. Yaratganda ham real hayotdagi tizimlar bilan bir xil ishlovchi, ularni vazifalarini aynan bajaruvchi va asosiysi oddiy foydalanuvchilarga ko'plab qulayliklar yaratuvchi tizim bo'lishi kerak. Masalan agar avtosalonlarda avtomobil xarid qilish va navbat olishning elektron tizimini yaratadigan bo'lsak bu tizimda qatnashuvchi obyektlar: mashina, avtosalon, haridor, navbat, buyurtma, to'lov, bank kabilar bo'ladi. Bu obyektlarni har birini alohida mustaqil tizim deb qaraymiz, chunki ularning har biri yana boshqa bir obyektlardan tashkil topgan. Ana endi shu tizimni ishlab chiqsak (dasturlasak!) istalgan shaxs kompyuter va internet tarmog'i orqali real mashina xarid qilish uchun to'lov o'tqazishi, elektron navbatga turishi va vaqti kelganda mashinani salondan olib ketishi mumkin. Bu holda yaratilgan ushbu tizim real hayotdagi tizimlar bilan bir xil vazifa bajaradi, lekin ulardan qulay, tez va samaradorligi bilan ajralib turadi. Mana, maqsadni aniqlab oldik.
Ikkinchidan, ushbu tizimni qanday ishlab chiqamiz? — Tasavvur qiling yuqorida aytib o'tilgan tizimni yaratish — ya'ni uni dasturlab chiqish talab etilsin. Ammo biz bir-ikki dasturlash tillari va ular yordamida kvadrat tenglama, funksiya grafigi yoki shunga o'xshash o'quv nazariyalaridan boshqa narsa bilmaymiz. Bularning o'zi yetarli emasligi aniq! Bu ko'nikmalar o'quvchini faqatgina dasturlashga olib kirish uchun kerak, amalda esa bundanda murakkab yoki yirik bilimlar qo'llaniladi: yuqori darajali dasturlash tillari (high level programming languages), ma'lumotlar bazasi (DBMS), klient-server texnologiyalari, foydalanuvchi interfeysi dizayni, ma'lumotlarni himoyalash… va hakazo. Bularning har biri mustaqil yo'nalish, bir dunyo bilim. Yo'q siz ushbu bilimlarni ish va o'qish jarayonida birin-ketin o'rganib boraverasiz, asosiysi — bugungi mavzu, ya'ni OOP va uning yuqorida qo'yilgan maqsad (mashina xarid qilishning elektron tizimi)ni ishlab chiqishda dasturchiga beradigan yordami. Demak ushbu tizimni yaratishda bizga OOP yordam beradi. Keling endi ozgina nazaryaga o'tsak va aynan nima uchun murakkab tizimlarni loyihalash va yaratishda OOP asosiy qurol ekanligini bilib olsak.
Umuman olganda dasturlash (programming) ning 2 ta uslubi (konsepsiyasi yoki usuli, paradigmi) bor:
1. Funksional dastrulash (Procedure Orientated Programming) usuli: Dastur kodi ketma-ket bajaraladigan operatorlar, matematik ifodalar, buyruqlar va funksiyalardan iborat. Eslagan bo'lsangiz dasturlash asoslari yoki informatikada o'rgatilgan sodda masalalar (kvadrat tenglama, aylana yuzasi, yoki funksiya grafigi)ni, Paskal, Basic, C tillari yordamida dasturlab ko'rganmiz. Bu tillar quyi darajali dasturlash tillari (low level programming languages) hisoblanib murakkab va yirik tizimlarni dasturini ishlab chiqishda juda ham noqulay hisoblanadi. Nega? Tasavvur qiling yuqoridagi qo'yilgan vazifani Paskal yoki C da yozib chiqish uchun qancha ish qilinadi? Nari borsa bir necha yuzlab funksiyalar va ular orasidagi o'zaro aloqadan iborat bo'ladi. Agar siz juda ham aqilli va qobilyatli bo'lgan taqdirizda ham minglab qator dastur kodini yozib chiqasiz, ishonaman qurbingiz yetadi, lekin dastur kodini kerak paytda o'zgartirish, yangilik va qo'shimcha kiritishga kelganda bosh qotadi, yoki siz yozgan dastur kodini boshqa bir dasturchi hamkoringiz tushunmaydi. O'zingiz yozgan kod o'ziz uchun boshog'rigi bo'ladi.
2. Obyektli dasturlash (Object Orientated Programming) usuli: Dastur kodi obyektlardan va ular orasidagi o'zaro bog'liqliklardan iborat. Bu qanday? Bu shundayki siz real hayotdagi obyektlarni dasturlaysiz, qandaydir masala yoki topshiriqni emas! Dastur bir nechta obyektlardan, obyektlar yordamida bajariladigan amallardan va obyektlar orasidagi axborot almashishdan iborat bo'ladi. Obyektni qanday dasturlaymiz, qanday qoidalari bor, obyektlarni qanday qilib dastur kodiga yuklaymiz — bularning bari navbatdagi darslarda. Muhimi hozircha biz yirik tizimlarni (umuman olganda ixtiyoriy sodda masalani ham) dasturlashda obyektga yo'naltirilgan dasturlash usuli, ya'ni OOP juda ham samarali ekanligini bilamiz. Quyidagi 2 ta grafik orqali berilgan 2 ta uslubni yanada aniqroq tushunib olish mumkin.
a. Funksional dasturlash:
b. Obyektli dasturlash:
3. Google Orientated Programming — googleda qidirib topib dasturlash :)
4. Copy-Paste Orientated Programming — birovnikini ko'chirib dasturlash :)
Eee, uzr adashib ketdim, 3 bilan 4 bu menimcha yangi yo'nalishlar, asosiysi 1 bilan 2.
Real hayotdagi obyekt tushunchasiga yuqorida to'xtaldik, endi dasturchi obyektni qanday tushunadi?
Obyekt — bu o'zaro aloqador xususiyatlar (data, states, fields, properties) va ular ustidagi amallar (functions, behaviours, methods, events)dan iborat yaxlitlik. Demak obyektda 2 turli narsa bor ekan: xususiyatlar va metodlar. Xususiyat deganda obyekt haqidagi har qanday ma'lumot, yoki obyektning ma'lum bir boshqa tashkil etuvchi obyekti tushuniladi. Metod deganda shu obyekt bajaradigan vazifa yoki shu obyekt ustida bajariladigan malum bir amalni tushunamiz. Harakat qilamizki, real obyektlar bilan dasturdagi obyektlarni ayanan o'xshash yaratishga. Masalan plastik kartochka bu — real hayotda to'lovlarni naqd pulsiz amalga oshirishga yordam beradigan obyekt.
Uning xususiyatlari:
Shu o'rinda OOP — nafaqat dasturlash usuli, balki, dasturchining fikr qilish usuli desak ham bo'ladi. Agar sizda OOP usulida fikrlash va tasavvur qilish qobilyati shakillangan bo'lsa ixtiyoriy tizim yoki masala dasturini yaratishda hech qanday qiyinchilik bo'lmaydi. Hech kimda o'z-o'zidan OOP da tasavvur qilish qobilyati shakillanmaydi, buning uchun OOP ning asosiy qoidalarini o'rganib chiqish, tushunish va amalda qo'llab ko'rish zarur. Demak, sizlar bilan navbatdagi darsda OOP ning asosiy qoidalari bilan tanishib chiqamiz.
Ushbu seriadagi darslar kimlar uchun?
OOP ni tushunishni xohlagan va dasturlashdan boshlang'ich bilimlarga ega bo'lgan o'rganuvchilar uchun. Professional dasturchilardan esa ajoib va mazmunli fikrlarini kutib qolamiz :).Foydasi bormi?
Umuman olganda bu blogda foydasiz narsalar yozilmaydi, agar bu narsa sizni qiziqtirsa demak albatta foydasi bo'ladi. Bo'lajak dasturchi sifatida OOP ni tushunmaslik go'yoki velosiped turganda piyoda yurishdek gap.Talablar?
Mavzuga aloqador dastur kodlari Java tilida berib boriladi, shuning uchun undan ozgina xabardor bo'lish kerak. Bundan tashqari ilova qilingan havolalarni ham o'qib chiqish koni foyda. Har bir dastur kodini o'z kompyuteringizda ishlatib ko'ring, o'zgartiring, qo'shimchalar kiriting: takrorlash, sinab ko'rish va mustaqil o'rganishga hech qanday o'quv metodi teng kela olmaydi :). Asosiy terminlarni ingliz tilidagi varianti ham quyuq va kursiv shriftda berib boriladi, ular haqida google amakidan so'rab o'qib ko'ring. Demak birinchi darsimizni boshladik.OOP nima?
OOP — ingliz tilidagi Object Orientated Programming atamasining qisqartmasi, o'zbek tilimizda «Obyektga yo'naltirilgan dasturlash» deb tarjima qilinadi. Dasturchilar orasida «OOP» sifatida juda mashxur. Tarixi, kelib chiqishi va boshqa-boshqalar bilan batafsil wikida o'qib oling (mavzuni tugatganimizdan so'ng). Talabalik yillarimizida deyarli tushunib yetmaganmiz, «Dasturlash texnologiyalari», «OYDT» kabi fanlarda tushunishga va tushuntirilishga rosa «harakat qilingan» mavzu :). Afsus o'sha paytlarda bizda self-studying kuchli bo'lmagan yoki fan o'qituvchilari o'zi endi o'rganayotgan mavzu bo'lgan. Keyinchalik ish va qo'shimcha o'qish jarayonida amallab tushunib olganmiz. OOP ni iloji boricha erta tushunish va tasavvur qilish dasturchini dasturlashga bo'lgan qiziqishi va qarashlarini to'g'ri shakillantirar ekan. Shu sababdan bugungi talabalar kechi bilan bakalavrni tugatguncha, normal holda 2-kursni tugatguncha bu narsa bilan «oshna-og'ayni» bo'lib olishlari kerak.Domla tili bilan aytganda: "OOP — dasturlash konsepsiyasi bo'lib, bunda dasturlashdagi barcha narsa obyekt va obyektlar tizimi sifatida talqin qilinadi va ...", dexqonchasiga esa: "OOP — obyektlarni obyektlar yordamida yaratish", dasturchi tilida esa "OOP — klass, metod, obyekt, obyektlar". Bu turlicha gaplarning mantig'i bitta fikr "OOP — dasturlashni obyektlar yordamida tashkil qilish usuli" desak menimcha hech kim hafa bo'lmaydi. Iltimos, ushbu abzatsni qayta qayta o'qib chiqing toki nimanidir tushungunizcha.
Endi «Obyekt» atamasi ortida aynan nima yashiringanligiga to'xtalsak. Obyekt — bu jism. Uni keng ma'noda «jismlar», «jarayon», «tizim»(sistema) deb ham tushunsak bo'ladi. Jism bu real hayotdagi narsa, mavjudod, buyum va hodisa. Demak bu terminlarni hammasini bitta so'z bilan — «obyekt» deb atasak. Ixtiyoriy obyekt — bir nechta obyektlardan tashkil topgan. Ixtiyoriy jarayon yoki voqelikda ham ko'plab obyektlar qatnashadi. Shu o'rinda «tizim» — bir necha obyektdan tashkil topgan murakkab obyekt ekanligini etiborga olsak ixtiyoriy obyektni tizim sifatida yoki tizimni obyekt sifatida qarashimiz mumkin. Masalan real hayotdagi mashina — bu obyekt. Avtomashina ko'plab obyektlar (dvigatel, korpus, akkumlyator, g'ildirak va boshqa ichki mexanizmlar) dan tashkil topgan. Demak mashinani tizim sifatida qarasak ham bo'ladi. O'z navbatida dvigatel ham ko'plab obyektlar (tsilindr, porshen, svecha)dan tashkil topgan. Va hakazo, shu kabi ixtiyoriy obyekt yoki tizimni mayda qismlarga bo'lib tashlasak bo'ladi. Bu real hayotdagi obyektlardir.
Endi dasturlashdagi obyekt nima, qanday tuzilgan, nima uchun dasturlashga obyektni olib kirdik? Avval quyidagilarni aniqlashtirib olsak:
Birinchidan, dasturlashning maqsadi nima? — Maqsad real hayotdagi tizim yoki jarayonlarni kompyuterlashtirish ya'ni ularni modellashtirish yoki dasturlashtirish, ularni boshqaruvchi virtual tizim yaratish. Yaratganda ham real hayotdagi tizimlar bilan bir xil ishlovchi, ularni vazifalarini aynan bajaruvchi va asosiysi oddiy foydalanuvchilarga ko'plab qulayliklar yaratuvchi tizim bo'lishi kerak. Masalan agar avtosalonlarda avtomobil xarid qilish va navbat olishning elektron tizimini yaratadigan bo'lsak bu tizimda qatnashuvchi obyektlar: mashina, avtosalon, haridor, navbat, buyurtma, to'lov, bank kabilar bo'ladi. Bu obyektlarni har birini alohida mustaqil tizim deb qaraymiz, chunki ularning har biri yana boshqa bir obyektlardan tashkil topgan. Ana endi shu tizimni ishlab chiqsak (dasturlasak!) istalgan shaxs kompyuter va internet tarmog'i orqali real mashina xarid qilish uchun to'lov o'tqazishi, elektron navbatga turishi va vaqti kelganda mashinani salondan olib ketishi mumkin. Bu holda yaratilgan ushbu tizim real hayotdagi tizimlar bilan bir xil vazifa bajaradi, lekin ulardan qulay, tez va samaradorligi bilan ajralib turadi. Mana, maqsadni aniqlab oldik.
Ikkinchidan, ushbu tizimni qanday ishlab chiqamiz? — Tasavvur qiling yuqorida aytib o'tilgan tizimni yaratish — ya'ni uni dasturlab chiqish talab etilsin. Ammo biz bir-ikki dasturlash tillari va ular yordamida kvadrat tenglama, funksiya grafigi yoki shunga o'xshash o'quv nazariyalaridan boshqa narsa bilmaymiz. Bularning o'zi yetarli emasligi aniq! Bu ko'nikmalar o'quvchini faqatgina dasturlashga olib kirish uchun kerak, amalda esa bundanda murakkab yoki yirik bilimlar qo'llaniladi: yuqori darajali dasturlash tillari (high level programming languages), ma'lumotlar bazasi (DBMS), klient-server texnologiyalari, foydalanuvchi interfeysi dizayni, ma'lumotlarni himoyalash… va hakazo. Bularning har biri mustaqil yo'nalish, bir dunyo bilim. Yo'q siz ushbu bilimlarni ish va o'qish jarayonida birin-ketin o'rganib boraverasiz, asosiysi — bugungi mavzu, ya'ni OOP va uning yuqorida qo'yilgan maqsad (mashina xarid qilishning elektron tizimi)ni ishlab chiqishda dasturchiga beradigan yordami. Demak ushbu tizimni yaratishda bizga OOP yordam beradi. Keling endi ozgina nazaryaga o'tsak va aynan nima uchun murakkab tizimlarni loyihalash va yaratishda OOP asosiy qurol ekanligini bilib olsak.
Umuman olganda dasturlash (programming) ning 2 ta uslubi (konsepsiyasi yoki usuli, paradigmi) bor:
1. Funksional dastrulash (Procedure Orientated Programming) usuli: Dastur kodi ketma-ket bajaraladigan operatorlar, matematik ifodalar, buyruqlar va funksiyalardan iborat. Eslagan bo'lsangiz dasturlash asoslari yoki informatikada o'rgatilgan sodda masalalar (kvadrat tenglama, aylana yuzasi, yoki funksiya grafigi)ni, Paskal, Basic, C tillari yordamida dasturlab ko'rganmiz. Bu tillar quyi darajali dasturlash tillari (low level programming languages) hisoblanib murakkab va yirik tizimlarni dasturini ishlab chiqishda juda ham noqulay hisoblanadi. Nega? Tasavvur qiling yuqoridagi qo'yilgan vazifani Paskal yoki C da yozib chiqish uchun qancha ish qilinadi? Nari borsa bir necha yuzlab funksiyalar va ular orasidagi o'zaro aloqadan iborat bo'ladi. Agar siz juda ham aqilli va qobilyatli bo'lgan taqdirizda ham minglab qator dastur kodini yozib chiqasiz, ishonaman qurbingiz yetadi, lekin dastur kodini kerak paytda o'zgartirish, yangilik va qo'shimcha kiritishga kelganda bosh qotadi, yoki siz yozgan dastur kodini boshqa bir dasturchi hamkoringiz tushunmaydi. O'zingiz yozgan kod o'ziz uchun boshog'rigi bo'ladi.
2. Obyektli dasturlash (Object Orientated Programming) usuli: Dastur kodi obyektlardan va ular orasidagi o'zaro bog'liqliklardan iborat. Bu qanday? Bu shundayki siz real hayotdagi obyektlarni dasturlaysiz, qandaydir masala yoki topshiriqni emas! Dastur bir nechta obyektlardan, obyektlar yordamida bajariladigan amallardan va obyektlar orasidagi axborot almashishdan iborat bo'ladi. Obyektni qanday dasturlaymiz, qanday qoidalari bor, obyektlarni qanday qilib dastur kodiga yuklaymiz — bularning bari navbatdagi darslarda. Muhimi hozircha biz yirik tizimlarni (umuman olganda ixtiyoriy sodda masalani ham) dasturlashda obyektga yo'naltirilgan dasturlash usuli, ya'ni OOP juda ham samarali ekanligini bilamiz. Quyidagi 2 ta grafik orqali berilgan 2 ta uslubni yanada aniqroq tushunib olish mumkin.
a. Funksional dasturlash:
b. Obyektli dasturlash:
3. Google Orientated Programming — googleda qidirib topib dasturlash :)
4. Copy-Paste Orientated Programming — birovnikini ko'chirib dasturlash :)
Eee, uzr adashib ketdim, 3 bilan 4 bu menimcha yangi yo'nalishlar, asosiysi 1 bilan 2.
Real hayotdagi obyekt tushunchasiga yuqorida to'xtaldik, endi dasturchi obyektni qanday tushunadi?
Obyekt — bu o'zaro aloqador xususiyatlar (data, states, fields, properties) va ular ustidagi amallar (functions, behaviours, methods, events)dan iborat yaxlitlik. Demak obyektda 2 turli narsa bor ekan: xususiyatlar va metodlar. Xususiyat deganda obyekt haqidagi har qanday ma'lumot, yoki obyektning ma'lum bir boshqa tashkil etuvchi obyekti tushuniladi. Metod deganda shu obyekt bajaradigan vazifa yoki shu obyekt ustida bajariladigan malum bir amalni tushunamiz. Harakat qilamizki, real obyektlar bilan dasturdagi obyektlarni ayanan o'xshash yaratishga. Masalan plastik kartochka bu — real hayotda to'lovlarni naqd pulsiz amalga oshirishga yordam beradigan obyekt.
Uning xususiyatlari:
- o'lchami (eni va balandligi)
- turi (onlayn yoki offlayn)
- banki (ipoteka, agrobank ...)
- hisob raqami
- balansi
- valyuta turi (so'm, dollar, rubl)
- … kabilardir.
- to'lov o'tqazish
- balansni tekshirish
- balansni to'ldirish
- pin kod qo'yish
- pin kodni tekshirish
- hisob raqamini belgilash
- … kabilar
Shu o'rinda OOP — nafaqat dasturlash usuli, balki, dasturchining fikr qilish usuli desak ham bo'ladi. Agar sizda OOP usulida fikrlash va tasavvur qilish qobilyati shakillangan bo'lsa ixtiyoriy tizim yoki masala dasturini yaratishda hech qanday qiyinchilik bo'lmaydi. Hech kimda o'z-o'zidan OOP da tasavvur qilish qobilyati shakillanmaydi, buning uchun OOP ning asosiy qoidalarini o'rganib chiqish, tushunish va amalda qo'llab ko'rish zarur. Demak, sizlar bilan navbatdagi darsda OOP ning asosiy qoidalari bilan tanishib chiqamiz.
Keyingi maqolalarni kutib qolamiz mageUz... ;)