11. 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 iletiler 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ğı iletiler göndermemiz için) vereceğimiz 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. İletilere nasıl yanıt 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ı yanıt 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 yanıt 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ı belli 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 çok biçimlilik olarak adlandırılır.

Bir nesne anlamadığı bir ileti aldığında bir hata ortaya çıkar:

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 gerektiği halde, yöntemlerin nasıl işlediğini bilmek zorunda değiliz.

Eğer bağımsız değişkenler bir yönteme verilecekse genelde yaylı ayraçlar arasına alınır.

nesne.yöntem(dğş1, dğş2)

Ancak belirsizliğe yol açmadıkları sürece kullanılmayabilirler de.

nesne.yöntem dğş1, dğş2

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

self.yöntem_adı(dğş...)

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

yöntem_adı(dğş...)

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.