Nesne Tabanlı Programlama Yaklaşımı

Yok o anlamda değil. Demek istediğim şu: orneklerde hep araba vb. ornekler veriliyor ve bir taslaktan yeni araç nesneleri oluşturuluyor. Ama matematik sınıfından nasil bir nesne olusturcaksin? O yüzden nesne tabanli programlamayi anlayamadım. Ben hep araba ornegindeki gibi düşünüyorum. Bir plan vardi ve nesne urettin. Ya diğer yapılarda? Diger sınıflarda? Mesela dosya okuma ilgili sınıflar, ayni sey burada da geçerli. Yine arasındaki ilişkiyi anlamadim, bu sınıflarda nesnein ne isi var?
Güzel örnek bence de. Matematik sınıfından nesne üretmeye gerek yok. Hatta en güzel örnek bu olabilir çünkü matematik tanımı gereği fonksiyonel bir şey. Yani her durumda aynı sonucu veren bir şey. -5'in mutlak değeri her zaman 5'tir. Duruma göre bu değişmez. Bu nedenle matematik kütüphaneleri OOP olarak değil fonksiyonel olarak yazılır.

Çoğu nesneye yönelik programlama dillerinde de genellikle matematik sınıfları statik olarak yazılır. Yani bunları nesne üretmeden doğrudan kullanırsınız. Bu yöntem zaten fonksiyonel programlamayı, nesneye yönelik programlama ile harmanlamanın en basit yoludur.


Gördüğünüz gibi public static class Math olarak statik bir şekilde kullanılmış. Matematik işlemi yaparken Math.Abs(-5) gibi diye doğrudan kullanırsınız. Kullanmadan önce Math sınıfdan nesne üretmenize gerek kalmaz. Çünkü matematikte her koşulda -5 in mutlak değeri 5'tir. Matematik işlemlerinde farklı nesneler üretip bunlara farklı değerler atayıp bu işlemin sonucunu değiştiremezsiniz. Matematiksel olarak bu yanlış olur. Bir fonksiyon "sadece" parametrelerine göre sonuç veriyorsa buna fonksiyon diyoruz. Yani matematik tanımı gereği fonksiyoneldir. Nesneler ise tam olarak bu fonksiyonelliğin olmadığı yani "duruma göre" metodların farklı sonuçlar ürettiği durumlarda kullanılır.

En klasik örnek herhalde derslerde gösterilen Öğrenci sınıfıdır. ad, soyad diye alanların olduğu ve Yaz() diye methodu olan bir sınıfta. Yaz() fonksiyonu ad, soyad değerleri farklı olan ogrenci1 için farklı sonuç ogrenci2 için farklı sonuç verir. Yani nesnenin durumuna göre, içindeki değişkenlerin değerine göre sonuç değişir. Bu nesneye yönelik programlamanın en temel özelliğidir. Nesnelerin kendilerine ait "durum"ları vardır ve buna göre sonuç üretiler. Matematikte bu yoktur. Bir fonksiyon verilen değerlere göre her zaman aynı değeri verir.

Burada kafa karışıklığına sebep olan şey aslında şu. %100 nesneye yönelik programlama yapılmıyor hemen hemen hiçbir dilde. Java mesela C#'a göre çok daha fazla nesne dayatması yapıyor. Her şey nesne olsun istiyor fakat onda bile doğal olarak matematik kütüphanesindeki metodlar statik olarak tanımlanmış. Yani OOP değil, fonksiyonel tasarlanmış. Nesne üretmeden bu fonksiyonları kullanabiliyorsunuz.


Bir de şunu söyleyeyim. Nesneye yönelik programlama bizde neredeyse programlamanın en temel şeyi mutlaka öğrenilmesi uygulanması gereken kurallar bütünü gibi anlatıyor. Ben buna katılmıyorum zaten nesneye yönelik programlama da bize bir işi nasıl yapmamız gerektiğini net bir şekilde anlatmıyor. Temel blokları ortaya koyup yine her şeyi bize bırakıyor. Nasıl kullanacağız bunları diye sorduğumuzda karşımıza tasarım desenleri diye bir şey koyuyor. Bu bile paradigmanın eksikliğini gösteriyor. Bunun dışında saf nesneye yönelik programlamada statik sınıf fonksiyon alan vs. olmamalı ama bugün OOP olduğu iddia eden dillerde bu var. Bu bile paradigmanın sorunlu olduğunu gösteriyor. GoLang mesela OOP değil çok daha esnek bir dil. Yani OOP tek yol değil. Bir mimari tercihi. Pratikte C++ ile yapıp C ile de yapamayacağınız hiçbir şey yok. OOP büyük proje geliştirirken ortak dil kullanmak için neyin nasıl yapılacağını belirlemek için ortaya konan bir şey fakat bunu ne kadar başarılı yapıyor tartışılır. Bence iddialarının doğru olmasından daha çok tarihi sebeplerle hakimiyetini koruyor. Bugünkü bilgi birikimimizle sıfırdan tüm bilgisayar sistemlerini güncelleyecek gücümüz olsa OOP temelli bir mantıkla yapmazdık bunu. Fonksiyonel ve interface bazlı şekilde yapmaya çalışırdık.
 
Son düzenleme:
Güzel örnek bence de. Matematik sınıfından nesne üretmeye gerek yok. Hatta en güzel örnek bu olabilir çünkü matematik tanımı gereği fonksiyonel bir şey. Yani her durumda aynı sonucu veren bir şey. -5'in mutlak değeri her zaman 5'tir. Duruma göre bu değişmez. Bu nedenle matematik kütüphaneleri OOP olarak değil fonksiyonel olarak yazılır.

Çoğu nesneye yönelik programlama dillerinde de genellikle matematik sınıfları statik olarak yazılır. Yani bunları nesne üretmeden doğrudan kullanırsınız. Bu yöntem zaten fonksiyonel programlamayı, nesneye yönelik programlama ile harmanlamanın en basit yoludur.


Gördüğünüz gibi public static class Math olarak statik bir şekilde kullanılmış. Matematik işlemi yaparken Math.Abs(-5) gibi diye doğrudan kullanırsınız. Kullanmadan önce Math sınıfdan nesne üretmenize gerek kalmaz. Çünkü matematikte her koşulda -5 in mutlak değeri 5'tir. Matematik işlemlerinde farklı nesneler üretip bunlara farklı değerler atayıp bu işlemin sonucunu değiştiremezsiniz. Matematiksel olarak bu yanlış olur. Bir fonksiyon "sadece" parametrelerine göre sonuç veriyorsa buna fonksiyon diyoruz. Yani matematik tanımı gereği fonksiyoneldir. Nesneler ise tam olarak bu fonksiyonelliğin olmadığı yani "duruma göre" metodların farklı sonuçlar ürettiği durumlarda kullanılır.

En klasik örnek herhalde derslerde gösterilen Öğrenci sınıfıdır. ad, soyad diye alanların olduğu ve Yaz() diye methodu olan bir sınıfta. Yaz() fonksiyonu ad, soyad değerleri farklı olan ogrenci1 için farklı sonuç ogrenci2 için farklı sonuç verir. Yani nesnenin durumuna göre, içindeki değişkenlerin değerine göre sonuç değişir. Bu nesneye yönelik programlamanın en temel özelliğidir. Nesnelerin kendilerine ait "durum"ları vardır ve buna göre sonuç üretiler. Matematikte bu yoktur. Bir fonksiyon verilen değerlere göre her zaman aynı değeri verir.

Burada kafa karışıklığına sebep olan şey aslında şu. %100 nesneye yönelik programlama yapılmıyor hemen hemen hiçbir dilde. Java mesela C#'a göre çok daha fazla nesne dayatması yapıyor. Her şey nesne olsun istiyor fakat onda bile doğal olarak matematik kütüphanesindeki metodlar statik olarak tanımlanmış. Yani OOP değil, fonksiyonel tasarlanmış. Nesne üretmeden bu fonksiyonları kullanabiliyorsunuz.


Bir de şunu söyleyeyim. Nesneye yönelik programlama bizde neredeyse programlamanın en temel şeyi mutlaka öğrenilmesi uygulanması gereken kurallar bütünü gibi anlatıyor. Ben buna katılmıyorum zaten nesneye yönelik programlama da bize bir işi nasıl yapmamız gerektiğini net bir şekilde anlatmıyor. Temel blokları ortaya koyup yine her şeyi bize bırakıyor. Nasıl kullanacağız bunları diye sorduğumuzda karşımıza tasarım desenleri diye bir şey koyuyor. Bu bile paradigmanın eksikliğini gösteriyor. Bunun dışında saf nesneye yönelik programlamada statik sınıf fonksiyon alan vs. olmamalı ama bugün OOP olduğu iddia eden dillerde bu var. Bu bile paradigmanın sorunlu olduğunu gösteriyor. GoLang mesela OOP değil çok daha esnek bir dil. Yani OOP tek yol değil. Bir mimari tercihi. Pratikte C++ ile yapıp C ile de yapamayacağınız hiçbir şey yok. OOP büyük proje geliştirirken ortak dil kullanmak için neyin nasıl yapılacağını belirlemek için ortaya konan bir şey fakat bunu ne kadar başarılı yapıyor tartışılır. Bence iddialarının doğru olmasından daha çok tarihi sebeplerle hakimiyetini koruyor. Bugünkü bilgi birikimimizle sıfırdan tüm bilgisayar sistemlerini güncelleyecek gücümüz olsa OOP temelli bir mantıkla yapmazdık bunu. Fonksiyonel ve interface bazlı şekilde yapmaya çalışırdık.
Çok teşekkür ederim, artık kafamdaki soruların cevaplarını aldığımı düşünüyorum. Çünkü ben hep nesne tabanlı dilleri tamamen nesne üzerine kurulu olarak düşünürdüm, yani bana sınıf denildiğinde sadece nesne ile ilgili işlemler yapılabileceği aklıma gelirdi. Bu yüzden de bir türlü anlayamamıştım. Yani bu yüzden diğer işlemleri nasıl yapacaklar ki sorusu aklima gelirdi. Tekrardan teşekkür ederim.
 
Çok teşekkür ederim, artık kafamdaki soruların cevaplarını aldığımı düşünüyorum. Çünkü ben hep nesne tabanlı dilleri tamamen nesne üzerine kurulu olarak düşünürdüm, yani bana sınıf denildiğinde sadece nesne ile ilgili işlemler yapılabileceği aklıma gelirdi. Bu yüzden de bir türlü anlayamamıştım. Yani bu yüzden diğer işlemleri nasıl yapacaklar ki sorusu aklima gelirdi. Tekrardan teşekkür ederim.
Rica ederim biraz faydası olduysa ne mutlu :D. OOP çok kapsamlı bir konu. Yazdıklarımı gözden geçirince gereksiz detaylara girip daha da konuyu karıştırdım mı diye korkmuştum. Aklınızdakileri netleştirmesine sevindim.
 
Merhaba, nesne tabanli programlama bizim dünyamıza ait şeylerin soyutlama ile (abstraction) dijital ortama aktarmamiza yarıyorsa:
Örneğin Java'da Scanner sınıfı var. Bu sınıf dış dünyadan alınan ve soyutlastirilan bir birim degil. O zaman bu tanım eksik mi oluyor?

Aslında, programlama dilleri işlemciyi istenen şekilde kullanabilmek için üretilmiş yazılımlardır (kod üreteçleridir) ve bu bağlamda nesneye dayalı programlama yönteminde birkaç temel amaca yoğunlaşılır, bunlar: platform bağımsızlık ve veri paylaşımlı ortam.

Platform bağımsızlığın görevi nesneye dayalı programlama yöntemi ile üretilen yazılımın uygun ortam sağlandığında her donanım üzerinde (yani donanımdan soyutlanarak) aynı şekilde işletilmesidir.

Veri paylaşımlı ortam ise altında veri tanımlaması yaptığın -veya yapmadığın- her yapının birbirinden haberdar olmasını ve birbiri ile veri takası ve paylaşımı yapabilmesini sağlar ve bu sayede yazılım daha dinamik, parametrik ve ön görülemez olur.

Yani kullandığın şey eninde sonunda bir kod üreteci; bir çeviricidir ve bunlara farklı anlamlar yüklemeye çalışmak veyahut tüm konuyu adı ile tanımlamaya çalışmak, konuyu anlamamana veya konudan uzaklaşmana sebep olabilir.
 
Son düzenleme:

Yeni konular

Geri
Yukarı