{"id":4143,"date":"2022-12-29T17:41:49","date_gmt":"2022-12-29T17:41:49","guid":{"rendered":"https:\/\/texnokun.uz\/?p=4143"},"modified":"2022-12-30T13:01:26","modified_gmt":"2022-12-30T13:01:26","slug":"oop-nima","status":"publish","type":"post","link":"https:\/\/texnokun.uz\/?p=4143","title":{"rendered":"OOP NIMA?"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Bismillah. <\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Bu maqolada OOP nima ekanligini o&#8217;zim bilgancha yoritib berishga harakat qilaman. Maqolada kod misollari TypeScript&#8217;da ko&#8217;rsatilishiga qaramasdan, u OOP&#8217;ni TypeScript&#8217;da qanday ishlatish haqida emas, umumiy OOP va unga aloqador tushunchalar haqida.<\/em><\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/telegra.ph\/file\/e31545ccdbbbb25584b54.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">OOP picture<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Kirish\">Kirish<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>OOP(Object Oriented Programming) <\/strong>&#8211; obyekt va class&#8217;larga asoslangan dasturlash paradigmasidir. Boshqacharoq qilib aytganda, u biror dastur yasash uchun kod yozganda foydalaniladigan bir uslubdir. Bunday paradigmalar judayam ko&#8217;p. Logika va funksiyalarga asoslangan FOP (function oriented programming), protseduralarga asoslangan POP (procedure oriented programming) paradigmalardan farqli ravishda OOP asosan obyekt va classlardan foydalanadi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OOP va shu kabi boshqa paradigmalar biror tilga bog&#8217;lanib qolgan yoki aynan bir tilning xususiyati emas. Aksincha, dasturlash tillari ma&#8217;lum paradigmalarni o&#8217;zida qo&#8217;llab quvvatlaydigan qilib yasaladi. Ba&#8217;zi tillar aynan bir paradigmaning ustiga qurilsa, boshqalarida bir nechta paradigmalarni ishlatish imkoniyati bor. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Masalan, Haskell tili tabiatan FOP ustiga qurilgan. Java esa azaldan OOP ni qo&#8217;llab quvvatlab kelgan bo&#8217;lsa, 8-versiyasidan boshlab, FOP ni ham qo&#8217;llab quvvatlashni boshladi. JavaScriptda OOP va FOP uslublarining har ikkalasida ham kod yozishingiz mumkin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Keling, OOPga chuqurroq kirishdan avval, OOP ga aloqador asosiy tushunchalar mundarijasi bilan tanishib olsak, so&#8217;ng har biriga alohida to&#8217;xtalamiz.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">OOP paradigmasi biror dasturlash tilida qo&#8217;llanilishi uchun shu dasturlash tilidagi quyidagi element yoki tip yoki data tiplardan foydalaniladi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Class <\/strong>(required)<\/li>\n\n\n\n<li><strong>Object <\/strong>(required)<\/li>\n\n\n\n<li><strong>Interface <\/strong>(optional)<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Aslida, ba&#8217;zi tillarda class yoki interface degan narsani o&#8217;zi bo&#8217;lmasligi mumkin. Lekin OOP paradigmasi nuqtai nazaridan, ular qiladigan ishni qila oladigan alternative bo&#8217;lsa yetarli. Masalan, JavaScriptda 2015-yilga qadar class&#8217;lar bo&#8217;lmagan. Interface haligacha yo&#8217;q. Dasturchilar constructor funksiyalardan class o&#8217;rnida foydalanishgan. Xatto biz keyinoq tanishadigan Inheritence uchun JavaScriptda &#8220;prototypal inheritence&#8221; uslubidan foydalanishgan. Lekin 2015-yilda JavaScriptda, aslida u constructor funksiya uchun &#8220;syntax sugar&#8221; hisoblansa ham, class&#8217;lar paydo bo&#8217;ldi.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/telegra.ph\/file\/be64bb016af9fb5ba6d0f.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">ES5 constructor function<\/figcaption><\/figure>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"485\" src=\"https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-4-1024x485.png\" alt=\"\" class=\"wp-image-4144\" srcset=\"https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-4-1024x485.png 1024w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-4-300x142.png 300w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-4-768x364.png 768w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-4-1536x728.png 1536w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-4.png 1710w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption class=\"wp-element-caption\">ES6 class<\/figcaption><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Syntax sugar &#8211; dasturlash tilida ma&#8217;lum bir sintaksisni soddaroq, osonroq yoki boshqacharoq variantda yozish imkoniyati<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">OOP paradigmasining eng asosiy to&#8217;rtta ustuni bor. Bular Class va Object&#8217;lardagi yoki ular o&#8217;rtasidagi turli imkoniyatlarni anglatadi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Abstraction<\/strong><\/li>\n\n\n\n<li><strong>Encapsulation<\/strong><\/li>\n\n\n\n<li><strong>Inheritance<\/strong><\/li>\n\n\n\n<li><strong>Polymorphism<\/strong><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Bundan tashqari, Class va Object&#8217;lar orasidagi bir biriga bo&#8217;lgan bog&#8217;liqlikning ham bir necha turlari bor:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Association<\/strong><\/li>\n\n\n\n<li><strong>Dependency<\/strong><\/li>\n\n\n\n<li><strong>Composition<\/strong><\/li>\n\n\n\n<li><strong>Aggregation<\/strong><\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Object,-Class\">Object, Class<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Object va class&#8217;lar ichiga kirishdan avval Alexander Shvets tomonidan yozilgan &#8220;<a href=\"https:\/\/refactoring.guru\/design-patterns\/book\" target=\"_blank\" rel=\"noreferrer noopener\">Dive Into Design Patterns<\/a>&#8221; kitobida OOP&#8217;ga berilgan ta&#8217;rifni keltirib o&#8217;tsam:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Object-oriented programming<\/strong> is a paradigm based on the concept of wrapping pieces of data, and behavior related to that data, into special bundles called <strong>objects<\/strong>, which are constructed from a set of \u201cblueprints\u201d, defined by a programmer, called <strong>classes<\/strong>.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Mazmuni quyidagicha:<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\"><strong>Obyektga yo&#8217;naltirilgan dasturlash<\/strong> bu, biror ma&#8217;lumotni yoki shu ma&#8217;lumotga bog&#8217;liq harakatlarni, dasturchilar tomonidan yoziladigan &#8220;<strong>class<\/strong>&#8220;lar deb ataluvchi qoliplar orqali yaratiladigan &#8220;<strong>object<\/strong>&#8221; deb ataluvchi to&#8217;plamlarga biriktirish konsepsiyasiga asoslangan paradigmadir.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Tushunmagan bo&#8217;lsangiz, qaytadan o&#8217;qing \ud83d\ude42<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Object<\/strong> &#8211; &#8220;key&#8221; va &#8220;value&#8221; lardan tashkil topgan data strukturadir. Har bir object&#8217;da biror key va shu key&#8217;ga biriktirilgan qiymat bo&#8217;ladi. Object ichidagi bu qimatlar key&#8217;lar orqali boshqariladi.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/telegra.ph\/file\/193cf3a7c48e03928680b.png\" alt=\"\"\/><figcaption class=\"wp-element-caption\">Object example<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Class<\/strong> &#8211; o&#8217;z ichida ma&#8217;lum bir ma&#8217;lumotlarni yoki biror amallarni bajaradigan funksiyalarni ushlab turuvchi data tip. OOP&#8217;da class&#8217;lar object&#8217;lar uchun &#8220;blueprint&#8221; ya&#8217;ni chizma yoki qolip vazifasini bajaradi. Har qanday object biror bir class&#8217;ning instance&#8217;i ya&#8217;ni avlodi yoki bolasi hisoblanadi. Class o&#8217;z ichida object&#8217;da bo&#8217;lishi kerak bo&#8217;lgan xususiyatlarni va harakatlarni ifoda qiladi, keyin esa, shu class&#8217;dan instance olinadi ya&#8217;ni object yasaladi. Lekin, shu yerda sizda savol tug&#8217;ilishi mumkin. Yuqoridagi rasmda ko&#8217;rsatilgan car objecti qaysi classdan instance olayapti? Aslida, u JavaScript&#8217;dagi &#8220;Object&#8221; classidan instance olayapti, lekin bu &#8220;syntax sugar&#8221; bo&#8217;lgani uchun buni yozish shart emas.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Instance &#8211; qachonki biror object biror class orqali yasalganda, shu yasalgan object o&#8217;sha class uchun instance hisoblanadi.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Keling buni mushuklar misolida chuqurroq ko&#8217;ramiz. Tasavvur qiling, biz dasturimizda turli mushuklarga tegishli ma&#8217;lumotlarni ishlatmoqchimiz yoki saqlamoqchimiz. Demak bizda judayam ko&#8217;p mushuklar bo&#8217;lishi mumkin va har bir mushukning deyarli bir xil xususiyatlari bo&#8217;ladi, faqat ularning qiymatlari farq qiladi. Masalan, har bir mushukning boshi, ko&#8217;zi, oyoqlari bor, bu mushukning xususiyatlaridir(attributes). Shuningdek, mushuk nafas oladi, yuguradi, miyovlaydi, bu uning harakatlaridir(behavior).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu yerda har bir mushuk &#8211; object, har bir mushuk uchun umumiy xususiyatlar va harakatlarni to&#8217;plagan to&#8217;plam &#8211; class.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/telegra.ph\/file\/249b5a1bd2ff4f894431e.png\" alt=\"\"\/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Class ichidagi xususiyat(attribute), o&#8217;sha classning field&#8217;i deyiladi.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Class ichidagi harakat yoki funksiya(behavior), o&#8217;sha classning method&#8217;i deyiladi.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Class ichidagi barcha field va method&#8217;lar umumiy o&#8217;sha classning member&#8217;lari deyiladi.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Object ichidagi key&#8217;larga biriktirilgan data, odatda o&#8217;sha objectning state&#8217;i hisoblanadi.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Object ichidagi key&#8217;larga biriktirilgan funksiyalar, odatda o&#8217;sha objectning behavior&#8217;i hisoblanadi.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Class va object&#8217;lar ichidagi xususiyatlarni belgilashda aniq keyword&#8217;lar bo&#8217;lsa ham, ko&#8217;p dasturchilar class yoki object ichidagi funksiyadan boshqa har qanday qiymat ushlab turuvchi key&#8217;ni o&#8217;rinma o&#8217;rin <strong>property<\/strong>, <strong>attribute<\/strong>, <strong>field<\/strong>, key yoki <strong>member <\/strong>deya atashadi. Object va class ichidagi funksiyani o&#8217;zida ushlab turuvchi keyni yoki o&#8217;sha funksiyani o&#8217;zini esa odatda <strong>method <\/strong>deyishadi.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Yuqoridagi misoldan ko&#8217;rib turganingizdek, Baroqvoy ham, Momiqvoy ham Mushuk classining instance&#8217;lari hisoblanadi. Shuning uchun ham har ikkala object ichidagi field va method&#8217;lar bir xil, faqatgina qiymatlari farq qiladi.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Abstraction\">Abstraction<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Abstaction judayam abstrakt tushuncha. Internetda bu bo&#8217;yicha maqola qidirisangiz, ko&#8217;pchilik bir birinikiga o&#8217;xshamagan ta&#8217;riflar beradi yoki ko&#8217;pincha <strong><em>Encapsulation <\/em><\/strong>bilan chalkashtirishadi. Keling soddaroq qilib tushunishga harakat qilamiz. Siz biror dastur uchun class yozganingizda, keyinchalik undan undan olinadigan instance&#8217;lar ichida hamma yozilgan funksional kodni tashqariga chiqarishni xoxlamaysiz. Odatda, judayam maxmiy ma&#8217;lumotlar yoki shu ma&#8217;lumotlar ustida bajariladigan amaliyotlar object ichida qolishi kerak bo&#8217;ladi, yoki user&#8217;ga faqatgina shu object qiladigan ishlarni manipulate qiladigan memberlarni qoldirib, qolgan implementation&#8217;ni yashirish kerak bo&#8217;ladi.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Abstraction &#8211; class yoki object ichidagi ma&#8217;lum member&#8217;larni tashqarida ulanish imkoniyatini yashirib, ular private qilib qo&#8217;yishga yoki faqatgina ayni context&#8217;ga tegishli memberlarni public qoldirib, ichki implementation&#8217;ni yashirishga aytiladi.<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1010\" src=\"https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-5-1024x1010.png\" alt=\"\" class=\"wp-image-4145\" srcset=\"https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-5-1024x1010.png 1024w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-5-300x296.png 300w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-5-768x757.png 768w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-5-1536x1514.png 1536w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-5.png 1842w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Yuqoridagi kod misolida, MathLib class&#8217;i ichida private va public memberlar e&#8217;lon qilingan. JavaScriptda class memeber&#8217;ini private qilish uchun uni oldiga <strong><em>#<\/em><\/strong> qo&#8217;yiladi. Boshqa tillarda odatda <strong><em>private <\/em><\/strong>degan keyworddan foydalanishadi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ko&#8217;rib turganingidek, math objectining public <em>add <\/em>va <em>minus <\/em>method&#8217;lari chaqirilganda, ular o&#8217;z ichida private member&#8217;lardagi qiymatlarni qo&#8217;shib yoki ayirib berayapti. Lekin to&#8217;g&#8217;ridan to&#8217;g&#8217;ri object orqali shu private memberlarga ulanishga urinilganda, bunga ruxsat berilmaydi. Bu abstraction&#8217;ning JavaScriptdagi ko&#8217;rinishi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu yerda MathLib kutubxonasini user foydalanishi uchun faqatgina <em>add <\/em>va <em>minus <\/em>method&#8217;lari public qilib, ular ishni bajarishi uchun kerak bo&#8217;lgan qolgan member&#8217;larni tashqi tomondan yashirilayapti. Chunki uni ishlatayotgan user raqamlarni qayerda saqlanayotgani va uni tekshirish jarayoni implement qilingan kodga ulanishini keragi yo&#8217;q.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abstraction ikki xil bo&#8217;ladi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><em>Data abstraction<\/em><\/strong> &#8211; class ichidagi fieldlarni tashqi tomondan yashirish.<\/li>\n\n\n\n<li><strong><em>Process abstraction<\/em><\/strong> &#8211; class ichidagi ba&#8217;zi method&#8217;larni tashqi tomondan yashirish.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Yuqoridagi misolda, <em>#isInteger<\/em> method&#8217;i process abstraction uchun misol bo&#8217;sa, <em>#num1<\/em> va <em>#num2<\/em> data abstraction uchun misoldir.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Class ichidagi member&#8217;lar uch xil bo&#8217;ladi.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Public &#8211; class ichidagi barcha memberlar, dastlabki holatda public bo&#8217;ladi. Ya&#8217;ni tashqaridan turib ularga ulanish va ularni ishlatish mumkin.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Private &#8211; class ichidagi faqatgina shu class o&#8217;z ichida ishlata oladigan, tashqaridan ulanishga ruxsat yo&#8217;q bo&#8217;lgan field yoki method.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Protected &#8211; class ichidagi faqatgina shu class yoki shu class&#8217;dan meros olgan(inheritence) boshqa class o&#8217;z ichida ishlata oladigan, lekin tashqaridan ulanishga ruxsat yo&#8217;q bo&#8217;lgan field yoki method. Hamma dasturlash tillari class ichida bunday memberlarni e&#8217;lon qilish imkoniyatini bermaydi. Masalan JavaScriptda buni imkoni yo&#8217;q lekin TypeScriptda bor.<\/p>\n<\/blockquote>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Encapsulation\">Encapsulation<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Encapsulation odatda abstraction bilan birga implement qilinadi. Balki shuning uchun ham ularni farqlab olish biroz qiyindir. Odatda class ichidagi member&#8217;lar &#8220;by default&#8221; public bo&#8217;ladi. Ya&#8217;ni ularga tashqaridan turib ulanish mumkin. Ularni yashirish uchun tepada gaplashganimizdek private qilishimiz kerak.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Encapsulation jarayonini xuddi blenderning ishlashiga o&#8217;xshatish mumkin. Blender ichiga kerakli mahsulotlarni solasiz (input). Keyin esa uning kerakli bir-ikkita tugmasini bosasiz, tamom(interface). Sok tayyor. Lekin siz uning ichidagi maxsus qurilmalar qanday qilib tok kuchlanishini meyorga keltirayotganini, kichik motor qanday qilib parrakni belgilangan tezlikda aylantirayotganini ko&#8217;rmaysiz. Ya&#8217;ni bularni hammasi blender ichida yashirilgan(abstraction). Sizga esa faqat uni ishlatish uchun kerakli tugmalar berilgan(interface, encapsulation).<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Encapsulation &#8211; class yoki object ichidagi state va behavior&#8217;larni yakdil entity yoki interface&#8217;ga biriktirishdir. Yoki boshqacharoq aytganda, class ichidagi member&#8217;larga ulanish yoki ishlatish imkoniyatini biror kapsulaga o&#8217;rab qo&#8217;yishdir. User shu ko&#8217;rsatilgan interface orqaligina classni ishlata oladi. Abstraction&#8217;dan faqrli tomoni, encapsulation&#8217;da memberlar private qilinmaydi. Ya&#8217;ni siz faqatgina yashirilgan memberlarni emas, public memberlar&#8217;ni ham kapsulaga olishingiz mumkin.<\/p>\n<\/blockquote>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/telegra.ph\/file\/36056590f299abba4d785.png\" alt=\"\"\/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Garchi public member&#8217;larni ham kapsulaga olib faqatgina belgilangan interface orqali ulanish imkoniyatini qoldirish mumkin bo&#8217;lsa ham, odatda uni abstraction bilan birga ishlatishadi. Ya&#8217;ni ichki state va behavior&#8217;larning hammasi yashiriladi va ularni ishlatish uchun alohida interface yaratiladi. Interface hammasini jamlab turuvchi bitta yoki bir nechta entity bo&#8217;lishi mumkin.<\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Diqqat! Bu yerda dasturlash tillaridagi interface tipi haqida gapirilmayapti.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Yuqoridagi misoldan ko&#8217;rishingiz mumkinki, class ichidagi private field&#8217;larni qiymatini o&#8217;zgartirish va ularga tashqaridan ulanish uchun JavaScriptdagi maxsus &#8220;getter\/setter&#8221;lardan foydalangan holda interface yasalib, kapsulaga olib qo&#8217;yilgan. Bunday qilish orqali ma&#8217;lum hollarda data&#8217;ga ulanish imkonini kim uchundir taqiqlash yoki qiymatni o&#8217;zgartirishdan avval turli validation kabi ishlarni amalga oshirish mumkin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bundan tashqari, xuddi blender misolidagi kabi, butun insonni harakatga keltirish uchun uning ichki behavior&#8217;lariga to&#8217;g&#8217;ridan to&#8217;g&#8217;ri, har biriga ulanmasdan, faqatgina <strong><em>boshla <\/em><\/strong>interface&#8217;i orqali butun jarayon ishga tushurilayapti. Bu xuddi kalitni burash orqali mashinani o&#8217;t oldirishga ham o&#8217;xshab ketadi. Siz faqat maxsus interface orqali ichki behavior&#8217;larni ishga tushurasiz.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Inheritance\">Inheritance<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">OOP asoslari ichida eng tushunishga osoni menimcha Inheritance bo&#8217;lsa kerak. So&#8217;zni o&#8217;zidan ham ko&#8217;rinib turibdiki, u &#8220;meros qoldirish&#8221; degan ma&#8217;noni beradi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Siz qurayotgan dasturda bir nechta class&#8217;larda umumiy memberlar bo&#8217;lishi mumkin. Shunaqa payt o&#8217;sha umumiy member&#8217;larni boshqa class&#8217;ga ko&#8217;chirib, qolgan class&#8217;larni esa unga inherit qilib qo&#8217;yilsa, ya&#8217;ni bola qilib qo&#8217;yilsa, ota class&#8217;dagi barcha public va protected member&#8217;lar bolaga meros bo&#8217;lib o&#8217;tadi. Bu bitta kodni qayta qayta ishlatish imkonini beradi.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"837\" src=\"https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-6-1024x837.png\" alt=\"\" class=\"wp-image-4146\" srcset=\"https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-6-1024x837.png 1024w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-6-300x245.png 300w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-6-768x628.png 768w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-6.png 1522w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Super class &#8211; meros qoldirayotgan ota class.<\/p>\n<\/blockquote>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n<p class=\"wp-block-paragraph\">Derived class &#8211; meros olayotgan bola class.<\/p>\n<\/blockquote>\n\n\n\n<p class=\"wp-block-paragraph\">Odatda, ko&#8217;p tillarda, ota classdan barcha protected va public member&#8217;lar meros bo&#8217;lib o&#8217;tadi. Private member&#8217;lar meros bo&#8217;lib o&#8217;tmaydi. Lekin ota class&#8217;dagi private memberlarga bola class&#8217;dan maxsus yo&#8217;llar bilan bog&#8217;lanish mumkin. Buning uchun, ota class&#8217;da o&#8217;sha private member&#8217;ga bog&#8217;laydigan biror public interface yasash kerak bo&#8217;ladi. Bu public interface bolaga meros bo&#8217;lib o&#8217;tadi va ota classdagi private member&#8217;ga reference&#8217;ni saqlab qoladi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">JavaScript&#8217;da agar derived class&#8217;da maxsus constructor funksiya elon qilinmasa, u otasinikidan foydalanadi. Agar derived class o&#8217;z constructor funksiyasini e&#8217;lon qilsa, uning ichida super class constructorini chaqirib qo&#8217;yishi shart. Unga argument yuborish esa ixtiyoriy.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"Polymorphism\">Polymorphism<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Rostini aytsam, aynan polymorphism nazariyasini o&#8217;rganish uchun ko&#8217;p maqola o&#8217;qidim. Lekin hammasi chalkash. Hamma har xil fikr aytadi. Design pattern haqidagi kitoblarda ham judayam tushunarli narsa ola olmadim. Lekin qo&#8217;ldan kelgancha bilganimni tushuntirishga harakat qilaman.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Polymorphism so&#8217;zini bo&#8217;laklarga bo&#8217;lsak, poly &#8211; ko&#8217;p, morphism &#8211; forma, shakl degan ma&#8217;nolarni beradi. Ya&#8217;ni ko&#8217;p shakllilik yoki ko&#8217;p formalik.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Polymorphism va Inheritence o&#8217;rtasida bog&#8217;liqlik bor. Bazi tillar &#8220;Abstract class&#8221;larni qo&#8217;llab quvvatlaydi. Bunday class&#8217;lar odatda instance olish uchun emas, balki, aynan boshqa class&#8217;lar undan inherit, meros olishi uchun yasaladi. Ulardan instance olishga ham yo&#8217;l qo&#8217;yilmaydi. Xo&#8217;sh bu o&#8217;zi nega kerak?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Abstract class&#8217;lar boshqa class&#8217;larga bir xil argument va return type&#8217;ga ega behavior&#8217;ni bir necha xil, yoki ko&#8217;plab shakllarda yaratish imkonini beradi.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"853\" height=\"1024\" src=\"https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-13-853x1024.png\" alt=\"\" class=\"wp-image-4147\" srcset=\"https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-13-853x1024.png 853w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-13-250x300.png 250w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-13-768x922.png 768w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-13-1279x1536.png 1279w, https:\/\/texnokun.uz\/wp-content\/uploads\/2022\/12\/image-13-1706x2048.png 1706w\" sizes=\"auto, (max-width: 853px) 100vw, 853px\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">JavaScript abstract class&#8217;larni qo&#8217;llab quvvatlamagani uchun, TypeScriptda bir misol yozdim. Bizda Repository nomli abstract class bor va u loyihadagi har qanday ishlatiladigan ORM uchun bo&#8217;lishi shart bo&#8217;lgan method&#8217;larni, ularni argument va return type&#8217;ini o&#8217;z ichiga olgan. Bu anglatadiki, har xil database&#8217;lar bilan ishlaydigan turli biz yasaydigan ORM&#8217;lar, shu class&#8217;dan inherit qilishga majbur, va super class&#8217;dagi har bir method&#8217;ni o&#8217;z ichida qayta elon qilib, uni implement qilish kerak.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bizda turli database bilan ishlovchi har xil ORM&#8217;lar bo&#8217;lishi mumkin, lekin ular bitta abstract class&#8217;dan inherit qilishga majbur bo&#8217;lgani uchun, ularni hammasini interface&#8217;i bir xil bo&#8217;ladi. Shuning uchun loyihada database almashishi yoki ORM almashish boshqa kodlarni buzib tashlamaydi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Bu misolda e&#8217;tiborga olish kerak bo&#8217;lgan jihat, <strong><em>find <\/em><\/strong>va <strong><em>findMany <\/em><\/strong>method&#8217;larini hamma class database&#8217;dan kelib chiqib, turli implement qiladi. Ular interface nuqtai nazaridan bir xil, lekin turli shaklda implement qilingan. Mana shu Polymorphism&#8217;ga yaqqol misol bo&#8217;ladi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yuqoridagi kod ishlamaydi, katta ehtimol bilan. U shunchaki ideani olvolish uchun misol tariqasida yozildi.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Telegram: <a href=\"https:\/\/t.me\/donishmand23\" target=\"_blank\" rel=\"noreferrer noopener\">https:\/\/t.me\/donishmand23<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Maqolada OOP nima ekanligini yoritib berishga harakat qilamiz.<br \/>\nKod misollari TypeScript&#8217;da ko&#8217;rsatilishiga qaramasdan, u OOP&#8217;ni TypeScript&#8217;da qanday ishlatish haqida emas, umumiy OOP va unga aloqador tushunchalar haqida.<\/p>\n","protected":false},"author":7,"featured_media":4281,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"footnotes":""},"categories":[14],"tags":[110,117],"class_list":["post-4143","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dasturlash","tag-oop","tag-typescript"],"_links":{"self":[{"href":"https:\/\/texnokun.uz\/index.php?rest_route=\/wp\/v2\/posts\/4143","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/texnokun.uz\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/texnokun.uz\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/texnokun.uz\/index.php?rest_route=\/wp\/v2\/users\/7"}],"replies":[{"embeddable":true,"href":"https:\/\/texnokun.uz\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4143"}],"version-history":[{"count":4,"href":"https:\/\/texnokun.uz\/index.php?rest_route=\/wp\/v2\/posts\/4143\/revisions"}],"predecessor-version":[{"id":4506,"href":"https:\/\/texnokun.uz\/index.php?rest_route=\/wp\/v2\/posts\/4143\/revisions\/4506"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/texnokun.uz\/index.php?rest_route=\/wp\/v2\/media\/4281"}],"wp:attachment":[{"href":"https:\/\/texnokun.uz\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4143"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/texnokun.uz\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4143"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/texnokun.uz\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4143"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}