Herkese merhaba. 😊 Bugün yazılımcılığa girişin ilk adımı olarak nitelendirebileceğim Nesne Yönelimli Programlama (Object Oriented Programming) konusuna giriş yapacağım. Bu konu tamamen dil bağımsız bir konu olduğu için C# dışında istediğiniz bir programlama dilinde uyarlayabilirsiniz. Bu yazıya kadar anlatmaya çalıştığım yazılarımla bir ürün ortaya çıkartabilirsiniz. Örnek olarak bir konsol uygulaması yaptığımızı düşünelim. Yapılan işleri Program.cs dosyasının içerisinde metotlara bölerek modüler bir şekilde yazdık. Daha sonra bu ürünü başka birisi geliştirmek için aldı ve o da bir takım metotlar ekledi. En sonunda ürün doğru bir şekilde çalışıyor olsa bile ortaya spagetti kod çıkmış oldu. Bu projenin bakım maliyeti de artmış oldu çünkü 3. bir kişi geldiğinde belli bir kalıp yapı üzerinden ilerlenmediği için uyum sağlama süreci daha uzun olacaktır. Projemizi en başından OOP kullanarak yapmış olsaydık hem spagetti koddan kurtulmuş hem de bakım maliyetini azaltmış olacaktık. Bu işin biraz hikaye kısmı şimdi biraz daha konuya girerek daha yakından bakalım. 😊

Nesne Yönelimli Programlama

1960’larda OOP fikri öne atılmadan önce yordamsal programlama tekniği yaygın bir şekilde kullanılıyordu. Yordamsal programlamada, ana program içerisinde pek çok farklı metot bulunur ve hangi işlemin çalışacağı bu ana program karar verirdi. Yordamsal programlama avantajdan çok dezavantaj getiriyor. Çünkü kod tekrarının ve kod karmaşıklığının önüne geçilemiyor. Bu nedenle de ekip çalışmasında uygunsuzluk ve yüksek bakım maliyetine neden oluyor. Ayrıca programda erişime açılan verilerin korunamaması nedeniyle farklı kişilerin değiştirmesini istemediğimiz verilere de gerekli korumayı sağlayamıyoruz.

Nesne yönelimli programlamada biraz daha basit bir mantıkla yaklaşıyoruz. Örneğin bir fabrikada işçiler ve makineleri ayrı objeler olarak düşünelim. Fabrika bu işçi ve makine nesneleri aralarındaki ilişkiye göre kullanarak pek çok farklı ürün ortaya çıkarabilir. Nesne yönelimli programlama mantığı gerçek dünya ile oldukça uyumlu olduğu için çok daha kolay ve pratik bir şekilde kullanılabiliyor.

OOP’un avantajları kodun yeniden kullanılabilirliği, ölçeklenebilirlik ve verimliliği içerir. Bu avantajlar da yordamsal programlamanın getirdiği dezavantajlardan kurtulmamızı sağlıyor. OOP’a uygun bir proje tasarlarken uymamız gereken 4 temel kural bulunuyor. Ama kurallara geçmeden önce nesne (obje) nasıl kullanılmalı, nesnelerin (objelerin) özellikleri nelerdir kısaca bunlara bakalım.

Nesne Yönelimli Programlama : Nesne (Sınıf) Kullanımı

Nesne oluşturmak için sınıfları (class) birer şablon olarak kullanırız ve içerisinde o nesnenin özelliklerini barındırırız. Mesela bir çalışan nesnesi ihtiyacımız olsun. Çalışanın adı, soyadı, yaşı, maaşı gibi pek çok ortak özelliği bu çalışan nesnesinin içinde tutabilirim. Bu sayede 100 çalışanın bilgisini sadece Calisan[] dizisinde tutabilirim. Bu sayede her bir çalışan için kendine ait bir hafıza yeri ayırmış olduk. Projenin içerisindeki makine nesnesi ile çalışan nesnesi aslında birbiri ile iletişim halindedir. Çünkü fabrikanın devamlılığı için çalışanın makineleri kullanması gerekmektedir. Ancak ikisinin iletişime geçmesi için mutlaka tetikleyici bir şeyin olması gerekir. Mesela makineyi çalıştır metodunda çalışanın makineyi çalıştırmasını tetikleyebiliriz. Bir nesnenin birden çok özelliği olabileceği gibi birden çok eylemi de bulunabilir.

Bazı nesneler birbiri ile ortak özelliklere sahipse bir nesneden türeyebilirler. Örneğin öğrenci ve öğretmen nesnesini ele alalım. İkisi de ortak olarak ad, soyad, doğum tarihi gibi bilgilere sahipler. Bunun dışında öğrencinin ders notları öğretmenin de maaş bilgisi ayrı olarak tutulabilir. O zaman bu iki nesnenin ortak özelliklerini insan adında bir başka nesnede tutalım.

OOP Nesne Türemesi

Projede belirlenen nesnelerin ortak özelliklerini içeren bir nesne oluşturmak nesneler arasındaki iletişimi de sağlamamıza yardımcı olur. Nesneler birbirinden bağımsız olarak geliştirilebilir. Bu sayede program böl, parçala, fethet mantığı çerçevesinde çok kolay bir şekilde parçalanır ve her parça ayrı ayrı ele alınabilir. OOP mantığında gerçek dünya algılayışı temel alındığı için bu, anlaşılması çok daha kolay bir yapıdır.

Nesne Yönelimli Programlama Kuralları

OOP’un temel kurallarını

  • Kalıtım (Inheritance)
  • Soyutlama (Abstraction)
  • Kapsülleme (Encapsulation)
  • Çok biçimlilik (Polymorphism)

olarak sıralayabiliriz. Bu sıralamayı tamamen daha rahat anlatmak için yaptım. Bu maddeler arasında öncelik ilişkisi bulunmuyor. Adım adım bütün kurallara göz atalım.

Kalıtım (Inheritance)

Kalıtımdan aslında az önceki İnsan-Öğrenci-Öğretmen örneğinde bahsettim. Teorik olarak kalıtım bir nesnenin özelliğinin bir başka nesne tarafından da kullanılabilmesidir. Örneğimizde de öğrenci ve öğretmen nesneleri insan nesnesinden Ad, Soyad, Doğum Tarihi ve Cinsiyet özellikleriyle birlikte YemekYe() eylemini de miras olarak alıyor. Kalıtım bazı yerlerde miras alma olarak da karşınıza çıkabilir.

Soyutlama (Abstraction)

Soyutlama, iç mekanizmaları gizleyerek sadece işlevsel olan kısımları göstermeye denir. Örneğin ortak bir kuş nesnesi oluşturduk. Bu nesnenin içerisinde gagalıdır, uçar, kanatları var gibi özellikler var. Muhabbet kuşlarını ve şahinler de bu nesne içerisinden kalıtım alırlar. Ama en başta tanımladığımız ortak kuş nesnesi soyut bir kavramdır. Tüm ortak özellikleri üzerinde barındırı1r.

Kapsülleme (Encapsulation)

Bir nesnenin özelliklerinin dışarıdan kullanılmasını sınırlamak için kullanırız. Hangi özelliğin dışarıdan erişilebilir olacağına hangisinin erişilemez olacağına biz karar veririz. Örneğin insan nesnesi içerisinde boy ve kilo bilgileri başkalarını etkilemiyorsa gizli yapılabilir. Ancak isim soyisim gibi bilgiler her alanda açık olmalıdır.

Çok biçimlilik (Polymorphism)

Bir nesneden türeterek oluşturduğumuz nesneler (alt sınıflar) türettiğimiz nesnenin (üst sınıfların) gösterdiği davranışların aynısını göstermek zorunda değildir. Alt sınıf davranışa farklı bir şekilde cevap verebilir. Örneğin taşıt nesnemiz olsun ve içerisinde HareketEt metodu bulunsun. Gemi ve Araba nesnelerini de Taşıt nesnesinden türeterek oluşturuyoruz. Ancak Gemi nesnesi hareket etme davranışını su üzerinde hareket ederek, araba ise kara üzerinde hareket ederek gerçekleştiriyor.

Teorik olarak OOP kurallarını elimden geldiğince açıklamaya çalıştım. Nesneye yönelik programlama yaparken özellikle bu kurallara dikkat ederek bir proje yaparsak, çok daha temiz ve düzenli bir şekilde yazılmış koda sahip oluruz. Bir sonraki yazımda C# içerisinde OOP kurallarının örnek olarak kullanımını göstereceğim. O zamana kadar kendinize çok iyi bakın. 😊