Duck Typing

6 Aralık
2008

Uzunca bir zaman VB ile haşır neşir olurken .net nedir bilmediğimiz bu dönemde hayat bizim için oldukça basitti. Bir kere obje yönelimli bir kodlama bilmezdik, Event-Driven bir yapıdaydık, class mış, interface miş bize yabancı kelimelerdi. Sonra VB, VB.net olduktan sonra gördük aslında programlama ne kadar güzel bir uğraşmış. Mesela interface’ler; bizi implentasyon terimi ile tanıştıran naçizane varlıklardı. Önce bir interface tanımlıyorduk sonra bu interface’i implent eden farklı farklı görevlere ve kodlara sahip classcıklar yazıyorduk. Sonra tüm bu alakasız class’ları aynı tür gibi kullanabiliyorduk.

Geçmiş zaman kullanmaya devam ettim çünkü alakasız bir konu ile ilgilenirken farkettim ki yakın bir zaman sonra interface mantığı değişik bir yaklaşımla değiştirilecek gibi. Aslına bakarsanız tam olarak bir değiştirilme denemez daha çok interface’in bir kardeşi olacak demek daha doğru.

Şimdi anlattım zaten interface ne işe yarıyor diye basitçe, temelde benzer bazı noktaları olan alakasız classları bir arada kullanabilmemizin yegane gereği olarak kullanıyorduk. Mesela IDisposable interface’i, bir sürü birbirinden alakasız class’ın ortak noktasıdır. Yokedilebilme anlamında ortak olan bu classlar bu interface’i implent ederler ve ortak olarak bir class’ın inherit’i gibi çağırılabilirler. Bu temel interface dersinden sonra yeni olayın ne olduğuna getirelim sözü: “Duck Typing” aslında bir yapıdan çok bir yeni trendin adı gibi. Biraz farklı bir tipini şu anda LinQ içerisinden kullanıyoruz aslında ama framework 4 ile birlikte tam olarak destekleneceği söylenmiş.

Temel mantığı 2000 yılında Alex Martelli isimli 1955 doğumlu Pyton dilinin ağ babalarından olan programcı abimiz tarafından yazılmış şu mesajla şekillenmiş bir yaklaşım. Martelli demiş ki, “bir canlı ördek gibi yürür, ördek gibi vak’larsa, biz onu ördek olarak düşünebiliriz”. İsmindeki “duck” da bu ördekten geliyor anlayabileceğiniz üzere. Biraz açalım konuyu; bir objeniz var, metodları özellikleri var, alakasız bir obje de de bu özellikler ve metodlar varsa siz bu obje yi sanki diğer obje ile ortak bir interface den implent edilmiş gibi kullanabilmelisiniz. Bir nevi kalıtım olmadan çok yüzlü nesneler yaratmak denebilir. Böyle olunca ne olacak aynı yapıdaki classları bir kere daha implentasyonla uğraşmadan beraber kullanabileceğiz.

LinQ de farklı bir tipini kullanıyoruz dedim, nasıl derseniz, “Dim a = From kisi in kisiler Select kisi.ad” gibi kısacık bir LinQ sorgusu yazdık diyelim, buradaki a nesnesi otomatik olarak IEnumerable(Of String) olmuyormu. Mantık neydi ördek gibi davranan objeye ördek diyebiliriz. Burada da bir string dizisi çıkaracağı belli olan objeye string dizisi gibi davranıyoruz işte. Şu anda dilde mevcut değil tam olarak ama olacağı durumda nasıl bir durum ortaya çıkacak onun için bir örnek yazmaya çalışayım;

Class Ördek
    Function SesÇıkar() As String
        Return "Vrak"
    End Function
End Class

Class İnsan
    Function SesÇıkar() As String
        Return "Ses deneme bir iki"
    End Function
End Class

Class Canlı
    Dim _baz
    Sub New(ByVal Baz)
        _baz = Baz
    End Sub

    Sub Konus()
        Console.WriteLine(_baz.SesÇıkar)
    End Sub
End Class

Sonra şöyle bir çağırım yapar isek;

        Dim Donald As New Canlı(New Ördek)
        Dim Ahmet As New Canlı(New İnsan)
        Donald.Konus()
        Ahmet.Konus()

Sonuç

        Vrak
        Ses deneme bir iki

şeklinde olur. Burada anlatmak istediğim, Canlı class’ındaki _baz değişkenine bir tür tanımlamadığımdan standart olarak Object olmak gösterilmek yerine durumun farkına varıp iki class da da tanımlı olan SesÇıkar fonksiyonunu kabul etmesidir. Şu anda otomatik olarak yaratılan AnonymousType’ların bir değişik biçimi gibi düşünebiliriz durumu belki. Mevcut teknikte içinde bir tane SesÇıkar fonksiyonu tanımlı interface yazıp iki class’a birden implent edecek, sonra da _baz değişken tipini bu interface türünden verecektik. Burada da olduğu gibi bu yeni trend bizi bayaa bir koddan kurtardığı gibi tamamen esnek bir yapıya kavuşturdu. Çünkü mesela buradaki örnekte ördek ile aynı olupta insanda tanımlanmamış bir metoda sahip başka bir class oluşturduğumuzda bu sefer bir başka interface daha hazırlayıp, hem ördek hemde bu yeni class’a implent etmek yerine direkt sanki öyle olmuş gibi kullanabileceğiz. Alakalı her yeni bir cümle yazdığımda yapı daha da havalı bir şey gibi geliyor, en iyisi burada bitirmek, kaç yıllık dostumuz interface lerin papucunu dama atmalayım hemen…

Yorumlar kapalı.

başa dön