Darsliklar Ruby OOP

Ruby Ruby OOP

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.

OOPdasturni 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.