Sayfalar

Nesne Yönelimli Yazılımda Temel Kavramlar

Selamlar,
    İlgilenenler  için faydalı olabileceği düşüncesiyle eski yazılarımdan bazı hazır içerikleri blog'umda yayınlayacağım. Umarım ilginizi çeker.


Esen Kalın.
     
     Nesne yönelimli programlama 80’li yıllarda C++ ile popüler olan bir kavramdır.Sunduğu yeniden kullanım , kolay anlaşılırlık , kolay adaptasyon vb. özelikleri ile dikkat çekmiştir.Günümüzde yazılım geliştiricilerin çoğu bu disiplin ile yazılım geliştirmektedir.
  
   Nesne yönelimli programlamada  karşımıza çıkan en temel kavram sınıf (class) kavramıdır.Nesne yönelimli programlama  bize gerçek dünyaya daha yakın bir programlama imkanı sunar.Gerçek dünyada biz nasıl etrafımızdaki tüm nesneleri özellikleri ve davranışları ile tanımlıyorsak , nesne yönelimli programlamada da aynı şekilde tanımlamaktayız. Örneğin yazı yazdığımız kalemi cinsi , boyu , rengi gibi özellikleri ile tanımlarız.Bunun yanı sıra kalem kağıt üzerinde yazı yazma davranışı sergiler.



   
   Sınıf aynı özellik , nitelik , davranış ve anlamı taşıyan nesnelerin kalıbıdır  diyebiliriz.Sizin mavi renkli yazan dolmakaleminiz de , kurşun kaleminiz de sonuçta  kalem sınıfının birer örneğidir.Birbirlerinden farklı nitelikler taşısalar da ortak özellik (attributes)  ve davranışlar (behaviours) ile tanımlanmaktadırlar.Kalem sınıfı şu şekilde tanımlanabilir :


  Sınıfların özellikleri dilin doğal değişken tiplerinden oluşabileceği gibi başka sınıflardan da oluşabilir.Örneğin kalem kutusu diye bir sınıf tanımlansa muhtemelen özellikleri içerisine sahip olduğu kalemlerin de yani kalem sınıfının da konması gerekecektir.Bu durumda kalem kutusu sınıfı aynı zamanda kalem sınıfı ile  ortaklık (association) kurmuş olarak adlandırılır.Bu ilişki “kalem kutusu  kalemlere sahiptir” şeklinde okunabilir.


Bu ilişkiye sahiplik (has a) ilişkisi denir.Eğer bir nesnedeki  her zaman bir diğerini de etkiliyorsa ya da var olmak için diğerine ihtiyaç duyuyorsa o zaman burada bir bağımlılık (dependency) ilişkisi vardır. Örneğin departman ile çalışanlar arasında ki ilişki gibi.Çalışanları olmıyan bir departman hiçbir zaman var olamaz.


  Sınıfın  yaratılan bir  örneğine (instance) ise nesne (object) diyoruz.Bu durumda mavi renkli yazan dolmakaleminiz , kalem sınıfının bir örneği (instance) olan bir nesne (object) olur.
 


  Nesne yönelimli programlamada nesneler birbirlerinin fonksiyonlarını kullanmazlar.Bunun yerine birbirleriyle mesajlar (messages)  aracılığıyla haberleşirler.Görünüşte fonksiyonel yapıyla benzeşse de kavramsal olarak tamamen farklıdır.Sınıflar bir fonksiyonlar topluluğu değildir.Sınıf belli bir kavramın bilgisayar dilinde somutlaştırılmış halidir.Nesnelerin birbirlerine mesaj göndermesi sundukları methodlar (methods) üzerinden parametreler aracılığıyla (Örn. Kalem sınıfındaki yaz methodu) olur. Methodlar sınıfın dışarıya sunduğu arabirim oldukları gibi (her method dışa açık değildir) davranışlarında gerçekleştirildiği birimlerdir.

  Burada daha fazla ilerlemeden nesne yönelimli programlamanın dört temel ilkesi üzerinde durmak faydalı olacaktır.Bu ilkeler :
  1. Soyutlama (Abstraction)
  2. Kapsulleme (Encapsulation)
  3. Kalıtım (Inheritence)
  4. Polimorfizm (Polymorphizm)

olarak anılırlar.

Soyutlama (Abstraction)

   Sınıfların belli kavramların bilgisayar dilinde somutlaştırılmış hali olduğundan bahsetmiştik. Kavramların özelliklerinin ve davranışlarının tanımlanmasına biz soyutlama diyoruz.Bir başka deyişle soyutlama , bir sınıfın , sınıf olmasını sağlıyan şeylerin tanımlanmasıdır diyebiliriz.Örneğin araba ve gemi her ikisi de birer taşıttırlar .Ancak belli özellikleri ile birbirlerinden ayrılırlar. Örneğin araba sınıfını tekerlek sayısı , ağırlığı , hızı , motor gücü , kaç kapılı olduğu vb. özellikleri ile yürümesi , hızlanması , durması vb. davranışları ile  tanımlayabiliriz.

   Sınıfın belli bir kavramı temsil etmesinin yanı sıra kavram karmaşası da yaratmaması gerekir.Her sınıf kavramsal olarak bir düşünceye isabet etmelidir.Örneğin bir yolcu uçağı ile bir savaş uçağı birbirlerine çok benzeştikleri halde ayrı sınıflardır ve bunu belirtecek şekilde tanımlanmalıdırlar.Kavramsal olarak bir düşünceyi temsil eden ve karmaşıklık yaratmayan sınıflar uyumlu ( cohesive ) sınıflar olarak anılırlar. Programlamanın belki de en önemli ilkesi düşüncenin basit tutulmasıdır.Uyumluluk (cohesion) bu ilkenin nesne yönelimli programlamada adlandırılmasıdır denilebilir.




Kapsulleme (Encapsulation)

   Niteliklerin ve davranışların sınıflarda bir arada bulunmasına kapsulleme denir.Bir başka deyişle kavram nitelikleri ve davranışları tanımlanarak – ya da soyutlanarak -  bir sınıf içerisinde kapsullenir. Kapsulleme aynı zamanda sınıfın hangi niteliklerinin ve davranışlarının dışarıya sunulup sunulmıyacağını da belirler.Sınıfın tüm nitelik ve methodları dış dünyaya açık olmak zorunda değildir.Yine basit olma ilkesinden hareketle , gereksiz method ve niteliklerin dışarıya açılması kafa karıştırıcı ve gereksiz bir eylem olacaktır.Örneğin bir insan sınıfı tanımlarken muhtemelen karaciğerinin büyüklüğü bizi hiç ilgilendirmemektedir.Ancak bu sınıfın böyle bir özelliği vardır ve sınıfın kendi iç çalışması için gereklidir.Bilgilerin bu şekilde gizlenmesine bilgi saklama (information hiding) denir.

   Sınıfın nitelikleri ve methodları public , protected , private , package (friend) gibi terimlerle dışa olan açıklığı , görünürlüğü belirlenir.

  • Public : Dışa açık ve herkez tarafından erişebilen elemanlardır
  • Protected : Dış erişime kapalı sınıf içinde ve alt sınıflarda da kullanılabilen elemanlardır
  • Private : Sadece o sınıf içinde kullanılabilen , alt sınıflar tarafından da kullanılamıyan elemanlardır
  • Package (friend) : Ait olunan  paket içindeki sınıflar tarafından kullanılabilen , paket dışı erişime kapalı elemanlardır

Kalıtım (Inheritance)

   Nesne yönelimli programlamada sınıflar birbirlerinden türiyebilirler.Alt sınıflar (sub classes) türedikleri üst sınıfın (super class) tüm özellik ve davranışları aynen alırlar.Bu özelliğe kalıtım (inheritance) özelliği denir.Bunun anlamı , alt sınıfların  üst sınıfların  nitelik ve methodlarını sanki kendi üzerlerinde kodlanmış gibi kullanabilmeleridir.Örneğin araba ve gemi her ikiside birer taşıttır.Taşıtların ortak özellikleri kapasitesi , gitmesi , durması ,  hızlanması vb. sayılabilir.Aslında hem gemi hem araba için bunlar aynıdır ve ortak bir üst sınıfta toplanabilirler.Kalıtım özelliği aynı kodun yeniden kullanımı için sunulan çok güzel bir yöntemdir.

  

   Bazı dillerde bir sınıf sadece bir başka sınıftan kalıtım alabilirken (türiyebilirken) bazı dillerde bu birden fazla sınıftan olabilir.Bu özelliğe çoklu kalıtım (multi inheritence) denir.


   Araba ve taşıt örneğindeki ilişki “araba bir taşıttır” (“is a “ ilişkisi)  olarak okunur ve bu ilişkiye genelleştirme de ( generalization )  denir.Alt sınıflar aynı zamanda üst sınıf özellikleri de taşıdıklarından yazılım içinde sanki üst sınıfmış gibi ya da onun yerine de kullanılabilirler.
  
   Nesne yönelimli programlamada bazı üst sınıflar bazı methodlarını alt sınıflarda tamamlanmak üzere sadece tanımlayarak (sadece methodu belirterek ) bırakabilirler . Bu tip sınıflara soyut (abstract) sınıf adı verilir.Tüm methodları sadece tanımlanmış ama kodlanmamış sınıflara arabirim (interface) adı verilir. Tüm kodlaması tamamlanmış sınıflar ise somut (concrete) sınıf olarak adlandırılır.Somut bir sınıfın soyut bir sınıftan türediği ilişki türüne gerçekleştirme (realization) adı verilir.Bu tarz üst sınıflar alt sınıflara yeniden kullanılabilir davranışlar verilemediği ancak davranış kalıbının belirlenmek istediği durumlarda kullanışlıdır.
 
  Yeniden kullanılabilirliği arttırmak için sınıflar dizayn edilirken kavramlar genelden özele doğru kategorize edilmeli ve gerekli üst sınıflar ortaya çıkarılmalıdır.Bazı durumlarda kendi başına anlam ifade etmeyen hatta tamamen soyut üst sınıfların ortaya çıkması tamamen doğal birşey olarak algılanmalıdır.


Polimorfizm (Polymorphizm)

   Alt sınıflar üst sınıflarda belirlenmiş davranışlara aynı tepkileri vermek zorunda değildir. Yine taşıt örneğinden yola çıkarsak gitmek davranışı araba ve gemi için farklı şekillerde olur.Biri yürüken diğeri yüzer ancak sonuçta her ikisi de gitme eylemini gerçekleştiriyordur.Alt sınıfların bu şekilde farklılıklar gösterebilmesi özelliğine  polimorfizm denir.Bu özellik pratikte üst sınıf tarafından sunulan methodların üzerinin yazılması (method overriding) ile olur.Alt sınıf methodu kendine göre değiştirerek ezer.Ancak methoddan beklenen sonucun tipi değiştirilemez.
 
  Alt sınıflar doğaları gereği üst sınıflara göre ek özelliklerle ve  veya davranışlar göstermek zorundadırlar.

   Nesneler işlevlerini yerine getirmek için başka nesnelere ihtiyaç duyabilir. Nesneler arasında  ister diğer nesnenin bir nitelik olarak tanımlanması olsun , ister bir mesajlaşma şekilde olsun , kurulan ilişkiler (kalıtım ilişkisi dışında) eşleme ( coupling ) olarak adlandırılır.Bir nesneye  çalışmak için ihtiyaç duyduğu sınıf (nesne değil) sayısı kadar eşleme yapılmış olur.Eşleme kavramı sınıfın karmaşıklığı ile direk alakalıdır.Sonuçta nesne ile diğer sınıflar ile ne kadar çok eşleme yapılmış ise çalışma sisteminin çözülmesi o kadar karmaşık olacaktır.Bu kavram prensipleri ve metrikleri açıklarken oldukça sık karşımıza çıkacaktır.

   Nesneler dünyasında sıklıkla karşımıza çıkacak bir kavramda durum (state) kavramıdır.Nesnenin niteliklerinin belli bir andaki durumu özellikle nesnenin yaşam döngüsünün tariflemesinde önemlidir.Bazı sınıfların yapısı ve anlaşılması son derece karmaşık olabilir.Nesneler çeşitli durumlarında farklı davranışlar da gösterebilirler.Nesnenin bir durumdan diğerine geçmesine durum değişikliği (state change) denir.Bu durum değişikliğine ise olaylar (events) sebep olurlar.(Örneğin bazı tip mesajların gönderilmesi gibi) .Durumlar ,  olaylar ve durum geçişleri bize kavramsal olarak bir kolaylık sağlar.Olay yönelimli (event driven) programlama yapısıda bunun üzerine kurulmuş bir yapıdır.




1 yorum: