Merhaba Arkadaslar,
Bu makalemizde Object Oriented Programming (OOP) nedir? Nasil kullanilir? Nerelerde kullanilir? Derinlemesine inceleyecegiz...
Öncelikle sunu belirtmekte fayda var, Object Oriented Programming bir programlama dili degildir! Belli kurallar ve kaliplar dahilinde, tekrarsiz ve anlasilabilir kod yazmamiza olanak saglayan bir yapidir. Bu yapiya ait n tane metodoloji ve notasyon vardir. Object Oriented Programming'in bize sagladigi en büyük kolayliklardan biri de Clean Code(Temiz Kod) yazmak. Spaghetti kod yaziliyordu çook öncelerden, tabii OOP yoktu. Kod tekrarlari, anlasilamaz bir sürü kod satiri, anti pattern yapilar. Bir yazilimcinin istemeyecegi hersey mevcuttu yani. Object Oriented Programming'ten sonra spaghetti code tarihe karisti diyebiliriz.
Düsünebiliyor musunuz ayni methodu ayni fonksiyonu defalarca kez yaziyorsunuz. Bir yazilimci için çok ama çok sikici! Çünkü yazilimci sürekli yeni teknoloji arayisinda, ögrenmeye ve kendini gelistirmeye açik bir insandir.
Gelelim Object Oriented Programming'in tarihine...
1960'li yillarin sonlarina dogru programlama dünyasina dahil oldugunu bilinmektedir. Kod karmasikliklari ve tekrarli kodlar yazilimcilari bunalima soktu desek pekte yanlis olmaz. Öyle ki Object Oriented Programlama, yasanilan problemlere çözüm olarak ortaya çikti. Öncüsü Alan Curtis Kay, Amerikan bir Bilgisayar Bilimcisidir. Yasanilan kod karmasikliklarina öneri olarak bir metodolooji hazirlar ve hazirladigi metodolojinin içerisinde, programlamanin soyutlugunun, gerçek dünya modellemesinden uzak oldugunu, herhangi bir nesne,obje olmadan kod yazmanin karmasikligini belirtir. Çözüm arayisi baslar ve ortaya Object Oriented Programming fikri çikar...
Tam olarak bu nokta, dünya yazilim tarihi için çok önemli bir devrimdir.Çünkü prosedürel programlamadan fonksiyonel programlamaya geçis, o zamanin sartlarinda (C#,Java,Swift,Kotlin vs. programlama dilleri henüz düsünce asamasinda bile degil :) ) bunu aktarmak, anlatmak epeyce zor olacakti.
Ama Object Oriented Programming tamami ile kullanilmaya baslandiktan sonra, mevcut programlama dilleri OOP'a destek verdigi gibi, yeni çikan programlama dillerinin büyük bir çogunlugu da OOP destekli olacakti. (C#,Java,Ruby,Phyton,Swift,Kotlin vs.)
OOP, az önce de belirttigim gibi hiyerarsik bir yapida, nesne-obje mantigi ile temiz kod yazmamizi, çesitli patternleri uygulamamiza implement etmemizi saglayan bir metodoloji.
Object Oriented Programming (Nesne Yönelimli Programlama) Hangi Programlama Dilleri ile Kullanilir?
Cobol,C++,C#, Java, Swift, Kotlin,Cold Fusion,Ruby,F#, Visual Basic,J#,Delphi,Pascal,Objective C,Scala,R,PHP,Phyton hatta Ecma Script ailesine ait Action Script,Java Script, JScript ve hatta TypeScript, Coffee Script vs.
Object Oriented Programming, proje içerisindeki yapilacak bütün is-eylemlerin nesne düzeyinde belirlenmesini saglar. Mesela C#'ta Console uygulamasi baslattiginizda class Program diye bir kod blogu görürsünüz, yazdiginiz tüm kodlari onun içine yazarsiniz. Aslinda böyle bir zorunluluk yok ama ilk basta OOP, class kavrami vs bilmiyorsaniz mecburen o blogun içerisinde yazmak zorunda kaliyorsunuz.
Aslinda farkli siniflar tanimlayip, içerisine yapacagi is ve eylemleri belirlesek, yazdigimiz kodlar çok daha açiklayici olmaz mi? Bir ögrenci takip uygulamasi gelistiriyorsak ögrenciler için farkli sinif, muhasebe için farkli sinif, ögretmenler için, kurum için vs. tüm detaylar için farkli siniflar olusturup gerekirse bu siniflarin içerisinde sanal methodlar olusturup farkli siniflara miras veremez miyiz? Bir methodu bir kere yazip n tane class'ta kullanmis olmaz miyiz?
Object Oriented Programming ile tanistigimiz yeni kavramlar olacak,Abstraction, Interface, Struct, Sealed vs. gibi. Ancak bunlarin içinde belki de en önemlisi Abstraction(Soyutlama).
Grafik,çizim,tasarim gibi islerle ugrasan arkadaslar prototip kavramini bilirler. Bir nesnenin örnek verebilecegi bir türevdir. (Tabii genel terminoloji, semantik gibi konulara uzun uzun deginmek gerekir ama konumuz bu olmadigi için deginmiyorum, ama bilmiyorsaniz arastirmanizi tavsiye ederim.)
Object Oriented Programming'in belli basli 3 farkli kullanimi vardir; (Çok daha fazla, lakin en çok kullanilan)
1) Encapsulation (Kapsülleme)
Gelen veriyi istedigimiz sartlarda set edebilme(setter) ve sonrasinda get edebilme(getter(return)). Dolayisi ile, tek bir degiskeni 2 farkli method fonksiyon ile kontrol edebiliyoruz. Her ikisini de kullanmamiz zorunlu degil.
2) Inheritance (Miras-Kalitim)
Az önce belirttigim, olusturulan prototip'in kendinden türeyen diger nesnelere aktarilma durumu. Bir nesnenin istenilen özelliklerini, farkli bir nesneye aktarma olarak nitelendirebiliriz.
3) Polymorphism[Polimorfizm] (Çok Biçimlilik)
Polymorphism, bir nesnenin digerinden almis oldugu is-eylemlerin (method,fonksiyon,degisken,property vs.) farkli sekillerde kullanilmasi durumudur. Buna polimorfik davranis ta denebilir. Örnegin Hesapla isminde bir fonksiyonumuz var ve bu virtual(sanal) ya da abstract(soyut) bir fonksiyon. Istedigimiz sey, bu fonksiyonun gövdesi olmayacak ve miras verdigi her sinifta gövdesi farkli farkli doldurulabilecek. Kafaniz biraz karismis olabilir, hemen söyle özetleyeyim, A isimli sinifimizda virtual Hesapla isimli bir fonksiyon tanimladik, B sinifina A sinifini miras aldik ve Hesapla methodunu override ettik. Islem tam olarak bu.
Bu 3 tanimdan sonra belirtmek istedigim çok önemli bir konu daha var;
Access Modifiers (Erisim Belirleyiciler)
Bir çok programlama dilinde 3 farkli erisim belirleyici vardir.
- Public(Yeni bir örnegi alinabilir, miras verebilir.)
- Private(Yeni bir örnegi alinamaz, miras veremez.)
- Protected(Yeni bir örnegi alinamaz, yalnizca miras verebilir.)
Tabii bu konuyu çok daha uzun ele almak lazim, ilgili makaleyi en kisa sürede yazacagim.
Bu kadar anlattiktan sonra sembolik bir örnek verelim;
Bir araba fabrikasi düsünelim.Belki de günde 100'lerce 1000'lerce yeni araba üretiliyor. Üretim sürecini düsünürsek;
Her üretilen araba için mühendisler,tasarimcilar vs. oturup sifirdan planlama,hesaplama,modelleme vs. yapmaz. Bu islemler bir kez yapilir arabanin prototipi olusturulur(Nesne) ve bu prototipten yeni örnekleri türetilir(Inheritance(Miras-Kalitim)), ayni modelin içerisinde paket özelligi farklari olacagini da düsünürsek (Sunroof,elektrikli ayna, otomatik vites vs.) bazi modellerin içerigi de farkli olacak tabii ki, bu durum da tam olarak bize çok biçimliligin oldugunu gösteriyor.(Polymorphism(Çok biçimlilik)).
Bir örnek daha vereyim;
Okulda ders saatinde, müdür nöbetçiyi ögrenciye der ki git bana 12/A sinifindan Ahmet Mehmet'i çagir.
Nöbetçi ögrenci öncelikle sinifa gider. (12/A). sonrasinda ögrenciyi (Ahmet Mehmet'i) çagirir.
Sinif=> Class
Ögrenci=> Method/Fonksiyon vs.
12/A sinifindaki hersey o sinifa ait birer üyedir. Ögretmen, ögrenciler, masalar,sandalyeler,tahta, cam, pencere her ne varsa. Ve onlardan herhangi birine ulasmak için öncelikle 12/A sinifina basvurmak gerekir. Bu da bize tam olarak Object Oriented Programming'in çalisma mantigini açiklar: Nesne Yönelimli Programlama!
Bir makalemizin daha sonuna gelirken, makalenin basinda hazirladigim kahveden son yudumu da almis bulunuyorum efendim
Akliniza takilan bir sey olursa yorum yazmaniz yeterli, kod'la kalin...