Enkapsulatsiya — OOP ning birinchi ustuni. Oldingi darslarda getter va setter metodlarini qo’lda yozdik — bu naqsh shu qadar tez-tez takrorlanadiki, Ruby uni bitta qatorga tushiradigan maxsus vosita taqdim etadi: attr_accessor.
attr_accessor / attr_reader / attr_writer — instans o’zgaruvchisi uchun getter va setter metodlarini avtomatik yaratib beruvchi klass metodlari.
attr_reader— faqat o’qish,attr_writer— faqat yozish,attr_accessor— ikkalasini birga yaratadi.
attr_accessor — qo’lda yozishning qisqartmasi
Sinflar darsida qo’lda yozgan ism/ism= juftligini bitta qatorga tushiramiz:
class Foydalanuvchi
attr_accessor :ism, :yosh
def initialize(ism, yosh)
@ism = ism
@yosh = yosh
end
end
u = Foydalanuvchi.new("Farrux", 26)
puts u.ism
u.yosh = 27
puts u.yosh
Farrux
27
attr_accessor :ism, :yosh bitta qatorda to’rtta metodni — ism, ism=, yosh, yosh= — avtomatik yaratdi. Bu, oldingi darsda ko’rgan qo’lda yozilgan variant bilan funksional jihatdan aynan bir xil, faqat ancha ixcham.
attr_reader va attr_writer — bir tomonlama kirish
Ba’zi ma’lumotni faqat o’qish, o’zgartirishga esa ruxsat bermaslik kerak bo’ladi — bunda attr_reader ishlatiladi:
class Talaba
attr_reader :ism
attr_writer :parol
def initialize(ism, parol)
@ism = ism
@parol = parol
end
def parol_togrimi?(kiritilgan)
kiritilgan == @parol
end
end
t = Talaba.new("Aziz", "maxfiy123")
puts t.ism
puts t.parol_togrimi?("maxfiy123")
Aziz
true
attr_reader :ism — faqat t.ism (o’qish) metodini yaratadi, t.ism = "..." esa mavjud emas — ism tashqaridan o’zgartirilmaydi. attr_writer :parol esa aksincha — faqat yozish metodini beradi, t.parol chaqiruvi mavjud emas, parolni tashqaridan o’qib bo’lmaydi.
Tekshiruvli setter — attr_accessor yetarli bo’lmaganda
attr_accessor hech qanday tekshiruv qilmaydi — istalgan qiymatni qabul qiladi. Tekshiruv kerak bo’lganda, setter hamon qo’lda yoziladi:
class Hisob
attr_reader :balans
def balans=(qiymat)
if qiymat >= 0
@balans = qiymat
else
puts "Xato: balans manfiy bo'lishi mumkin emas"
end
end
def initialize
@balans = 0
end
end
h = Hisob.new
h.balans = 1000
h.balans = -500
puts h.balans
Xato: balans manfiy bo'lishi mumkin emas
1000
Bu yerda balans uchun attr_reader (o’qish avtomatik) va qo’lda yozilgan balans= (yozish tekshiruv bilan) birgalikda ishlatildi — ikkalasini aralashtirish odatiy amaliyot.
private — metodni butunlay yashirish
Instans o’zgaruvchisidan tashqari, metodning o’zini ham tashqi dunyodan butunlay yashirish mumkin — private kalit so’zi bilan:
class Hisob
def initialize(balans)
@balans = balans
end
def hisobot
"Balans: #{formatlash(@balans)}"
end
private
def formatlash(son)
"#{son} so'm"
end
end
h = Hisob.new(50000)
puts h.hisobot
Balans: 50000 so'm
private kalit so’zidan keyin yozilgan metodlar (formatlash) faqat sinf ichidan chaqirilishi mumkin — h.formatlash(50000) deb tashqaridan chaqirishga urinish xato beradi. Bu ichki, yordamchi mantiqni tashqi interfeysdan butunlay ajratadi.