Ruby’de MesajlaÅŸma ve Methodlar

Merhabalar,

Bu yazımı aslında takip ettiÄŸim bir kaç sitede yayınlanan blogları gördükten sonra yazma gereÄŸi duydum. BahsettiÄŸim bloglarda yer alan yazılar aslında basit anlamda Ruby’nin temel özelliklerinden bahsediyorlarda fakat bu yazılara çok farklı tepkiler geldi. Bu tepkiler içerisinde çok ÅŸaşıranlar.. hadi ya ben bunu bilmiyordum diyenler.. yaa demek böyle birÅŸey varmış ama bu kötü vs..vs.. Ben de bu yorumları inceledikten sonra bu yazıyı yazmaya karar verdim.

Aslında konumuz Ruby’de sınıfların yapısı, özellikleri ile Ruby’nin sınıfları, kütüphaneleri ve bizim Component dediÄŸimiz ÅŸeyleri nasıl gördüğüdür.

Öncelikle OO (Object Oriented) tüm dillerde olduÄŸu gibi Ruby’nin sınıf tanımı Java’nın veya C#’ın sınıf tanımı ile aynıdır. Peki o zaman farklılık nerede :) ayrıntılarda.. ÅŸeytanın gizli olduÄŸu yerde :)

public class HelloWorld extends ExampleSupport {

    private String execute() throws Exception {
        setMessage(getText(MESSAGE));
        return SUCCESS;
    }
}

Yukarıda belirtilen örnekte olduÄŸu gibi execute isimli methodumuz private tanımlanmış, yani sadece HelloWorld sınıfı içerisinden kullanılabilir. Neden çünkü private…

peki bir de bunun benzerini Ruby’de gerçekleÅŸtirelim;

class HelloWorld < ActiveSupport
    private
    def execute
        SetMessage(GetText(MESSAGE))
        return SUCCESS;
    end
end

Yukarıdaki iki örnek birbirlerinin aynısı. Ama diyorum ya şeytan bu ayrıntılarda gizli elbetteki.. :) Tahmin ettiğiniz gibi Java dilinde herhangi bir esneklik yok tabiki.. private tanımladın.. private.. yok öyle yanar döner method tanımlama olayları...

Peki ya Ruby'de private olarak tanımlanmış bir methodu public yapabilirmiyiz.. elbette yaparsınız; private yerine public yazarsınız.. taaa taa oldu.. :) Diğer bir yöntem;

Parçalı sınıf (Partial Class) yönetimi ile yapılabilir.

class HelloWorld
    public
    def execute_public
        execute
    end
end

peki başka nasıl olur bu iş.. mesajlaşma ile olur.. şöyleki aslında bir methodu çağırmanın tek yöntemi o methodu direkt olarak çağırmak değildir. Ayrıca Reflection dediğimiz kavram ile de çağrılabilir (Java dünyasında da oldukça kullanılır).

helloWorld = HelloWorld.new
helloWorld.execute # Hata üretir.. execute halen private bir methodtur...
helloWorld.execute_public # Çalışır :)
helloWorld.send("execute") # Çalışır.. problem çıkarmaz.. Sınıfa execute adlı bir method çalıştırmasını söyler.
helloWorld.instance_eval("execute") # Çalışır.. problem çıkarmaz..

Görüldüğü gibi.. yazılımcıdır tüm kodların hakimi.. yoktur programlama dilinin mecburiyetleri.. :P

En son olarak benim tercih ettiğim yöntem; tabii private yerine public yazmak yerine.. :)

class HelloWorld
    public :execute
end

Yukarıda belirtilen bu yordam ile.. execute methodu artık public olmuştur.. hayırlı uğurlu olsun.. :D

Kolay gelsin..!

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir