ile

Hiç Bilmeyenler İçin Nesne Yönelimli Programlamaya Giriş

Uyarı: Bu serideki kod örnekleri ve yazılar, seri tamamlanana kadar değişebilmektedir.

Nesne Yönelimli Programlama’yı duydunuz. Kendinizi geliştirmek için öğrenmek zorunda olduğunuzu öğrendiniz. Ancak nereden başlamak gerektiğini bilmiyorsunuz. Bi kaç kitap açtınız, kafanız karıştı, kitabı yatağın üzerine fırlattınız ve spagetti kod yazmaya, müşterinize böyle uygulamalar sunmaya devam ettiniz. İçten içe bir suçluluk duyuyorsunuz ama yapacak birşey yok deyip hayatınıza devam ettiniz. Artık buna bir dur demenin zamanı geldi.


Bildiğiniz gibi ben kuru kuruya kavramları anlatmayı sevmiyorum. İnternetten bulduğu slayttan ders anlatan hocalar gibi ezberden kavram sıralamayı doğru bulmuyorum. Piyasada çok güzel kaynaklar, detaylı kapsamlı kullanım klavuzları var ama ben kavramları anlatmak için Hayvan sınıfı, Memeliler sınıfı, At sınıfı ve Eşşek sınıfı gibi hayatınızda hiçbir yazacağınız programda olmayacak kavramları da kullanmayı sevmiyorum. Detaylı kaynakları konunun mantığını kavradıktan sonra satın alıp, gerçek, profesyonel uygulamalar geliştirirken açıp bakarsınız. Mesela Rıza Hoca’nın A-dan Z-ye PHP kitabı vardır. Tavsiye ederim. Ama konuyu hiç bilmiyorsanız, kendinizi bana bırakacak, önce minik adımlarla, masal dinler gibi beni dinleyeceksiniz.


Neden nesne yönelimli programlama öğreneyim ki?

  1. Çünkü bir sonraki aşamaya, yani düzenli, temiz, dünyadaki standartlara uygun, tekrar kullanılabilir, kodu açtığımızda profesyonel birine göstermeye utanmayacağımız kodlar yazmak istiyoruz.
  2. Bizden sonra spagetti karman çorman kodumuz üzerinde çalışacak gariban yazılımcının edeceği küfürler yüzünden kulaklarımızın çınlamasını istemiyoruz. Kodumuz okunabilir oluyor. Karmaşa azalıyor.
  3. Minik minik, kendi projelerimize ait kütüphane oluşturup, yeni projelerde bunları modüler olarak kullanabilmek istiyoruz. Tıpkı Lego gibi. Kodumuz yeniden kullanılabilir oluyor.
  4. Ben zamanında spagetti kod yazarken, kendi kodumu okuyamadığım oluyordu, sonra kendime küfrediyordum, bunun da olmasını istemiyoruz.
  5. Nesne yönelimli programlamanın temel kavramlarını öğrendiğimiz zaman, diğer nesne yönelimli programlama dillerini kolayca kavrayabiliyoruz ve o dilleri kolayca öğrenebiliyoruz.
  6. İyi okunabilen kodlarda, karmaşa daha az olduğu için, hataları yakalamak daha kolay oluyor.
  7. Test edilebilen kodlar yazabiliyoruz. Bu sayede daha sonra ortaya çıkabilecek hataları önceden yakalayabiliyoruz.

Nesne yönelimli programlama öğrenmek istiyorum. Peki nereden başlamalıyım?

Hiç kod yazmaya girmeden önce kavramları, yani konunun mantığını anlamamız gerekiyor. “Nedir bu nesne kavramı? Ne işe yaradığını az çok anlattık ama tam olarak nedir? Hocam, gerçek hayatta bu ne işime yarayacak?” diye lisede, zavallı öğretmenlerimize ergen kafasıyla ukala ukala sorduğumuz soruların cevabını önce kendimiz verebilecek hale gelmemiz gerekiyor. Yani nesne yönelimli programlayı öğrenmek ve anlamak biraz da bilinç meselesi. Bilinçli, yani ne yaptığımızın farkında olarak çalıştığımızda, üreteceğimiz eserlerin iyi veya kötü, kaliteli veya kalitesiz olup olmadığını kendimiz bilirsek, o zaman kendimize güvenimiz de, başkalarının da bize olan güveni de otomatik olarak artıyor.

Peki nedir bu Allahın belası Nesne kavramı?

Aristo abimiz. Yakışıklıymış da.

Kitabı yazmaya başlarken, nesne kavramını çok iyi anladığını sanan ben, konuyu araştırmaya başladığımda olayın yazdığımız salak programları “class” bloklarının içine sokmaktan daha derin olduğunu gördüm. Programlama konusunun temeline indiğimde orada matematikle karşılaştım. Matematiği anlamaya çalıştığımda, aslında çabalarımızın felsefeden başka bir şey olmadığını gördüm. Yani, uğraştığımız şey, dünyadaki olayları anlamak, bunun bir şekilde yorumlamak ve elle tutulur bir değişim yaratacak bir sonuca ulaşma çabası göstermekten ibaret. Yazacağımız programlar, yaptığımız işler görülebilir bir değişiklik yaratmak üzerine. Tam da bu noktada programlamadan çıkıp gerçek hayata geçiyoruz ve anlıyoruz ki nesne dediğimiz varlık sadece basit bir programlama kavramı değil.

Nasıl yani?

Yanisi şöyle. Nesne kavramının, dilbilimde (hani özne-nesne, tümleç, yüklem falan var ya.), fizikte (belirli bir yükseklikten, belirli hızda düşen, kütlesi olan nesne), psikolojide (algıladığımız nesneler) yeri var. Biz bilgisayarlarla ilgili olduğumuzdan, bilgisayarlar da düşünen elektronik beyinler olduğundan kavramın düşünce ile ilgili olan tanımına bakalım.

nesne İng. object

(Lat. objectum = karşıda bulunan, karşıya konan) : 1. (Genellikle) Karşımızda bulunan şey. 2. Öznenin bağlılaşık kavramı olarak, özne ediminin, bilincin kendisine yöneldiği şey: a. Kendisine yönelinen, düşünülen, tasarlanan nesne, kendisine yönelen bir edim olmadan var olmayan şey; bilinçte, düşünme nesnesi (konu) olarak düşünme olayının karşısında bulunan şey; düşüncel (ideal) nesne. b. Özne ediminden, bilinçten, bağımsız olan gerçek (real) nesne; gerçeklik olarak, dışdünyanın bir parçası olarak bilincin karşısında duran şey.

BSTS / Felsefe Terimleri Sözlüğü 1975

Şey diye bitirmiş. Peki şey nedir? Ona da bakalım.

şey İng. thing

(Günlük dilde) Herhangi bir düşünce konusunu göstermeğe yarayan belirsiz terim. (Felsefede) 1. Düşünen bilincin konusu olabilen, gerçekte var olmayıp da yalnızca düşünülmüş olan her şey. Bu anlamda: düşünce nesnesi = ens rationis. 2. Kişiye karşıt olarak: Bilinçten yoksun varlık. 3. Gerçek olan, bilincin dışında, kendi başına var olan tek nesne (ens reale). Böyle bir var olan, tek nesne olarak niteliklerin taşıyıcısı töz diye de anlaşılır. 4. Duyularla kavranabilen cisimsel nesne.

BSTS / Felsefe Terimleri Sözlüğü 1975

Bu tanımdan şunu anlıyoruz. Birşeyin nesne olabilmesi için belirli kurallar var.

  1. Düşünen aklımızın, yani zihnimizin dışında olacak.
  2. Düşüncemizin konusunu oluşturacak, yani düşüncemize yakıt oluşturacak.
  3. İsmi varsa nesne, ismi yoksa şey olarak adlandırılacak.

İnsanlar olarak bizim, evrim sürecinde, hayvanlardan farklılaşmamızın en büyük ayırt edici özelliği, düşünebilmemizdir. Düşüncenin dil kavramının insanlarda ortaya çıkmasıyla başladığını biliyoruz. Kaynak

Peki düşünce nedir? Nasıl başlar? Düşünce algı ile başlar. Kendi dışımızdaki ortamda algıladığımız sinyaller, önce beynimize gider. Bu kısaca 3 saattir aradığın, önünde duran ama görmediğin ve salak salak aradığın anahtara baktığın aşama oluyor. O şeyin anahtar olduğunu anladığın anda, algı sürecin tamamlanıyor.

Daha sonra bu algılar ile belirli sonuçlar üretmemiz gerekiyor ki düşünme eylemimiz amacına ulaşsın. Burada, bilgisayar programları veya algoritmaları ile varolan benzerlik dikkatinizi çekti mi? Bilgisayar programları ile biz belirli girdiler kullanarak belirli sonuçlara ulaşmaya çalışıyoruz. Girdi-İşleme-Sonuç adımlarıyla programları çalıştırıyoruz. Düşünce kavramında da, girdiler algılanmış nesnelere, işlem düşünceye ve sonuçlar yani çıktılar, çıkarımlara denk geliyor. Bizim bilgisayarlardan farkımız, benlik bilincine sahip olmamız ve etraftaki kendimizden farklı olan nesnelerin bizim dışımızda olduğunu idrak etmemizden kaynaklanıyor. (Bu konuyu, özellikle yapay sinir ağları konusunu daha derinlemesine araştırırsanız bundan bir 5 sene sonra zengin olacağınızı garanti ediyorum.) Yani nesne, düşüncemizin konusu olan soyut ya da somut varlıkları, önce kendimizden daha sonra birbirlerinden ayırt etmemizi sağlıyor. (Burada da mantık konularına giriyoruz. Üniversite ders kitabı falan yazarsam bu kavramlara derinlemesine ineceğim söz.)

Gerçek olan ne?

Bakışlara dikkat. Descartes

Yani ben gerçekten varolduğumu nasıl anlıyorum? Bu konuda Rene Descartes 1637 “Cogito ergo sum” demiş. Yani “Düşünüyorum, o halde varım.” Düşünme eyleminin kendi zihnimizden bağımsız bir dünyanın varlığını gerektirdiğini biliyoruz. fMRI denen beyin taraması insana birşey gösterildiğinde, beynin hangi bölgelerine kan akışı olduğunu gösteriyor. Yeni bilimsel gelişmeler sayesinde, önce zihinden bağımsız varlığın, sonra algı kavramının düşünme kavramının öncülü olduğunu da öğrenmiş bulunuyoruz. Descartes abimizin haklı olduğunu bu sayede anlıyoruz. Yani nesne kavramını oluşturabilmemiz için önce bir içsel zihne (ya da bilgisayar programlarında, çalışan bir hesaplama ünitesine) daha sonra da algılara ihtiyacımız var. (Bu da bilgisayar programlarında girdilere denk geliyor.)

İnsanlar olarak mantıklı düşünmenin önemini biliyoruz. Konuya mantık açısından baktığımızda mantığın en temel kavramlarıyla da ilişki içinde olduğumuzu görmek kolay. Kaynak

Mantığın 4 temel ilkesi diyor ki:

  1. A, A’dır. (Özdeşlik ilkesi)
  2. A, A olmayan değildir. (Çelişmezlik ilkesi)
  3. C, ya A’dır, ya da A olmayan’dır. (3. şıkkın imkansızlığı ilkesi)
  4. Sonuç varsa, sebep vardır. (Yeter sebep ilkesi)

Matematiğin bile temellerini oluşturan bu düşünsel ilkeler, nesne kavramı için de aynı şekilde geçerlidir. Nesneleri, kendimizden, düşünen zihnimizden ve diğer nesnelerden ayırt edebiliyorsak (1. ve 2. ilke), Nesnelere farklı isimler ile referanslar verebiliyorsak (3. ilke) ve düşünürken ya da programlar yazarken girdilerin, sonuçlar üretebileceğini biliyorsak (4. ilke), mantıklı düşünebiliyoruz demektir.

(Not: Kanıtı olmayan gerçekler kitabı’nda gerçekliğin fiziksel varlıklardan çok, bu varlıkların kendileri dışında yarattığı etkileri de içerdiği iddia ediliyordu. Yani, Mozart, eserleri ile birlikte yaşamaya, düşüncesindeki deseni farklı insanalara aktarmasıyla yaşamaya devam ediyor diye iddia ediliyordu. Bunu da yazayım da kafanız daha da karışsın.)

Nesne yönelimli programlama nerden çıktı?

Ole-Johan Dahl ve Kristen Nygaard abilerimiz

Norveç’te 1961 yılının soğuk bir sonbahar akşamı, yani soğuk derken -25 falan, Ole-Johan Dahl ve Kristen Nygaard abilerimiz, Simula denen programlama dilini icat ediyorlar. Kaynak Amaçları, yazılan programların insanlar tarafından daha kolay anlaşılmasını ve gerçek hayatta varolan bilimsel olayların daha verimli bir şekilde simüle edilmesini sağlamak.

Alan Kay

Nesne yönelimli programlamayı yaygınlaştıran Alan Kay abimiz, 1971 yılında Amerika’da Smalltalk programlama dilini icat ediyor. Alan Kay abinin bu konudaki motivasyonu ise, kendisi biyoloji kökenli olduğundan, programları, birbiriyle konuşan, birbirinden bağımsız hücreler gibi düşünmesi. Yani kendisinin sahip olduğu biyoloji temeli bugünkü kullandığımız programlama dillerine de temel oluşturuyor. Daha çok merak edenler için kaynak.


Burada Nesne Yönelimli programlamanın tarihçesine inmek istemiyorum. Araştırmanızı, okumanızı tavsiye ederim. Bu yazı ders kitabı haline gelirse bunu da yazarım.

Özne-nesne ilişkisi

Ali Topu At

Nesnelerin zihnimizin, ya da bilgisayarımızın dışında varlıklar olduğunu ve kavramları birbirinden ve kendimizden ayırt etmemize yardımcı olduğunu anladık. Bunun dışında nesnelerin gerçek dünyaya referans verdiğini, gerçek dünyadaki kavramları temsil ettiğini de az çok biliyoruz. Peki nesneler birbirileriyle nasıl ilişkilere sahipler. Bir nesneyi kullanan, onun üzerinde etkisi olan nesneye, özne diyoruz. Dilbilimde, “Ali topu at!” derken, Ali’nin özne, topun nesne, atmak kelimesinin de yüklem, yani yaptığımız işlem olduğunu biliyoruz. Bilgisayar programlarında, özne, bir diğer nesneyi çağıran, ona mesaj gönderen, onu yaratan bir bilgisayar programıdır.

Üyelik ilişkisi (IS-A)

Nesneler belli bir grubun üyesi olabilirler, yani daha üst bir sınıfın özelliklerine sahip olabilirler. Bu sayede birden fazla nesne grubunu, başka gruplardan ayırt edebiliriz. Eski yunanda yaşayan en büyük düşünür Aristo abimiz, taksonomi bilimiyle, canlı varlıkları, ortak özelliklerine göre sınıflandırmış. Biz de nesneleri aynen bu şekilde sınıflandırabiliyor, birden fazla nesneyi ortak özelliklerine göre gruplandırıp onları tek tek belirtmeden, düşüncemizin konusu haline getirebiliyoruz. Yani, Ali, Ayşe, Ahmet, Mehmet demek yerine, “Gıcık insanlar” diyebiliriz mesela. Ayrıca bir grubun üyesi olmayan iki ayrı nesne, aynı eylem içinde birlikte yer alıyorlarsa, onlar da belirli bir grubun içinde kabul edilebilirler. Örneğin, “Ali ve Ayşe İstabul’a gittiler” dediğimizde, Ali ve Ayşe’nin gitme eylemini yapabilen türden varlıklar olduklarını anlayabiliriz. Kaynak

Nesneler farklı nesnelerin bir araya gelmesiyle oluşabilirler. (HAS-A)


Yukarıda verdiğimiz grup örneğinde, eğer oluşturduğumuz grubun kendisi de bir nesne olarak kullanılabiliyorsa buna, Toplama (yani Aggregation) diyoruz. Örneğin, bir etli türlü yapmak için, patlıcan, domates, bamya, tereyağı kullanıyoruz ve sonuç olarak etli türlü elde ediyoruz. Elde ettiğimiz sonuç yine bir nesne meydana getirebilir. Kaynak

Nesnelerin kendilerine ait özellikleri ve yapabildikleri vardır.


Örneğin Ahmet çok yemek yerse, kilo alır. Ahmet tutup dünyayı yiyip 101 kiloya çıkarsa mutsuz olur. Ahmetin nümerik kilo özelliği, onun şu anki duygu durumu özelliğini etkiler. Ahmetin yemek yiyebilmesi onun yapabildiği şeyleri gösterir. Ahmet kilosundan mutsuz olup kendini aç bırakırsa, akşam daha çok acıkıp, iki tane fırın sütlaç, iki prosiyon döner ve kaymaklı ekmek kadayıfı yer ve daha çok mutsuz olur.

Nesneler birbirlerine mesaj gönderebilirler.

Ahmet’i uzun zamandan sonra gören arkadaşı, “Baba sen napmışsın, acayip kilo almışsın yea.” diyebilir. Arkadaşı Ahmet’e mesaj göndermiş olur. Ahmet’de buna sinir olup 3 ay boyunca spor salonuna yazılıp iyi bir diyet ve egzersiz programı ile fit bir hale gelebilir. Yani, nesnelerin birbirlerine gönderdikleri mesajlar, nesnelerin eylemlerini tetikleyebilirler. Bu eylemler sonucunda nesneler kendi özelliklerini değiştirebilirler.

Şimdilik bu kadar. Umarım kavramlar kafanızda biraz oturmuştur. Yazı ile ilgili düzeltme ve yorumlarınızı, sorularınızı bekliyorum.

Serinin devam yazısına şuradan ilerleyebilirsiniz:

View story at Medium.com


Projelerle PHP 7

Ben Mutlu Koçak, Bilgisayar Mühendisiyim, ZCPE Sertifikasına sahibim ve “Hiç Bilmeyenler İçin İnternet Programlamaya Giriş — PHP 7” adlı kitabın yazarıyım. Kitabım: https://www.seckin.com.tr/kitap/911934237
Özgeçmişim:
http://represent.io/mtkocak.pdf 
Websitem:
http://mynameismidori.com

Yorumla

Yorum