Obyektga yo’naltirilgan dasturlash (OOP) — Ruby’ning butun tabiatini belgilaydigan paradigma. Kirish darsida aytilganidek, Ruby’da hamma narsa obyekt — bu shunchaki shior emas, til dizaynining o’zagi. Endi shu obyektlarni o’zimiz qanday yaratishni o’rganamiz.
OOP — dasturni ma’lumot (holat) va shu ma’lumot ustidagi amallarni (xatti-harakat) bitta yaxlit birlik — obyektga jamlagan holda modellashtiradigan yondashuv. Uning to’rt ustuni bor: enkapsulatsiya, meros, polimorfizm va abstraksiya.
To’rt ustun
OOP’ni ushlab turadigan to’rt tamoyilni jadvalda ko’ramiz — ularning har birini keyingi darslarda alohida ko’rib chiqamiz:
| Ustun | Ma’nosi |
|---|---|
| Enkapsulatsiya | ma’lumotni metod bilan birga jamlab, ichkisini yashirish |
| Meros | bir sinf boshqasidan xususiyat oladi |
| Polimorfizm | bir xil chaqiruv turli obyektda turlicha ishlaydi |
| Abstraksiya | murakkablikni yashirib, faqat kerakli interfeysni ko’rsatish |
Sinf — obyektning andozasi
Sinf (class) — obyekt qanday bo’lishi kerakligini belgilaydigan andoza. Obyekt esa shu andoza asosida yaratilgan aniq nusxa:
class Foydalanuvchi
def salomlash
puts "Salom, men foydalanuvchiman!"
end
end
u = Foydalanuvchi.new
u.salomlash
Salom, men foydalanuvchiman!
class Foydalanuvchi ... end — andozani belgiladi. Foydalanuvchi.new — shu andozadan aniq bir obyekt yaratdi. new — Ruby’ning barcha klasslarida mavjud, yangi nusxa yaratuvchi standart metod.
Instans o’zgaruvchisi — obyektning o’z holati
Har bir obyekt o’zining mustaqil ma’lumotini @ bilan boshlangan instans o’zgaruvchisida saqlaydi:
class Hisoblagich
def oshir
@qiymat ||= 0
@qiymat += 1
puts @qiymat
end
end
birinchi = Hisoblagich.new
birinchi.oshir
birinchi.oshir
birinchi.oshir
1
2
3
@qiymat — aynan shu birinchi obyektiga tegishli xotira. ||= 0 — o’zgaruvchi hali nil bo’lsa, 0dan boshlaydi (bu naqshni operatorlar darsida ko’rgan edik).
Har bir obyekt — mustaqil
OOP’ning asosiy kuchi shunda: bir sinfdan yaratilgan obyektlar bir-biridan butunlay mustaqil holatga ega:
a = Hisoblagich.new
b = Hisoblagich.new
a.oshir
a.oshir
b.oshir
puts "a: #{a.instance_variable_get(:@qiymat)}"
puts "b: #{b.instance_variable_get(:@qiymat)}"
1
2
1
a: 2
b: 1
a va b — bir xil Hisoblagich sinfidan, ammo ularning @qiymati mustaqil ravishda o’zgardi. instance_variable_get — instans o’zgaruvchisini tashqaridan (odatda faqat debug maqsadida) o’qish uchun ishlatiladi; oddiy holatda buning uchun maxsus metod yoziladi — buni keyingi darslarda ko’ramiz.