Türkay Ürkmez

Nesne Yönelimli Programlama – 1

Merhaba ey dostlar…

Bu günlerde, günlük hayatımızda yaptığımız birçok “rutin” eylemin önüne anlamsız bir espri gibi yapışan bir cümleyle başlamak istiyorum… Evet, ne felsefi bir giriş oldu değil mi? Ama o başlangıcı henüz yapmadığımın da farkında mısınız? Peki, tamam uzatmıyorum… İşte geliyor; “2008’in son makalelerini yazıyorum” (bakınız ne kadar kararsız bir cümle ‘son makaleler’ ne yahu?).

Arkadaşlar, yine uzun zamandan beri yazmayı planladığım bir konuyla karşınızdayım; Nesne Yönelimli Programlama. Yani orijinal ismiyle Object Oriented Programming (iş bu makalede bundan sonra OOP olarak anılacaktır 🙂 ). C#.NET program geliştirmeye henüz başlayan, ya da tanıştığı ilk programlama platformu .NET olan herkes, bu yapının tamamıyla OOP uyumlu olduğunu duymuştur. Ama nedir bu OOP denen teknik ve neden ona ihtiyaç duyalım?

Her şeyden önce şunu belirtelim, OOP programlama tekniği, tamamen insanı taklit eder. Bu açıdan, yüzyılın en dinamik ve verimli programlama tekniği olarak düşünülebilir. Peki, bu taklit nasıl oluyor? Gelin bunu şişman adamca örneklerle görelim.

Bildiğiniz gibi; dünya üzerindeki ilk insanlar, kendi ihtiyaçlarını kendileri karşılamak zorundaydılar. Yani; kendi barınaklarını kendileri inşa ediyor, kendi av silahlarını, kap, kacak gibi gündelik yaşamlarında ihtiyaç duydukları tüm malzemeleri kendileri imal ediyorlardı. Yüzyıllar sonra, toplumlar oluştukça -ya da yerleşik düzene geçildikçe- insanlar kendilerine özel sorumluluk vermeye başka bir deyişle branşlaşmaya başladılar. Yani berber, kasap, bilim insanı, öğretmen, filozof, doktor, marangoz gibi meslekler ortaya çıktı ve böylece ticaret de ilerlemeye başladı.

Günümüz dünyasında, ihtiyaç duyduğumuz şeylerin hemen hepsini, üreticilerinden elde ediyoruz… Kazmayı küreği alıp evimizi yapmıyoruz ya da arka odadaki elektronik aletlerle kendimize bir LCD televizyon üretmiyoruz. Sorumluluğu vermiş olduğumuz üreticiden gidip satın alıyoruz. İşte teknolojinin bu kadar hızlı gelişmesinin temelinde de bu “branşlaşmanın” yatmakta olduğu çok net bir biçimde gözümüze çarpıyor.

Bu noktaya biraz daha yoğunlaşalım… Bir mucit, bir ürün icat ediyor. Daha sonra bu ürünün seri üretimine başlıyor. Zaman geçtikçe, bu ürüne yeni özellikler ekliyor ve ayrıca, ürünün ilk hallerinde de bulunan işlevleri daha verimli hale getiriyor. Bu ürünün ilk halinde bulunan özelliklere “yeniden kullanılabilir” demek pek de yanlış olmaz sanırım. Ayrıca, ürünün yıllar boyunca geçirdiği değişim de, “geliştirilebilirlik” ilkesini kanıtlamıyor mu?

Şimdi OOP tekniği öncesine bir bakalım… Binlerce satır koddan oluşan yazılım ürünleri. Bu ürünleri geliştiren programcılar; her kodu, her seferinde tek tek yazmak zorunda kaldılar. Muhtemelen bu sebepten dolayı, ürünün versiyonları arasında oldukça uzun bir zaman vardı. Çünkü tasarımdaki en ufak bir değişim (mesela yeni bir menü eklenmesi bile), kodun büyük ölçüde değişmesine neden oluyordu. Bu tam olarak zaman kaybıydı.

Artan yazılım talebi, yeni bir kodlama tekniğini yani OOP tekniğini doğurdu. Tıpkı insanların branşlaştığı gibi, kodları da kendi aralarında görevlerine göre ayırarak bir nevi kod fabrikaları oluşturuldu.

İşte bu fabrikaların adı class (sınıf) olarak biliniyor. Haliyle biz, bu class’lardan nesne üretiyor ve o nesneyi, ihtiyacımız olan her yerde kullanabiliyoruz. İşte dediğim gibi OOP kodlama tekniği, tam olarak insanın şu anki yaşamını taklit eden bir yapı.

Peki bir class’ı nasıl tasarlarız? Neler içereceğine nasıl karar veririz? Bu tamamen üreteceğimiz nesneyi ne amaçla kullanacağımıza bağlıdır. Az önce verdiğim örneklerle düşünürseniz, soruyu bir de şöyle sormamız faydalı olur; Bir fabrikayı nasıl kurarız? Fabrikayı kurma aşamasına geldiyseniz eğer, ne üreteceğinize çoktan karar vermişsiniz demektir değil mi? Öyleyse konu class olduğunda da, öncelikle istediğimiz nesnede hangi özelliklerin olması gerektiğini bilmek durumundayız.

Şimdi, bir proje düşünün. Bu proje, bir ayakkabı satıcısının kullanacağı bir program olsun. Kesinlikle bu projede bir ayakkabı nesnesine ihtiyacınız olacak öyle değil mi? Peki bu ayakkabı nesnesinin özellikleri neler olmalı? Gelin bir liste yapalım…

  1. Markası
  2. Tipi (Bot, spor, çizme vs).
  3. Malzemesi (Deri, süet vs).
  4. Numarası
  5. Rengi
  6. Bağcıklı mı değil mi?

Bu özelliklere karar verdim. İşte class’ ımız (yani fabrikamız) üretilecek olan nesnemizin bu özelliklerini belirlemek durumunda. Hadi o zaman işe başlayalım ve uygun tiplerle classımızı yazalım:

(Aşağıdaki kodlar bir Windows Application projesi içinde yazılmıştır)

Projeye sağ tık, Add New Item, Class diyelim ve aşağıdaki kodları oluşturalım.

class Ayakkabi

   {

       string markasi;

       string tipi;

       string malzemesi;

       byte numarasi;

       string renk;

       bool bagcikliMi;

   }

Tamam. Şimdi form1’in Form1_Load metodunda, bu class’dan bir nesne üretmeyi deneyelim;

 

Fakat o da ne? Ayakkabi classımdan ürettiğim pabuc nesnesinde, istediğim özelliklerden hiçbirine erişemiyorum. Çünkü yazdığım özelliklerden hiçbirinin erişim düzenleyicisi (Access Modifier) Public değil! Eğer, class içinde tanımladığınız bir alana class dışından erişmek isterseniz; bu alanı public olarak tanımlamalısınız. Bu durumda, eğer bir proje içinde yazdığınız bir classın başka bir projeden erişilebilmesi için de classın başına public kelimesi getirme zorunluluğumuz ortaya çıkar.

Şimdi, bu değişiklikleri yapalım ve tekrar nesne üretmeye çalışalım:

   public class Ayakkabi

   {

     public string markasi;

     public string tipi;

     public string malzemesi;

     public byte numarasi;

     public string renk;

     public bool BagcikliMi;

   }

Değişiklikler tamam. Peki ya nesnemiz?

 

İşte şimdi, nesnemde aradığım özellikleri görebiliyorum… Ama burada bir sorun var sanki. Bazı özelliklerin nesne tarafında değiştirilebilmesini kesinlikle istemiyorum. Örneğin ben Ayakkabi fabrikamdan 44 numara olarak ürettiğim ayakkabının sonradan 48 numaraya yükseltilmesini istemem. Fakat bütün değerlerim public olarak tanımlandığından bunu şu an yapabiliyorum! Bu hiç de iyi bir şey değil.

Söz, tam bu noktada encapsulation dediğimiz kavrama geliyor. Ama bu, bir sonraki makalemin konusu olacak. Şimdilik burada bırakıyorum.

Bir daha görüşene kadar kendinize iyi davranın ve kendinize birkaç class tasarlayın. Hepinize iyi çalışmalar ve mutlu seneler…