İleri Programlama Dersi 1. Ünite Sorularla Öğrenelim
Nesneye Yönelik Programlamaya Giriş
- Özet
- Sorularla Öğrenelim
Nesneye yönelik yazılım geliştirme nasıl ortaya çıkmıştır?
1960’lı yılların sonuna doğru ortaya çıkan bu yaklaşım, o dönemin yazılım dünyasında beliren bir bunalımın sonucudur. Yazılımların karmaşıklığı ve boyutlarının sürekli artması ve aynı zamanda belli bir nitelik düzeyinin korunması için gerekli bakım maliyeti, zaman, çaba vb. unsurların sürekli artması sonucu nesneye yönelik programlama yaklaşımı çözüm olarak geliştirilmiştir.
Nesneye yönelik programlama yaklaşımında sınıf (class) kavramı neyi ifade etmektedir?
Bir otomobil düşünülecek olursa, otomobilin marka ve modeli ne olursa olsun hızlanıp yavaşlayabilen, direksiyonuyla istenilen yöne yönlendirilebilen bir araç hayal edilebilir. Bu özellikler aslında genel davranışlar olup bütün otomobillerde bu davranışları sergilemektedir. Ayrıca, her otomobilin, motoru, lastikleri, kapıları, farları vb. özellikleri de mevcuttur. Her marka ve modelde bu özelliklerin mevcut olduğu bilinmektedir. Programlama açısından, bu örnekte ki otomobil bir sınıftır. Özetle sınıf, o sınıftan bütün varlıkların ortak özellik ve davranışlarını belirleyen bir yapıdır.
Nesneye Yönelik Programlama yaklaşımında nesne nedir?
Nesne, ait olduğu sınıftan gelen özelliklerin belli olduğu, sınıfı için tanımlı olan davranışları nasıl sergilediğinin bilindiği, somut olarak var olan bir kimliği olan varlık olarak düşünülebilir. Sınıfın yaratılan bir örneğine, örnek nesne (instance) ismi verilmektedir.
Nesneye yönelik programlama yaklaşımında sahiplik (has a) ilişkisi nedir?
Örnek olarak “kalem kutusu” ismiyle bir sınıf tanımlanırsa, bu sınıfta muhtemelen özellikleri içerisinde sahip olduğu kalemlerin de “kalem” sınıfının da olması gerekecektir. Dolayısıyla kalem kutusu sınıfı aynı zamanda kalem sınıfıyla ortaklık (association) kurmak durumundadır. Bu ilişki “kalem kutusu kalemlere sahiptir” şeklinde bir ilişki olup sahiplik (has a) ilişkisi olarak adlandırılır.
Nesneye yönelik programlama yaklaşımında nesnelerin sahip olduğu bileşenler nelerdir?
Her nesnenin belli bir takım özellikleri ve işlevselliğini sağlayan davranışları vardır. Nesneye yönelik programlama yaklaşımında nesneler, özellikler (properties) ve metotlar (methods) a sahiptir. Nesnelerdeki karakteristikler, özellikleri ve gerçekleştirebileceği eylemler de metot adını almaktadır. Bunu bir örnekle açıklanacak olursa; yukarıdaki örneğimizdeki gibi bir otomobil nesnesinin, hız bilgisi, vites bilgisi, yakıt bilgisi vb. özelliklerini, aracın hızlanması, yavaşlaması, durması gibi eylemlerini de metotlarını temsil etmektedir.
Nesneye yönelik programlama yaklaşımında bağımlılık (dependeny) ilişkisi neyi ifade eder?
Eğer bir nesne, her zaman bir diğer nesneyi de etkiliyorsa ya da var olmak için diğerine ihtiyaç duyuyorsa o zaman burada da bir bağımlılık (dependency) ilişkisi vardır. Bağımlılık ilişkisine örnek olarak otomobil nesnesiyle, tekerlek nesnesini verebiliriz. Tekerleği olmayan bir otomobil düşünülemeyeceği için tekerlek nesnesiyle otomobil nesnesi arasında bağımlılık ilişkisi vardır.
Birleşik Modelleme Dili (Unified Model- ling Language – UML) ne demektir?
İş sistemlerinin nasıl modellenebileceğini belirleyen ve açıklayan yöntemlerin bir araya toplanmış halidir. Daha çok yazılım geliştiriciler tarafından kullanılan UML ile nesneye yönelik programlamada temel teşkil eden sınıflar oluşturulabilir ve sınıfların geliştirilmesi aşamasında sağlanan görselliklerle daha kolay anlaşılabilir olmaktadır. Tasarım aşaması, genellikle sistemin çeşitli açılardan görünüşlerini ifade eden UML diyagramlarıyla sonlanır.
Düşük Bağlılık (Low Coupling) nedir?
Bir sınıfın diğer sınıflarla bağlılık oranı olarak düşünülebilir. Burada bahsedilen bağlılık aslında kalıtım ilişkisinin bulunmasıyla birlikte diğer sınıfların iç yapısından haberdar olması, çeşitli hizmetlerinden yararlanabilmesi ve çalışma prensibinden haberdar olmasını ifade etmektedir. Tabi burada ilişkide bulunulan diğer sınıfların sayısının artması bağlılık oranını arttıran faktörlerdendir. Düşük bağlılığın en önemli faydası bir sınıfta yapılan değişikliğin diğer sınıfların az etkilenerek uyarlanmasının sağlanmasıyla birlikte yeniden kullanılabilirliğin artması olarak söylenebilir.
Yüksek Uyum (High Cohesion) nedir?
Burada bahsedilen uyum aslında bir sınıfın sorumluluklarının birbirleriyle uyumlu olma oranı olarak düşünülmektedir. Uyum, modüllerin veya sınıfların birbirine olan benzerliği yani aynı amaca hizmet eden kod bloklarının bulunması anlamını taşımaktadır. Aslında düşük bağlılık ile ters orantıda olan bir kavram olup bağlılığın az olması uyumun artması anlamını taşımaktadır. Bir sınıfın yeniden kullanılabilirliğinin artması, değişikliklerden etkilenmesinin azalması, yüksek uyumun beraberinde getirdiklerinden bazılarıdır. Bu kavramlar bir yazılımın kalitesini yazılım geliştirme yaşam döngüsünü oluşturan kavramların anlatıldığı yazılım mühendisliği gibi derslerde daha detaylı olarak anlatılmaktadır.
Sarmalama (Encapsulation)nedir?
Bir yazılımcının kod geliştirme aşamasında nesneye yönelik programlama yaklaşımı içerisinde belli bir sınıfa baktığında sınıfın özellikleri ve metotlarının hangilerinin kendisine yarayacağını hangilerinin sadece başka metotlarda kullanılacağı ve sınıfa özel olduğunu görmesi zor olabilir. Bazı durumlarda güvenlik ve sağlamlık amacıyla bir sınıfta kullanılan özelliklerin değiştirmesi ve bazı metotlara erişmesi engellenmek istenilebilir.
İşte bütün bu istenilen durumlar için erişim sınırlandırma işlemine sarmalama (encapsulation) adı verilmektedir.
Kalıtım (Inheritance) nedir?
Kalıtım yapısı, adından da anlaşılacağı üzere birtakım özelliklerin miras alınabilmesi anlamındadır. Yani, bir sınıfın başka bir sınıftaki özelliklere ve metotlarına sahip olmasıdır. Bir anlamda kodun yeniden kullanılabilirliğini sağlayan yapıdır.
Nesneye yönelik programlamada bir sınıf birden fazla sınıftan birtakım özellik ve metotları miras olarak alabilir mi?
Bu soru çoklu kalıtım (multiple inheritance) kavramını ifade etmektedir. Bir örnekle açıklanacak olursa, bir taşıt sınıfı tanımlansın, bu taşıt sınıfının alt sınıfı olarak taşıt sınıfından türetilmiş olan otomobil, gemi, uçak ve çekici sınıfları olsun. Bir kamyon düşünün ki hem taşıt sınıfı özelliklerini taşısın hem de çekici sınıfı özelliklerini üzerinde barındırsın. Bu yapı kalıtım yoluyla miras alacağı özellik ve metotları üst sınıf olarak birden fazla sınıftan alabilmeyi içermektedir.
Nesneye yönelik programlamada çok biçimlilik neyi ifade etmektedir?
Çok biçimlilik, nesnelerin içeride farklı çalışmalarına rağmen, dışarıdan aynı biçimde görünmelerini ifade etmektedir. Bu şekilde, bir grup nesneyi kullanan sınıflar kalıtımla ilgili detayları bilmek zorunda kalmamakta, içerideki değişikliklerden et- kilenmeden çalışmaya devam etmektedirler. Aynı sınıftan türetilen sınıflar standart bir şekilde erişilebilme özelliklerine sahip olmaktadır.
Nesneye yönelik programlama yaklaşımı dışında hangi yaklaşımlar bulunmaktadır?
Nesneye yönelik programlama yaklaşımı dışında çeşitli yaklaşımlar da bulunmaktadır. Bunlar arasında Yapısal Programlama (Programming), Bileşen Tabanlı Yazılım Geliştirme (Component Based Software Development), Görünüm Yönelimli Programlama (Aspect Oriented Programming) sıralanabilir. Bunlar kendisinden önceki ve sonraki yaklaşımlara altyapı oluşturmuş ve geniş bir kullanım alanı bulmuşlardır.
Nesneye yönelik program tasarımınında çözümleme aşaması neyi ifade eder?
Çözümleme, sistemin ne yapması gerektiğinin belirlenmesi aşamasıdır. Bu aşamada önemli husus, sistemin tanınması ve istenilen gereksinimlerin iyi anlaşılıp bunların arkasında kalan ve ortaya çıkarılmamış gereksinimlerin belirlenerek çıkarılması ve sistemin kurallarının ve işleyişinin irdelenebilmesidir.
Nesneye yönelik çözümlemede ise, çözümlemenin yapılması aşamasında sınıflardan ve nesnelerden faydalanılmaktadır. Sistemdeki sınıfların özellikleri ve davranışlarının iyi belirlenmesi gerekmektedir.
Nesneye Yönelik Tasarım Ölçütleri nelerdir?
Öncelikle tasarım yapısının ayrılabilir, birleştirilebilir, anlaşılabilir ve korunabilir olması gerekmektedir. Bu kavramları kısaca açıklamak gerekirse, ayrılabilirlikten kasıt anlamlı parçalara ayrılabilmesini ifade etmektedir. Burada bahsedilen parça aslında sınıfı temsil etmektedir. Bir problemin alt problemlere bölünebilmesi tasarımın ayrıştırılabilmesiyle mümkün olmaktadır.
Birleştirilebilir olması, sınıfı temsil eden parçanın başka tasarımlarda da tekrar tekrar kullanılabilmesi yani diğer parçalarla birleştirilebilmesi anlamını taşımaktadır. Tasarımın anlaşılabilirliği, bir sınıfın diğer sınıflarla bilgiye gerek duymadan anlaşılabilmesi ve aynı zamanda yapılacak küçük değişikliklerin etkilerinin en az sayıda sınıfa yayılarak uyarlanmasını ifade etmektedir. Son olarak korunabilirlik ise, olası hatalara karşı düzeltilebilmesine yönelik etkilerin geniş bir alana yayılmadan önlenebilmesidir.
Nesneye yönetlik programlama geliştirilen yazılım üzerinde bakım kolaylığını nasıl sağlamaktadır?
Yazılımın bakım kolaylığı; nesnelerin ait oldukları sınıflarca sunulduğu şablonlarda temsil edildiği için benzer veya aynı konuyla ilişkili sınıflar bir araya getirilerek sınıf kümeleri oluşturabilmektedir. Bu durumda yazılımın bakımı, ya mevcut sınıflarda değişiklik ya da yeni sınıf eklenmesi anlamına gelmektedir. Bu da yazılımın tamamını hiçbir şekilde etkilememekte, dolayısıyla bakım kolaylığı getirmektedir.
Nesneye yönelik programlamada genişletilebilirlik (extensibility) hangi amaçla kullanılır?
Genişletilebilirlik; mevcut bir sınıfa yeni özellik veya yapılar ekleyerek artan işlevsellik sağlanmasıdır. Bu da nesneye yönelik programlama yaklaşımında kolaylıkla yapılabilmektedir.
Kodun yeniden kullanabilirliği neyi ifade eder?
Kodun yeniden kullanılabilmesi; üretilen sınıfların her uygulama geliştiricinin kullanımına açık olan bir ortak kütüphanede tutulmasına imkân sağlaması, her kullanıcının bu ortak kütüphane- de bulunan sınıfları kullanabilmesi ve dolayısıyla benzer kodları yeniden yazmaktan kurtulması anlamındadır.
Nesneye yönelik programlamada erişim değiştiriciler (access modifier) neyi ifade etmektedir?
Sarmalama işleminin yapılabilmesi için public, private, protected gibi kelimeler kullanılan yazılım dili içerisinde bulunmaktadır. Bu kelimeler kısaca “erişim değiştirici (access modifier)” olarak bilinmektedir. Sınıf içerisindeki özellikler ve metotların başına bu kelimeler getirilerek erişim sınırlandırma işlemi yani sarmalama yapılabilmektedir.