26. Erişim Yöntemleri

Geçtiğimiz bölümlerde örnek değişkenlerden kısaca bahsettik ancak henüz işimiz bitmedi. Bir nesnenin örnek değişkenleri onun kendisine ait olan ve aynı sınıfa ait diğer nesnelerden ayıran öznitelikleridir.

Bu öznitelikleri okuyabilmek ve yazabilmek önemlidir; bu yüzden özniteliğe erişim yöntemlerini kullanırız. Bir kaç dakika sonra erişim yöntemlerini her zaman açıkça yazmak zorunda olmadığımızı göreceksiniz ancak şimdilik tüm hareketlere bakalım. Erişim yöntemleri iki çeşittir: yazıcılar ve okuyucular.

ruby>class Meyve
    |    def çesit_ata(k)  # bir yazıcı
    |       @çeşidi = k
    |    end
    |    def ne_çesit     # bir okuyucu
    |       @çeşidi
    |    end
    | end
   :ne_çesit
ruby> f1 = Meyve.new
   #<Meyve:0x000055f8e47a11c8>
ruby> f1.çesit_ata("şeftali")  # yazıcıyı kullan
   "şeftali"
ruby> f1.ne_çesit           # okuyucuyu kullan
   "seftali"
ruby> f1                    # nesneyi yokla
   #<Meyve:0x000055f8e47a11c8 @çeşit="şeftali">

Yeterince basit; baktığımız meyve hakkında istediğimiz bilgiyi yerleştirebilir ya da erişebiliriz. Ama yöntem isimlerimiz biraz uzun. Aşağıdaki daha kısa ve daha bilindik:

ruby>class Meyve
    |    def çeşidi=(k)
    |       @çeşidi = k
    |    end
    |    def çeşidi
    |       @çeşidi
    |    end
    | end
   :çeşidi
ruby> f2 = Meyve.new
   #<Meyve:0x000055f8e44c28a8>
ruby> f2.çeşidi = "üzüm"
   "üzüm"
ruby> f2.çeşidi
   "üzüm"

26.1. inspect yöntemi

Küçük bir uzlaşma sağlanmıştır. Bir nesneye doğrudan ulaşmak istediğimizde #<birNesne:0x83678> gibi şifreye benzer birşeyle karşılaştığımıza dikkat edin. Bu öntanımlı bir davranıştır ve istediğiniz gibi değiştirebilirsiniz. Yapmanız gerek tek şey inspect yöntemini eklemektir. inspect yöntemi, nesneyi birkaç ya da bütün örnek değişkenleri de içeren ve mantıklı bir şekilde tanıtan bir yöntemdir.

ruby>class Meyve
    |    def inspect
    |       @çeşidi + " bir meyve çeşididir"
    |    end
    | end
   :inspect
ruby> f2
   üzüm bir meyve çeşididir

Benzer bir yöntem de ekrana bir nesne yazdıracağımız zaman kullandığımız to_s (dizgeye dönüştürür) yöntemidir. Genel olarak inspect yöntemini yazılım geliştirirken ve hata ayıklarken kullandığınız bir araç olarak, to_s'yi de yazılımın çıktısını düzeltmek için kullandığımız bir yol düşünebilirsiniz.

eval.rb sonuçları görüntülemek için her zaman inspect yöntemini kullanır.

p yöntemini, yazılımlarınızdan hata ayıklama çıktısı almak için kullanabilirsiniz.

# Bu iki satır eşdeğerdir:
p birNesne
print birNesne.inspect, "\n"

26.2. Erişim yöntemlerini kolay hale getirmek

Her örneğin bir erişim yöntemine ihtiyacı olmasına rağmen, Ruby standart tarzlar için daha elverişli bir yol sunar.

Kısayol Etkisi
attr_reader :v def v; @v; end
attr_writer :v def v=(value); @v=value; end
attr_accessor :v attr_reader :v; attr_writer :v
attr_accessor :v, :w attr_accessor :v; attr_accessor :w

Şimdi bunun getirilerinden faydalanalım ve bilgimizi tazeleyelim. Öncelikle otomatik olarak oluşturulmuş bir okuyucu ve yazıcı olup olmadığına bakarız ve yeni bilgiyi inspect'in içine dahil ederiz:

ruby> class Meyve
    |    attr_accessor :nitelik
    |    def inspect
    |       "#{@nitelik} #{@çeşidi}"
    |    end
    | end
   :inspect
ruby> f2.nitelik = "olgun"
   "olgun"
ruby> f2
   olgun üzüm

26.3. Meyveyle biraz daha eğlence

Eğer kimse olgunlaşmamış meyvemizi yemezse, parasını almak için beklemeliyiz.

ruby>class Meyve
    |    def durumu
    |       @nitelik = "koruk"
    |    end
    | end
   :durumu
ruby> f2.durumu
   "koruk"
ruby> f2
   "koruk üzüm"

Ancak buralarda oynarken, küçük bir sorunla karşılaştık. Üçüncü bir meyve yaratmaya çalıştığımızda ne olur? Örnek değişkenlerin onlara değer atanmadan var olmadıklarını hatırlayın.

ruby> f3 = Meyve.new

ruby>

Burada yakınılan inspect yöntemidir ve geçerli bir sebebimiz var. f3'e özellik atamadan bir meyvenin çeşidi ve niteliği hakkında bir rapor istedik. Eğer istersek, inspect yönteminin defined? yöntemini de kullanarak sadece tanımlanmış meyveleri rapor etmesini sağlayabiliriz ancak bu iş hala kullanışsız olur, çünkü her meyvenin bir çeşidi ve niteliği olduğuna göre bu ikisinin her zaman tanımlı olduğundan emin olmamız gerekir. Bu ileriki bölümün konusudur.