Nesne Yönelimli Programlama Yaklaşımı herhangi bir programlama dili üzerinde geliştiricilik yaparken soruna yaklaşımımızdan ziyade çözüme yaklaşımımızı temsil eder. Çözümümüzü nasıl var edeceğimiz konusunda bize bir mimari kurabilmek amaçlı bir yaklaşım sunar. Ne demek istediğimizi ve bu yaklaşımın varlığını daha detaylı açıklayabilmek adına bebek adımlarıyla ilerlemekte fayda var.
Programlama dili, çözüm üretilmesi talep olunan bir ürünün, bilgisayarın okuyabileceği ve çözümleyebileceği şekilde geliştiricinin hayal gücüne ve bilgisine kalmış şekilde çözülebilmesine imkan veren araçtır. Bu araç bilgisayar ve çözümümüzü harmanlayabilmek adına kullanılır, çözümümüzü dijitalleştirme anahtarıdır denilebilir. Bu anahtarla bilgisayarın belirli görevleri yerine getirmesi amacıyla onu yönetebilir ve talep olunan işleme keyfimize göre çözümler getirtebiliriz. Yani bir nevi bilgisayarımızla dijital bağlamda konuşabilir ve bir sorun üzerine bir ortak gibi çalışabiliriz. Bu programlama dilleriyle talep edilen bir sorun belirli bir süre zarfında çözülebilir hale gelecektir. Bu sorun genellikle birtakım işleri kolaylaştıran, yerine göre çeşitli otomasyonlar sağlayan bir program çözümünü gerektirir. Program nedir diye sorulursa eğer de, talep edilen iş doğrultusunda bilgisayara gönderdiğimiz bir dizi komutları içerisinde barındıran bir çözümlemesi ya da amacı olan geliştirici tasarımlarıdır. Bu tasarımların eli kolu programlama dilleridir ve bu programlama dilleri de adeta birer iletişim anahtarıdır, böylece geliştiricisiyle dijital ortam arasında köprü kurulabilmiş olacaktır. Bu tasarımların belirli bir amaca yönelik sistematik geliştirilme işine de yazılım adı verilmekte ve bu yazılımlar işi belirli bir mühendislik çerçevesine sokup formulize etmektedir. Arkaplan temaları ve terminolojisi hakkında gerekli olduğunu düşündüğüm birtakım bilgileri önden vermenin faydalı olacağına inanarak yazıya çeşitli noktalara yoğunlaşarak başladım.
Nesne Yönetlimli Programlama Nedir? Neden Nesne Yönelimli Programlamaya Gerek Var?
Şimdi gelelim aklımızdaki soruya, nedir yahu bu nesne yönelimli programlama dediğinizi duyar gibiyim. 🔊
Nesne yönelimli programlama yaklaşımında sorunu objeler üzerinden yorumlamalı ve bu yorumlama doğrultusunda çözüm aramalısınız. Bu objelerle alakalı bilgi vermek için de kullanım yapılarının özelliklerini içerisinde barındıran temsili yapılardır denilebilir. Bu temsili yapıları yorumlayarak getirilen bu yaklaşımın varlığı çok kritiktir. Öyle ki yazılım dünyasının tekdüze düşünceden sıyrılması bu yaklaşımın ortaya çıkışıyla başlamıştır. Örneğin nesnelerin temelinde programlama yaklaşımıyla daha öncesinde defalarca kez verimsiz, tekrarlı ve takip edilmesi neredeyse imkansız mimariler yerini başkalarına bırakmıştır. Bu başkaları, okunabilir yani böylece birlikte çalışabilmeye müsait, tekrar kullanılmaya müsait, geliştirilebilir, kontrol edilebilir ve kolayca sonrasında sürdürülebilir yapılardır. Yazılım dünyasının neredeyse kalıcı temellerinin atılmaya başlandığı geç 1960 larda çıkan bu teknik yazılım dünyasında o zamanda adeta bir devrim yaratmıştır. Nesne yönelimi 4 bacaklı bir iskelet üzerinde şekillendirilebilir. Bu bacaklar, Encapsulation, Inheritance, Polymorphism ve Abstraction bacaklarıdır. Bu Abstraction yani soyutlama sınıf tanımlarında yalnızca gerekli özelliklerin üzerine odaklanılıp buradan belirli yapılar elde etme işidir. Ana amacı gereksiz karmaşıklığı elimine etmek böylece gereksiz detaylardan kullanıcıyı kurtarmaktır. Örneğin çok meşhur olan kahve makinesi örneğini verelim. Kahve makinesinin kendi içerisindeki işlemlerinin varlığı, girdileri bir ürüne dönüştürme süreci ve bu süreçteki kararlarının listesi yalnızca kahve içmek isteyen bir insan için oldukça gereksiz detaylardır. Sonuç odaklı düşünen bir kahve sever sadece kahveyle ilgileneceğinden ☕ onun için gerekli soyutlama işlemlerinin yapılması gayet kritik önem taşımaktadır. Yani kullanıcıya sunacağın basit bir arayüz ve o kahve makinesinin talep edilen kahveyi üretmesi sonucu dışındakilerin pek kıymeti yoktur.
Biraz da encapsulation üzerinde durmakta fayda var. Soyutlamada dışarıdan sonuç odaklı bakılan bir işlem için gereksiz detayların gizlenmesi demiştik. Kapsüle alma yani encapsulation işleminde ise bunu içten süreci yorumlama işlemi üzerinden gereksiz detayları elimine ederek kritik işlemi korumaya almak diyebiliriz. Yani şöyle ki belirli erişim atamalarıyla verilerin erişilebilirlikleri üzerinden ana işlem korumalı hale getirilecektir. Bunu kalemin iç aksamını yerine göre korumak amaçlı onu bir plastik dış gövde içerisine alma işlemi olarak görebiliriz. Böylece veriler ya gizlenir ya erişime açılır ve kullanım üzerinden şekillendirilir.
Sonraki odak noktamız ise Inheritance dır. Inheritance kelime kökeni olarak inherit etme yani atadan elde etme/miras alma anlamına gelir. Mevcut bir nesne üzerinden düşünürsek eğer diğer bir nesneye verilerin aktarılması ile alakalı olduğunu söyleyebiliriz. Mirasın alındığı sınıf Super sınıf olarak adlandırılır, alan ise mirasçı/ara sınıf olarak adlandırılmaktadır. Tekrar kullanım özelliğini ana amaç olarak düşünen Inheritance da tekrar kullanımların varlığıyla birlikte verimliliğin arttırıldığını kolaylıkla söyleyebiliriz. Extends yapısıyla inherit işlemi tanımlanır, ara class yani child class ana yapıdan yani süper class dan gerekli mirasını böylece alır.
Son bacak olan Polymorphism üzerinde de durup bu kısmı bitirelim. Polymorphism, süper class üzerinden miras alınmış birtakım özelliklerin child class üzerinde değişen talebe bağlı olarak değiştirilmesi özelliğine denir. Neden böyle bir şeye ihtiyaç olunsun yahu zaten ihtiyaç o değilse neden miras alınıyor dediğinizi duyar gibiyim. Örneklemekten zarar gelmez öyle değil mi? 🤔
Kuş süper class ını ele alalım. Farklı farklı kuş türleri ve bunun sonucunda farklı farklı kuş özellikleri mevcut. Karga ile saka kuşunu örnek alalım. İki kuş da miras edilen şekliyle birtakım sesler çıkarmakta. Ancak saka kuşunun sesi kulaklarımızda hoş bir seda bırakırken karganın sesi öyle mi? 😂
Saka kuşu miras edilen şekliyle değil çok daha hoş şekilde ve farklı özelliklere sahip olarak ötmekte yani o özellikler Saka kuşu için override edilmiş diyebiliriz. Bu yaklaşımı bize sağlayan Polymorphism özelliğidir.
Nesne yönelimli programlama ile;
Sınıf içesinde çoğu problemin çözümü belirli bir sınıf içerisinde yapılabilir. Bir sınıf içerisindeki paylaşımlı kullanılan nesnelerde(başka sınıflarda da çağırılarak kullanılan) yalnızca ana sınıfı üzerindeki değişim tüm yapının editlenmesi adına yeterli olacaktır. Çeşitli güvenli yapı prensipleri oluşturulmuştur örneğin kuş sınıfı ana canlı sınıfından türetilmiştir ancak sürüngen sınıfına erişimi yoktur ve verileri hakkında bilgi sahibi olunamaz. Nesne yönelimli yaklaşımın belki de en önemli avantajı tekrarlı kodları engellemesi denilebilir, oluşturulan nesneler birçok yerde kullanılabilir, ya da oluşturulan bu nesnelerin sınıfları çağırılabilir böylece kod tekrarından kaçınılmış olur.
Ancak potansiyel dezavantaj oluşturabileceği noktalardan da az da olsa bahsedelim. Karmaşıklık seviyesi nesne yönelimli programlama kullanımına elverişli olmayan projelerde kullanımıyla birlikte karmaşıklık seviyesi arttırılmış olabilir. Ayrıca nesne yönelimli düşünme yaklaşımı algoritma bazlı düşünüp çözüme kafa yormanın önüne geçeilir böyle durumlarda algoritmik olarak daha zayıf çözümlerin varlığına neden olabilir.