22 Kasım 2008 Cumartesi

Object Oriented'a Farklı Bir Bakış

Merhaba herkese. Yazılım Günlüğünde paylaştığım makaleleri, resimlerinden ötürü buraya koymuyorum ama resimsiz bir makale yazdım az önce ilk defa. :) Onu burada da paylaşmak istedim. Umarım beğenirsiniz.

Merhaba arkadaşlar. Yine bir makalemizle daha birlikteyiz. Bu makalemizde nesne yönelimliliğin temel kavramlarına sıra dışı bir bakış atacağız.
"Nesne Yönelimli" dedik. O zaman ilk olarak nesne nedir onu inceleyelim. Nesne dediğimiz şey gerçek hayattaki gibi varlıklardır aslında. Hepsinin bir özelliği ve işlevi olabilmektedir. Örneğin ben bir nesneyim. Benim özelliklerim: çok konuşmam, Beşiktaş'lı olmam, uyumaktan hoşlanmam :) Uyurum, gezerim, çalışırım, bunlar da benim işlevlerim, yani metotlarım. Bunu her şey için düşünebilirsiniz. Şunu unutmayın bu kainatta her şey çok iyi düzenlenmiş ve bu mantık(OO) bizzat hayatın kendisinden türemiştir.(Bunu ben demiyorum Heljsberg'in kendisi söylüyor.)

Şimdi nesne kavramını daha da iyi oturtmak için sınıftan bahsedeyim. Sınıf dediğimiz şey, benzer özellikleri ve işlevleri olan nesnelerin bir araya getirlmesinden oluşan yapıdır. Hepimiz insanız. Dolayısıyla İnsan bir sınıftır. Ancak ben bu sınıfın bir nesnesiyim. Takım dediğiniz şey bir sınıf olursa şayet, Beşiktaşımız da bu sınıfın bir örneği, yani nesnesi olur. Demek ki nesne, bir sınıfın örneği imiş. Bununla ilgili milyonlarca örnek verebilirsiniz.

Gelelim object oriented ile ilgili diğer bir kavrama: inheritance. Kelime anlamı olarak "kalıtım, miras" demek. Var olan bir şeyin özelliklerini alıyoruz. Bunu aynen de kullanabiliriz, üzerine de koyabiliriz ki genelde üzerine koyarız. Örneğin, siz bir programlama dili ile yazarken programlama dili geliştirmiyorsunuz. Var olan şeyleri kullanıyorsunuz. Inheritance olmasaydı her kod yazma teşebbüsünüzden önce, o kod için bir dil geliştirmeniz gerekebilirdi. :)

Bir başkası: reusability. Yaptığın bir şeyi başka bir zamanda ve yerde kullanabilirsin. Örneğin bir mimar proje çizer. Ona uygun olarak aynı yapıyı gelir Taksim'in göbeğine de yapar, Roma'ya da yapar ya da gider Dubai'de yapar. Önemli olan yapıyı doğru ve esnek bir biçimde oluşturmaktır. Güzel bir örnek vereyim, bu sefer yazılmdan olsun. Component sınıfı, Object'ten türer. Yani Object'in özelliklerini miras alır. Inheritance var burada diyorsunuzdur. Evet inheritance var ama burada reusability de var. Miras alınan özellikler tekrar kullanılıyordur da aynı zamanda. Yani inheritance, reusability'i de sağlıyor.

Sıra geldi encapsulation kavramına. Yani "sarmalamak". Şöyle bir örnek vereyim: Siz bir kola makinasna parayı atarsınız ve kolayı alırsınız. Makine içi encapsule edilmiş, içeride ne oluyor bilmezsiniz(bilmenize de gerek yok). Mesela araba sürerken vites atarız. Vites kutusu da encapsule edilmiştir. İç yapısını çoğumuz bilmeyiz. Eğer encapsule edilmemiş olsaydı, her vites değişikliğinde elle çarkları açıp oraya ittirmek gerekirdi ki ya yanlış atardık ya da elimizi kaptırırdık. Yani bu kavramla biz işi doğru yapıyoruz ve bu iş gizli bir şekilde arka planda oluyor.

Field - Property ikilisinden de kısaca bir bahsedelim. Field dediğimiz şey tek başına anlamsızdır. Örneğin public string Adi; diyoruz. Eee? Bu şekilde hiç bir anlamı yok. Bu yüzden property gerekmekte. Property'leri gümrük kapılarına benzetebiliriz. Değer alır ya da verir. Field üzerinde işlem yapar yani. Field olmadan sadece property kullanabiliriz ama. Hatta bir not, property içinde if kontrolleri falan yazarsanız bu "aspect oriented"a kaydığınız anlamına gelir. :)

Kritik bir başlıkta sıra: Delegate. Delegeler, bir olaya vereceğiniz tepkileri işaret eder. Örneğin gece fabrikada yangın çıktı diyelim. Bu bir eventtir. Bekçi yangını gördü diyelim. Burada bekçi olayı handle eder.(EventHandler) Bekçimiz delege oluyor. Bekçi hemen itfaiyeyi arıyor. İtfaiyeyi araması bir metottur. Gördüğünüz gibi bekçi nasıl davranılacağına karar vermiş oldu. EventHandler olursa bekçi her şeye tepki verebilen bir delege olur. Ama diyelim ki bekçi sadece yangın olayına tepki verebilecek bir delege ise, hırsız fabrikayı soysa bekçi karışmaz, çünkü onun görevi yangına tepki vermektir.
NOT: Object Oriented'ın fonksiyonel programlamaya göre performasn düşüklüğünün sebebi de bu bahsettiğim delegelerdir. Sürekli tetiklemeler var çünkü.

İleri düzey bir object oriented kavramına geldi sıra: Interface. Yani ara yüz(TDK'da arayüz şeklinde yazıyor ancak kendilerine katılmadığımdan ben ayrı yazdım). Bir nesne, birden fazla ara yüzü barındırabilir. Farklı yerde farklı şekilde davramamızı sağlar. Ben bu sitede IYazar interface'ini kullanıyorken, evde IEvlat interface'ini kullanıyorum. Üniversitede de IOgrenci'yim. Bana orada da o şekilde bakarlar ve ona göre davranırlar. Bu başına I yazdıklarım birer interface olsun. Bunlardan bazılarını başkaları da barındırabilir. Ancak uygulaması farklıdır. Mesela ben IEvlat interface'ini aldım ve içini iyi bir evlat olarak doldurdum. Ama bir başkası da onun içini hayırsız evlat olarak doldurabilir. Yani imzaladığınız kontratlar gibi düşünebilirsiniz. :İlgililere bir not: run-time'da interface'ler implemente edilemezler. Bunu da cümlenin orijinal halini vererek bitirelim: programming to interface is not inheritance.

Geldik bir makalenin daha sonuna. Umarım sizler için yararlı olmuştur. Başka makalelerde görüşmek üzere, hoşça kalın..

Gürkan Alkan
İstanbul Üniversitesi Bilgisayar Mühendisliği


Fenerin berabere kalmasına keyiflenince makaleyi yazıverdim. :) Görüşmek üzere.. :)

Hiç yorum yok: