Metotları Yeniden Tanımlama
Önceki
İçindekiler
İçindekiler
Tekil Metotlar
Sonraki

 Ruby Kullanıcı KılavuzuErişim Kontrolü 

Daha önce Ruby'nin fonksiyonla değil sadece metotlara sahip olduğunu söylemiştik. Ancak sadece tek bir tür metot yoktur. Bu bölümde erişim yöntemleri'nden (Erişim Kontrolü) bahsedeceğiz.

Bir metodu, bir sınıf tanımlamasının içinde değil de, en üstte tanımladığımızı farz edelim. Bunun C gibi daha geleneksel bir dildeki fonksiyonlarla aynı işi yapan bir metot olduğunu düşünürüz.

ruby> def kare(n)
    |   n * n
    | end
   nil
ruby> kare(5)
   25

Yeni motodumuz hiç bir sınıfa bağlı değil gibi gözüküyor, ama aslında Ruby bu metodu tüm sınıfların süper sınıfı olan Object sınıfına verir. Sonuç olarak her nesne bu metodu nasıl kullanacağını bilir. Bu durum doğru gibi gözükebilir ama burada küçük bir nokta vardır: bu metot her sınıfın private metodudur. Bunun ne anlama geldiğininden bahsedeceğiz fakat bu durumun sounçlarından bir tanesi de aşağıdaki gibi sadece fonksiyon stiliyle çağırabilmemizdir:

ruby> class Foo
    |   def dorduncu_kuvveti(x)
    |     kare(x) * kare(x)
    |   end
    | end
  nil
ruby> Foo.new.dorduncu_kuvveti 10
  10000

Bir nesnenin, metodu açıkça çağırmasına izin verilmez:

ruby> "balik".kare(5)
ERR: (eval):1: private method `kare' called for "balik":String

Bu durum daha geleneksel bir dildeki gibi fonksiyon yazmamızı sağlarken, Ruby'nin saf 'nesneye yönelik' yapısını korumasına yardımcı olur (fonksiyonlar halen nesnelerin metotlarıdır, sadece alıcı üstü kapalı olarak self'tir.)

Önceki bölümlerde de vurguladığımız gibi nesneye yönelik programlamanın genel mantığı, belirtim (specification) ile gerçekleştirimi (implementation) birbirinden ayırmak, ya da bir nesnenin hangi görevleri yapmak istediği ve bunu nasıl yapabileceğiyle ilgilenmektir. Bir nesnenin dahili işleri genelde kullanıcıdan saklanmalı, kullanıcı yalnızca neyin gidip geldiğiyle ilgilenmeli ve nesnenin kendi içinde neyi nasıl yaptığını bildiğine dair güvenmelidir. Genelde nesnenin dış dünya tarafından görülmeyen ancak dahili olarak kullandığı metotlara sahip olması yararlı bir şeydir (ve bu durum kullacının nesneleri görme biçimi değiştirilmeksızın programcının isteğine göre değiştirebilir). Aşağıdaki basit örnekte motor'in sınıfın görülmediğini ama dahili olarak çalıştığını varsayalım.

ruby> class Test
    |   def kere_iki(a)
    |     print a," kere iki ",motor(a),"\n"
    |   end
    |   def motor(b)
    |     b*2
    |   end
    |   private:motor  #motor'u kullanicilardan saklar 
    | end
   Test
ruby> test = Test.new
   #<Test:0x4017181c>
ruby> test.motor(6)
ERR: (eval):1: private method `motor' called for #<Test:0x4017181c>
ruby> test.kere_iki(6)
6 kere iki 12.
   nil

test.motor(6)'nın 12 değerini döndürmesini umuyorduk ancak bir Test nesnesi gibi davrandığımızda motor'un erişilemez olduğunu gördük. Yalnızca kere_iki gibi diğer Test metotları motor'a ulaşma hakkına sahiptir. Böylece öncelikle kere_iki metodunu içeren genel arayüze gitmek zorunda bırakıldık. Programcı, kullancının Test nesnelerinin birbirini nasıl etkilediğine bakmaksızın motor metodunu (bu örnekte muhtemelen performans açısından b*2'yi b+b ile) değiştirebilir. Bu örnek erişim kontrollerini anlatmak için tabii ki çok basit bir örnektir ancak daha karmaşık ve ilginç sınıflar üretmeye başlayınca erişim kontrolünün ne kadar yararlı bir kavram olduğunu anlayacaksınız.


Metotları Yeniden Tanımlama
Önceki
İçindekiler
İçindekiler
Tekil Metotlar
Sonraki