FaTaL Yönetici
Ruh Hali : Mesaj Sayısı : 626 Rep Puanı : 12320 Teşekkür Aldı : 18 Kayıt tarihi : 24/10/09 Nerden : Kocaeli İş/Hobiler : 3D / Maya / After Efect Lakap : Fatal
| Konu: Nesne Yönelimli Programlama Cuma Ekim 30, 2009 9:33 am | |
| Nesne Yönelimli Programlamaya (OOP) Neden İhtiyaç Duyarız
Nesne yönelimli programlama, daha önceki programlama tekniklerinde yaşanan kısıtlamalar neticesinde geliştirildi.Nesne yönelimli programlanın kıymetini anlayabilmek için bu kısıtlamaların neler olduğunu ve geleneksel programlama dillerinde bu kısıtlamaların nasıl ortaya çıktığını anlamamız gerekiyor
Prosedürel Diller
Bu çok sayıdaki bağlantı birkaç açıdan probleme neden olur. Birincisi; bu durum programın kavramsal olarak modellenmesini zorlaştırır. İkincisi de bu durum program üzerinde değişiklik yapılmasını güç hale getirir. Global bir veri üzerinde yapılan bir değişiklik, bu veriye erişen bütün fonksiyonların yeniden yazılmasını zorunlu kılabilir.
Örneğin, envanter programımızda, bir programcı envanter mallarının ürün kodlarını 5 basamaktan 12 basamağa çıkarmaya karar verebilir. Bu durumda veri tipinin short tan long a çevrilmesi gerekebilir.Şimdi bu veri üzerinde işlem yapan tüm fonksiyonların short yerine long ile işlem görecek şekilde değiştirilmesi zorunludur.
Büyük programlarda, veriler üzerinde değişiklik yapıldığında hangi fonksiyonların bu verilere eriştiğini söylemek kolay olmayabilir. Bunu saptasanız bile, bu fonksiyonlar üzerinde yapılabilecek değişiklikler fonksiyonların diğer global verilerle hatalı çalışmalarına neden olabilir. Her şey her şeyle bağlantılıdır. Yapılan bir değişiklik, ucu uzaklara dokunan ve çoğunlukla planlanmamış sonuçlara neden olabilir.
Gerçek Dünyaya Uygun Modelleme
Prosedurel yöntemlerdeki ikinci ve en önemli problem, bu yöntemlerin farklı veri ve fonksiyonları düzenlerken gerçek dünyayı yetersiz biçimde modellemeleridir. Fiziksel dünyada biz; insanlar arabalar gibi çeşitli nesnelerle temas içindeyiz. Bu nesneler ne veriye benzer ne de fonksiyona. Gerçek dünyanın karmaşık nesneleri hem niteliklere hem de yeteneklere sahiptir.
Nitelikler
Göz rengi ve mesleki unvan insanlar için örnek olarak verilebilecek niteliklerdendir. Arabalar için ise motor gücü, kapı sayısı, rengi bu tür niteliklerdendir. Görüldüğü gibi gerçek dünyadaki nitelikler programdaki verilere karşılık geliyor: Her biri belirli bir değere sahiptir. Söz gelişi, mavi (göz rengi için) veya dört (kapı sayısı için);
Davranış
Davranış gerçek dünyaya ait bir nesnenin bir etkiye karşı gösterdiği tepkidir. Patronunuzdan zam istediğinizde, patronunuzu sizi çoğunlukla evet yada hayır diye yanıtlar. Araba kullanırken frene basarsınız araba çoğunlukla durur. Bu örneklerdeki patronun cevabı veya arabanın durması bir davranış örneğidir. Davranış bir fonksiyon gibidir: Bir şey yapması için bir fonksiyon çağırırsınız ve fonksiyon bu işlemi yapar.
Nesne Yönelimli Yaklaşım
Nesne yönelimli dillerin ardındaki ana fikir verileri ve bu veriler üzerinde işlem yapan fonksiyonları tek bir birim içinde birleştirmektir. Bu birim nesne (object) olarak adlandırılır.
Bir nesnenin fonksiyonları, bu nesnenin verilerine erişmeyi sağlayan tek yoldur.C++ dilinde bu fonksiyonlar üye fonksiyon olarak adlandırılır. Bir nesnenin içindeki bir veriyi okumak istiyorsanız, bu nesnenin içindeki bir üye fonksiyonu çağırırsınız. Bu üye fonksiyon ver,ye erişip değerini size döndürür. Siz veriye doğrudan ulaşamazsınız. Veriler gizlenmiştir, böylece kazara meydana gelecek değişikliklerden korunmuş olurlar. Veriler ve ilgili fonksiyonlar tek bir birim içine paketlenmişlerdir. Verilerin paketlenmesi ve veri gizliliği nesne yönelimli dillerin tanımlanmasında kullanılan temel terimlerdir.
Bir nesne ye ait verileri değiştirmek istediğinizde, bu verilerle etkileşen fonksiyonların neler olduğunu tam olarak bilmeniz gerekir: Nesnenin üye fonksiyonları.Diğer hiçbir fonksiyon bu verilere erişemez. Bu, kodlamayı,hataları ayıklamayı ve programın bakımını kolaylaştırır.
Bir C++ programı tipik olarak birkaç tane nesne içerir. Bu nesneler diğerlerinin üye fonksiyonlarını çağırarak birbirleriyle iletişim kurarlar.
Şunu vurgulamamız gerekir: C++ da üye fonksiyon olarak ifade edilen fonksiyonlar diğer nesne yönelimli dillerde yöntem (metod) olarak adlandırılır. Ayrıca verilere de nitelikler veya örnek değişkenler denilmektedir. Bir nesnenin üye fonksiyonlarını çağırmak bu nesne ye mesaj göndermektir. Bu terimler C++ terminolojisinin resmi terimleri değildir ama, nesne yönelimli tasarımlarda artan sıklıkla kullanılmaya başlanmıştır.
Bir Benzetme
Nesneleri bir şirket içindeki bölümler olarak düşünebiliriz: Söz gelişi, satış, muhasebe, insan kaynakları bölümleri gibi. Bölümler kurumsal organizasyonlara önemli katkılar sağlar. Çok küçükleri hariç pek çok şirkette insanlar bir gün personel problemleriyle, diğer gün maaşlarla uğraşıp sonrada satışa çıkmazlar. Her bölümün, görevleri açıkça belirlenmiş kendi personeli vardır. Ayrıca her bölüm kendi verilerine sahiptir: Muhasebe bölümü maaş bilgilerini, satış bölümü satış rakamlarını, personel bölümü de çalışanların kayıtlarını tutar.
Bölümlerdeki insanlar kendi bölümlerinin verilerini denetler ve bu veriler üzerinde işlem yaparlar. Şirketi bölümlere ayırmak, şirket faaliyetlerini anlamayı ve denetlemeyi kolaylaştırır; ayrıca şirket bilgilerinin entegrasyonunun sürekliliğine de yardımcı olur. Muhasebe bölümü, mesela, maaş verilerinden sorumludur. Eğer siz satış müdürüyseniz ve Temmuz ayında güney bölgesinde yapılan maaş ödemelerinin yekününü merak ediyorsanız, Muhasebe bölümüne gidip dosya dolaplarının altını üstüne getirmezsiniz. Muhasebe bölümündeki ilgili bir kişiye bir not gönderir; daha sonra görevli kişinin veriye erişip, istediğiniz bilgiyi size göndermesini beklersiniz. Bu, veriye hatasız erişilmesini garanti eder ve verinin izinsiz erişimlerle bozulmasını önler. Kurumsal organizasyonlarla ilgili bu bakış açısı aşağıdaki şekilde gösterilmiştir. Aynı şekilde, nesneler de, program verilerinin bütünlüğünü korumaya yardımcı olur; aynı zamanda programları organize etmenin yollarından biridir.
C,Pascal,Fortran vb. diller prosedurel dillerdir. Yani, dildeki her ifade bilgisayara bir iş yapması gerektiğini söyler:Girdiyi al,girdi olarak alınan sayıları topla, altıya böl,sonucu ekranda göster… Prosedurel dilde yazılan bir program bir komut listesidir.
Fonksiyonlara Bölmek
Programların hacmi büyüdükçe tek bir komut listesinin idaresi güçleşir. Birkaç yüz ifadeden daha fazlasına sahip program, küçük birimlere bölünmediği takdirde az sayıda programcı tarafından anlaşılabilir. Bu nedenler, programların kendilerini üreten insanlara daha anlaşılır görünmesi amacıyla fonksiyon yapısı geliştirildi. Prosedurel bir program fonksiyonlara bölünmüştür. Her fonksiyonun (en azından ideal olarak) açıkça tanımlanmış bir amacı vardır ve program içindeki diğer fonksiyonlarla arasında açıkça tanımlanmış bir arayüz mevcuttur.
Bir programı fonksiyonlara bölme fikri daha da genişletilebilir: Birkaç fonksiyon bir araya gelip getirilip modül denilen daha büyük bir birim içinde gruplana bilir. Fakat prensip her iki durumda da aynıdır: Bir komut listesini yürüten bileşenlerin gruplanması.
Bir program fonksiyonlara ve modüllere ayırmak yapısal programlamanın esaslarından biridir.Yapısal programlama, nesne yönelimli programlamanın çıkışına kadarki on yıllar boyunca programlama yapısını etkilemiş olan, bir ölçüde üstünkörü tanımlanmış bir disiplindir.
Yapısal Programlamada Karşılaşılan Problemler
Programlar sürekli büyüyüp daha karmaşıklaştıkça, Yapısal programlama yaklaşımı da zorlanmaya başlar. Program geliştirilirken yaşanılanlarla ilgili anlatılan dehşet hikayelerini duymuşsunuzdur; hatta böyle bir hikayenin içinde kendiniz bile yer almış olabilirsiniz. Proje fazlasıyla karmaşıktır, planların gerisinde kalmışsınızdır,programcı sayısı arttırılır, karmaşıklık daha da artar, maliyet hızla yükselir, planların daha da gerisinde kalınır ve felaket kaçınılmaz.
Bu başarısızlıkların ardındaki neden incelendiğinde asıl zayıflığın prosedurel yaklaşımın kendisinden kaynaklandığı görülür. Yapısal programlama ne kadar iyi gerçekleştirilirse gerçekleştirilsin, büyük hacimli programlar haddinden fazla karmaşık hale gelir.
Prosedürel diller de yaşanan bu problemlerin nedenleri nelerdir? Konuyla ilgili iki problem vardır. Birincisi, fonksiyonların global verilere erişmesinin sınırsız olması. İkincisi de prosedürel yaklaşımın temeli olan fonksiyon ve verilerin gerçek dünyanın modellemesinden uzak olması.
Bu problemleri bir envanter programı örneğinde inceleyelim. Böyle bir programda, envanterdeki mal yığını önemli bir global veridir. Yeni malın envantere girilmesi,gösterimi,mal ile ilgili değişik yapılması ve benzeri işlemler için çeşitli fonksiyonların bu veriye erişmesi gerekir.
Sınırsız Erişim
Prosedürel bir programda, mesela C dilinde yazılmış olsun, iki çeşit veri vardır. Yerel veri, bir fonksiyon içinde gizlidir ve yalnızca bu fonksiyon tarafından kullanılır. Envanter programında bir gösterim fonksiyonu, ekranda hangi malın gösterdiğini hatırlaması amacıyla yerel veri kullanılabilir. Yerel veri, fonksiyonun işleviyle yakından ilgilidir ve diğer fonksiyonların yapabileceği değişikliklerden etkilenmez.
Ancak, iki veya daha fonksiyon aynı veriye erişmek zorunda ise –ve bu durum programın en önemli verileri için geçerliyse- o halde bu verinin, örneğimizdeki envanterdeki mal yığını gibi global tanımlanması gereklidir. Global veri, program içerisindeki tüm fonksiyonlar tarafından erişilebilir.(Fonksiyonların modül olarak gruplanmasını bu aşamada dikkate almıyoruz, çünkü bu, konumuzu önemli ölçüde etkilemiyor.)
Büyük hacimli bir programda bir çok fonksiyon ve global veri mevcuttur. Bu durumun aşağıdaki şekilde gösterildiği gibi fonksiyonlar ve veriler arasında daha fazla sayıda potansiyel bağlantıya neden olması prosedürel yöntemlerde karşılaşılan bir problemdir.
Nesne Yönelimli Programlama: Düzenli Programlara Doğru
Şunu aklınızdan çıkarmayın: Nesne yönelimli programlama aslında programın çalışma ayrıntılarıyla ilgilenmez. Onun yerine, programın genel organizasyonuyla ilgilenir. C++ ‘ taki bir çok program ifadesi prosedürsel dillerdeki ifadelere benzer, pek çoğu da C deki ifadelerin aynısıdır. Gerçekten, bir C++ programındaki bir üye fonksiyonun tümü, C’deki bir prosedürel fonksiyona cok benziyor olabilir. Bir ifade veya fonksiyonun prosedürel bir C programının veya Nesne Yönelimli C++ programının parçası olup olmadığı ancak daha genel açıdan bakıldığında görülebilir. | |
|