OOP — asosiy 4 ta tamoyil
Encapsulation, Inheritance, Polymorphism, Abstraction — dasturlashning asosiy tamoyillari.
OOP 4 tamoyili
Katta loyihalarni puxta qurish uchun kerak bo'lgan to'rt ustun. Bugun real misollar bilan.
4 ta tamoyil
5 ta mavzu1. Encapsulation — inkapsulyatsiya
Ma'lumot va uni boshqaradigan metodlarni bitta obyekt ichida saqlash. Ichki ma'lumotni tashqaridan yashirish — faqat ruxsat berilgan metodlar orqali o'zgartirish.
1class BankHisobi {2 #balans = 0; // # — maxfiy maydon (private)3
4 kirim(summa) {5 if (summa <= 0) throw new Error("Summa musbat bo'lishi kerak");6 this.#balans += summa;7 }8
9 chiqim(summa) {10 if (summa > this.#balans) throw new Error("Yetarli mablag' yo'q");11 this.#balans -= summa;12 }13
14 get balans() {15 return this.#balans;16 }17}18
19const h = new BankHisobi();20h.kirim(100000);21console.log(h.balans); // 10000022
23// h.#balans = 999999; // XATO — tashqaridan ochib bo'lmaydi24// h.balans = 999999; // XATO — setter yo'q2. Inheritance — meros olish
Umumiy funksionallikni ota sinfga chiqarib, bola sinflar uni qayta yozmaslik. Kod takrorlanishini kamaytiradi.
1class Transport {2 constructor(nom, tezlik) {3 this.nom = nom;4 this.tezlik = tezlik;5 }6
7 yur() {8 return `${this.nom} ${this.tezlik} km/s tezlikda harakatda`;9 }10}11
12class Mashina extends Transport {13 constructor(nom, tezlik, yoqilgi) {14 super(nom, tezlik);15 this.yoqilgi = yoqilgi;16 }17
18 tozala() {19 return this.nom + " yuvildi";20 }21}22
23class Velosiped extends Transport {24 // constructor kerak emas — ota'niki ishlatiladi25 tepki() {26 return this.nom + "ning tepkisi aylanmoqda";27 }28}29
30const m = new Mashina("Cobalt", 120, "benzin");31const v = new Velosiped("Giant", 25);32
33console.log(m.yur()); // meros olingan34console.log(v.yur()); // meros olingan3. Polymorphism — ko'p shakllilik
Bir nomli metod — har xil sinflarda o'zicha ishlaydi. Chaqiruvchi tafsilotni bilmasligi mumkin.
1class Hayvon {2 ovoz() {3 return "Ba'zi ovoz";4 }5}6
7class It extends Hayvon {8 ovoz() { // bir xil nomli metod9 return "Vov-vov!";10 }11}12
13class Mushuk extends Hayvon {14 ovoz() { // yana qayta yozilgan15 return "Miyov!";16 }17}18
19class Sigir extends Hayvon {20 ovoz() {21 return "Muu!";22 }23}24
25// Hammasini bir xil interfeys bilan ishlatamiz26const hayvonlar = [new It(), new Mushuk(), new Sigir()];27
28hayvonlar.forEach(h => console.log(h.ovoz()));29// Vov-vov!30// Miyov!31// Muu!4. Abstraction — mavhumlashtirish
Foydalanuvchiga faqat kerakli narsalarni ko'rsatib, ichki murakkablikni yashirish. Mashina haydovchisi dvigatel ichini bilishi shart emas.
1class Kofemashina {2 // Ichki murakkablik — maxfiy3 #suvQizdir() {4 console.log("[ichki] Suv 95°C ga qizidi");5 }6
7 #qahvaTortir() {8 console.log("[ichki] Qahva donalari maydalandi");9 }10
11 #filtrdanOtkaz() {12 console.log("[ichki] Suyuqlik filtrdan o'tdi");13 }14
15 // Tashqi — oddiy interfeys16 kofeTayyorla() {17 this.#suvQizdir();18 this.#qahvaTortir();19 this.#filtrdanOtkaz();20 return "Bir chashka kofe tayyor!";21 }22}23
24const k = new Kofemashina();25console.log(k.kofeTayyorla());26
27// Foydalanuvchi faqat bitta tugmani bilsa yetarli28// Ichkarida 10 ta ish bajarilishi mumkin5. Hammasi birga — amaliy misol
1// 4 ta tamoyil bir loyihada2
3// ABSTRACTION — umumiy «shakl»4class Shakl {5 constructor(nom) {6 this.nom = nom;7 }8
9 yuzi() {10 throw new Error("Bola sinf yuzi() metodini yozishi shart");11 }12
13 // POLYMORPHISM ga asos — bola sinflar qayta yozadi14 tavsif() {15 return `${this.nom} yuzi: ${this.yuzi().toFixed(2)}`;16 }17}18
19// INHERITANCE + POLYMORPHISM20class Doira extends Shakl {21 #r; // ENCAPSULATION — maxfiy radius22
23 constructor(r) {24 super("Doira");25 this.#r = r;26 }27
28 yuzi() { // Polimorfik qayta yozish29 return Math.PI * this.#r ** 2;30 }31}32
33class Kvadrat extends Shakl {34 #tomon;35
36 constructor(t) {37 super("Kvadrat");38 this.#tomon = t;39 }40
41 yuzi() {42 return this.#tomon ** 2;43 }44}45
46const shakllar = [new Doira(5), new Kvadrat(4)];47shakllar.forEach(s => console.log(s.tavsif()));48// "Doira yuzi: 78.54"49// "Kvadrat yuzi: 16.00"Yakuniy test
0 / 51.Ma'lumotni obyekt ichida yashirish — qaysi tamoyil?
2.extends kalit so'zi qaysi tamoyilga tegishli?
3.Bitta metod nomi, turli sinflarda har xil ishlaydi — bu?
4.Class ichida #balans qanday maydon?
5.Murakkab ichki ishni yashirib, oddiy interfeys berish?