AÖF Soru Bankası

İleri Programlama IÜnite 7 Özeti

Nesneye Yönelik Kavramlar I

Lisp, Perl gibi dillerin çoklu kalıtımı desteklerken Giriş karşılaştıkları elmas (Diamond) problemi karşımıza

Nesne yönelimli programlama, daha modüler ve düzenli çıkıyor. Konu ile ilgili bir başka soru da nasıl oluyor da kod geliştirilmesine imkân vermektedir. Bu yaklaşım ile birden fazla arayüzden kalıtım alınabildiğidir? Cevabı çok projelerin yönetilebilirliği artmış ve daha büyük projeleri basit: Arayüzler, içlerinde herhangi bir kod bloğu yönetmek daha kolay hâle gelmiştir. Nesne yönelimli barındırmayan, sadece metotların şablon tanımlarını içeren programlamanın gerçekleştirilebilmesi için belirli kurallara yapılar olduğundan, aynı metotlar farklı arayüzlerde geçse uyulması gerekmektedir. bile, metot tanımı sadece bir kere yapılacağı için herhangi bir belirsizlik durumu ortaya çıkmayacaktır. Miras Alma (Inheritance) Miras alma ya da kalıtım, nesne yönelimli programlamanın Miras Alma İşlemlerinde Erişim Denetleyicileri

önemli kavramlarından biridir. Miras alma, programlama Erişim denetleyicileri, bir sınıftaki metot ve özellikler gibi dillerinde de günlük hayattaki gibi atadan çocuğa tüm tüm üyelere olan erişimin sınırlarını belirleyen anahtar bırakılanları ifade etmektedir. Yani bir sınıftaki tüm sınıf kelimelerdir. üyelerini tekrar kullanan ve bunları genişleterek yeni Temel sınıftan türetilmiş sınıf, temel sınıfın sahip olduğu sınıflar tanımlamamızı sağlayan bir tekniktir. değişken ve metotları sanki kendi içerisinde tanımlanmış C# programlama dilinde kullanımı şu şekildedir: gibi kullanabilir. Yalnız, temel sınıfın erişim denetleyicileri “public” ve “protected” olarak tanımlanan elemanları class TemelSinif türetilmiş sınıfa kalıtım yoluyla aktarılırken “private” olan { elemanlar kalıtım yoluyla aktarılmaz. } class TuretilmisSinif : TemelSinif • Public: Kalıtım ile aktarılır, her yerden erişilebilir. { • Private: Kalıtım ile aktarılmaz, sadece } tanımlandıkları sınıf içerisinden erişilebilir.

C# dilinde, çoklu kalıtıma izin verilmez fakat türetilen bir • Protected: Kalıtım ile aktarılır, tanımlandıkları ve sınıftan yeni bir sınıf türetilmesine izin verilmektedir. kendisinden türetilen sınıflardan erişilebilir. • Internal: Kalıtım ile aktarılır, sadece bulunduğu C# programlama dilinde kalıtımın yapılabilmesi için projede erişilebilir. uyulması gereken bazı kurallar mevcut. Şimdi bu kurallara değinelim: Yapıcı Metotlar ile Miras Alma İşleminin İlişkisi

Sınıflar kalıtım ile türetilirken temel sınıfın tüm değişken • Kalıtım yoluyla türetilen sınıf, varsayılan yapıcı ve metotları da türetilen sınıfta erişim yetkileri (constructor), statik yapıcı (static constructor) ve çerçevesinde kullanılabilir. Burada aklımıza şöyle bir soru yıkıcı (destructor) metotları devralamaz. gelebilir: Türeyen sınıftan üretilen yeni bir nesne için kendi • Türetilen sınıf, temel sınıfın üyelerini erişim sınıfının yapıcı (constructor) metodu çağrılır. Peki, izinleri kuralları çerçevesinde devralmaktadır. türetildiği sınıfın yapıcı metodu da çağrılır mı? Bu soruya • Türetilen sınıflar, aynı anda sadece bir sınıftan verilecek cevap evettir, türetildiği sınıfın da yapıcı metodu türetilebilir, çoklu kalıtım desteklenmez. çağrılır. Bunun yanında, temel sınıf olduğu için ilk önce • public erişim belirleyicisine sahip üyelere sınıfın türetildiği temel sınıfın yapıcı metodu çağrılır. türetilmiş sınıflardan ve bu sınıfların public olan ara yüzlerinden erişilebilir. Sınıf Bağımlılıkları (Class Coupling)

• private erişim belirleyicisine sahip üyelere Sınıfların bağımlılığı konusuna “Sıkı Bağlı” (Tightly türetilen sınıftan erişilemez. Sadece sınıfın kendi Coupled) kavramını açıklamak ile başlayabiliriz. Bir içinden ve iç içe tanımlı sınıflardan erişilebilir. sistem, belli bir nesne olmadan çalışamıyorsa, ona mutlaka • protected erişim belirleyicisine sahip üyelere ihtiyaç duyuyorsa, o nesneye sıkı sıkıya bağlı olduğunu sadece türetilmiş sınıflar içerisinden erişilebilir. söyleyebiliriz. • internal erişim belirleyicisine sahip üyelere aynı Sayfa 173’deki örnek kodu incelediğimizde, kodun derleyicide (assembly) türetilmiş sınıflar çalıştırıldığı Main metodunu içeren Program sınıfı mevcut. tarafından erişilebilir. Main metodu içinde dosya okuyucu sınıftan bir nesne Çoklu ve Hiyerarşik Miras Alma oluşturuluyor. Oluşturulan nesnenin Oku ve VeriKaydet C# programlama dilinde, bir sınıf sadece bir sınıftan metotları çağrılarak işlem yapılıyor. VeriKaydet metodu, türeyebilir. Bunun yanında bir sınıf, birden fazla arayüz içinde DosyaKayit sınıfına ait nesne oluşturarak bunun (interface) yapısından da kalıtım alabilir. Çoklu kalıtımla üzerinden dosya kayıt işlemini yapıyor.

yapmak istediğimiz işlemleri, arayüzler (interface) ile DosyaOku ve DosyaKayit sınıfları, birbirleri ile iç içe destekleyerek yapabiliriz. Peki neden birden fazla girerek sıkı bağlandığı için bu sınıflarda ek değişiklikler arayüzden kalıtım alabiliyorken birden fazla sınıftan yapmak zordur. Bunun nedeni de kod içinde bir güncelleme kalıtım ile sınıf türetemiyoruz? Cevap olarak, C++, Python, yapılmak istendiğinde, değişikliklerin birçok yerde


yapılmasına ihtiyaç duyulmasıdır. Daha büyük ve karmaşık ekranı, klavyesi public tanımlı olarak dış dünyaya projelerde bu durumlarla karşılaşmak, kodu içinden açılmışken, harddiski, ram, işlemci ve anakart gibi çıkılması ve anlaşılması güç bir hâle sokacaktır. bileşenleri private tanımlı olup kullanıcılardan saklanmıştır. Gevşek Bağlı (Loosely Coupled) kavramı da sıkı bağlılığın tam tersidir. Buna günlük hayattan şapkayı örnek olarak Generics verebiliriz. Spor bir şapka veya bir kasketten herkes kendi Generics, genel, geniş kapsamı olan manasında kafasına ve zevkine uygun olanı alıp kullanır. Burada kafa kullanılmaktadır. C# programlama dilinde de yine aynı ve şapkanın birbirine bağımlılığı olmadığı için gevşek bağlı şekilde genel, belirli bir veri türüne özgü olmayan anlamına olduğunu söyleyebiliriz. Aynı şekilde sınıf ve nesnelerin gelmektedir. C#, belirli bir veri türü olmadan, tür birbirine gevşek bağlı olduğu durumlarda, kodun parametresini kullanarak genel sınıflar, arabirimler, soyut güncellenmesi, tekrar kullanılması ve bakımı daha kolay ve sınıflar, alanlar, metotlar, statik metotlar, özellikler, olaylar, hızlı olacaktır. temsilciler ve operatörler tanımlanmasına olanak tanır.

Kodun istenilen şekilde değiştirilmesine izin veren, Biraz daha açacak olursak “generics”, tasarlanan arayüz, modüler bir yapıda hazırlanması bir gerekliliktir. Bu sınıf, metot ya da parametrelerin double, int, string gibi gereklilik ise gevşek bağlantılı kod oluşturmak ile belirli bir tür yerine bir şablon yapısına uyan her bir tür için mümkündür. Küçük uygulamalarda sıkı bağlılık her ne çalışmasına olanak veren bir yapıdır. kadar sorun olmasa da uygulama üzerinde büyük değişiklikler çıktıkça uygulamanın tekrar yazılmasına Kullanımının sağladı faydaları şu şekilde sıralayabiliriz: ihtiyaç duyulacaktır. • Tekrar kullanılabilir kod yazımına yardımcı Kompozisyon (Composition) ve Birleştirme olarak tekrarı önler. (Aggregation) • Kod üzerinde daha esnek ve güçlü bir kontrol Kompozisyon, bir sınıfın diğer sınıfı içermesine izin veren sağlanmasına yardımcı olur. sınıflar arasındaki ilişki türüdür. Kompozisyonda içerilen • Hata ayıklaması kolay ve yönetilebilir kodların ya da sahip olunan nesne, sahip olan nesneden bağımsız bir yazılmasına imkân verir. şekilde var olamaz. Örneğin, bir dizüstü bilgisayarın • Derleme zamanında (compile time) tip güvenli ekranının, dizüstü bilgisayar dışında bir kullanımı yoktur. değişken kullanılması zorunlu olduğu için, çalışma zamanında oluşabilecek tür dönüşüm Kompozisyon da tıpkı kalıtım gibi kodun yeniden hatalarını engeller. kullanılmasına izin verir. Nesnelerin ömürleri açısından • Çalışma zamanında (runtime) tür dönüşümü bakıldığında, sahip olan nesne ile sahip olunan nesnenin (casting, boxing-unboxing) işlemlerini önleyerek ömürleri yaklaşık aynıdır. kodun daha verimli ve hızlı çalışmasını sağlar.

Birleştirme (Aggregation) ise içerilen ya da sahip olunan Generic ifadeler genellikle “T” ile gösterilmektedir. Nesne nesnenin, sahip olan nesneden bağımsız olarak var ya da sınıf tanımı yapılırken T’ye atanan veri türü ile işlem olabilmesine denmektedir. Buna da yine dizüstü bilgisayar yapılmaktadır. Burada dikkat edilmesi gereken nokta, örneğinden devam ederek dizüstü bilgisayar ile çantasını derleyicimiz T gördüğü her yere atadığımız bu veri türünü örnek verebiliriz. Çanta ve dizüstü bilgisayarın ayrı ayrı koymaktadır. Bu yüzden T’ye atanan veri türü harici bir işlevsellikleri vardır, birbirlerine bağlı değillerdir. veri atanmaya çalışılır ise derleme zamanı hatası

Sonuç olarak aralarındaki temel fark sınıfların alınacaktır. bağımsızlıklarıdır. Kompozisyonda, alt sınıfların yaşam döngüsü, doğrudan üst sınıfın yaşam döngüsüne bağlıdır ve bunun tersi de geçerlidir. Birleştirmede (Aggregation) ise alt sınıfların ve üst sınıfın kendi yaşam döngüleri vardır.

Kapsülleme (EnCapsulation)

Kapsülleme, nesne yönelimli programlamanın önemli kavramlarından biridir. Bir sınıfın üyelerinden, sınıf dışında görevi olmayan, sadece sınıf içi işlemlerde kullanılacak olanlar private bölüme yerleştirilir. Dış dünyaya sadece public arayüzü ile tanımlı olan üyelerin servis edilmesi şeklinde tanımlanabilir. Public tanımlı üyeler içinde de private tanımlı üyeler ile ilgili işlemler yapılabilir.

Kapsülleme işlevi güzel gerçekleştirilmiş bir sınıf, kullananlarda da kafa karışıklığına neden olmaz. Bu duruma bilgisayar üzerinden örnek verebiliriz. Bilgisayarın

Bu ünitenin sorularını uygulamada çözŞıklar, doğru cevaplar ve süreli sınav modu AÖF Soru Bankası uygulamasında