Darsliklar Ruby Kirish ma'lumoti (Encapsulation)

Ruby Ruby Kirish ma'lumoti (Encapsulation)

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