Yöntemler

Yöntem nedir? Nesneye yönelik yazılım geliştirmede, nesnenin dışından doğrudan veri üzerinde işlem yapmak yerine (eğer nazikçe böyle yapmalarını söylerseniz) nesnelerin kendilerini nasıl çalıştıracakları hakkında bilgiye sahip olması tercih edilir. Nesnelere mesajlar gönderdiğimizi ve bunların genelde bir olay tarafından gerçekleştirildiğini ya da anlamlı bir cevapla karşılandığını söyleyebilirsiniz. Bu muhtemelen bizim özellikle bilmemizi gerektiren ya da nesnenin kendi içinde nasıl çalıştığına dikkat etmemizi gerektirmeyen bir olaydır. Bir nesneye gerçekleştirmesi için (ya da anlayacağı mesajlar göndermemiz için) izinli olduğumuz görevlere, nesnenin yöntemleri denir.

Ruby'de bir nesnenin yöntemini nokta gösterimi ile çağırırız (C++ ya da Java'da olduğu gibi).

ruby>   "abcdef".length
   6

Muhtemelen bu dizgenin uzunluğunun ne kadar olduğu soruluyor.

Teknik olarak,"abcdef" nesnesi için length yöntemini çağırıyoruz.

Diğer nesnelerin length yöntemi için biraz farklılıkları olabilir, ya da hiç olmayabilir de. Mesajlara nasıl cevap verileceği kararı yazılımın çalıştırılması sırasında verilir ve hangi nesneye başvurduğuna bağlı olarak olay değişebilir.

ruby>   foo = "abc"
   "abc"
ruby>   foo.length
   3
ruby>   foo = ["abcde", "fghij"]
   ["abcde", "fghij"]
ruby>   foo.length
   2

length yönteminin, nesneye göre değişebilmesiyle neyi kastediyoruz? Yukarıdaki örnekte ilk önce foo'nun uzunluğunu soruyoruz, basit bir dizgeye başvuruyor ve sadece tek bir mantıklı cevabı olabilir. İkinci sefer foo bir diziye başvuruyor ve uzunluğunun 2, 5 ya da 10 olduğunu düşünebilirsiniz ama genelde en kabul edilebilir cevap tabii ki 2 olacaktır.

ruby>   foo[0].length
   5
ruby>   foo[0].length + foo[1].length
   10

Burada dikkat edilmesi gereken nokta bir dizinin, dizi olmanın ne demek olduğunu bilmesidir. Ruby'de veri parçaları beraberlerinde bilgi taşıdıkları için talepler otomatik olarak algılanabilir ve bir çok yolla gerçekleştirilebilir.

Bu yazılımcıyı spesifik işlev adlarını hatırlamaktan kurtarır, değişik veri türlerine uygulanabilir ve sonuç istediğimiz gibi olur. Nesneye yönelik yazılım geliştirmenin bu özelliği polimorfizm olarak adlandırılır.

Bir nesne anlamadığı bir mesaj aldığında bir hata uyanır:

ruby>   foo = 5
   5
ruby>   foo.length
ERR: (eval):1: undefined method `length' for 5(Fixnum)

Sonuçta bir nesne için hangi yöntemlerın kabul edilebilir olduğunu bilmemiz geretiği halde, yöntemlerin nasıl işlendiğini bilmek zorunda değiliz.

Eğer argümanlar bir yönteme verilecekse genelde parantez içine alınırlar.

object.method(arg1, arg2)  

Ancak belirsizlik ihtiva etmedikleri sürece kullanılmayabilirler de.

object.method arg1, arg2  

Ruby, self adında bir nesnenin bir yöntemini çağırdığı zaman başvurulan özel bir değişkene sahiptir. Rahatlık için "self." genelde yöntem çağrılırken kullanılmayabilir:

self.method_name(args...)  

yukarıdaki ifadeyle aşağıdaki aynıdır:

method_name(args...)  

Bir işlev çağrısı sadece self'le yöntem çağrımının kısaltılmış şeklidir. Bu da Ruby'yi saf bir nesneye yönelik yazılım geliştirme dili yapan şeydir. Hala işlevsel yöntemler diğer dillerdeki işlevlere çok benzese de aslında işlev çağrılarının Ruby'de gerçek nesne yöntemlerinden başka birşey olmadığını görmeniz gerekir. İstersek hala gerçek nesne yöntemleri değilmiş gibi kabul ederek işlevlerden bahsedebiliriz.