![]() Önceki |
![]() İçindekiler |
![]() Sonraki |
| Ruby Kullanıcı Kılavuzu | Eriş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.
![]() Önceki |
![]() İçindekiler |
![]() Sonraki |