Nesneye Yönelik Programlama | Nesneye Yönelik Programlama Nedir?

Muhammed Mastar tarafından 10 June 2010 tarihinde yazılmıştır.
Yorum Yok

1960′lı yılların sonuna doğru yazılımların karmaşıklığı ve boyutları arttıkça gereken bakımın maliyeti (zaman ve çaba olarak) daha da hızlı artmaktaydı.
NYP’yi bu soruna karşı bir çözüm haline getiren başlıca özelliği, yazılımda birimselliği (modularity) benimsemesidir.
NYP ayrıca, bilgi gizleme (information hiding), veri soyutlama (data abstraction), çok şekillilik (polymorphism) ve kalıtım (inheritance) gibi yazılımın bakımını ve aynı yazılım üzerinde birden fazla kişinin çalışmasını kolaylaştıran kavramları da yazılım literatürüne kazandırmıştır.
Sağladığı bu avantajlardan dolayı, NYP günümüzde geniş çaplı yazılım projelerinde yaygın olarak kullanılmaktadır.
Geleneksel prosedür yönelimli programlama yaklaşımında, bir program gerçekleştirilecek bir dizi işlem adımını, yani bir algoritmayı, tanımlar.
Nesneye-yönelik yaklaşımda ise, bir program birbiriyle etkileşim halinde olan bir nesneler sistemini tanımlar.
C++ dili prosedürel bir dil olarak ta kullanılabilir. Fakat, ancak nesneye-yönelik bir yaklaşımla bu dilin bütün potansiyeli açığa çıkarılabilir.

NYP’nin Temel Kavramları

Temel kavramlar:
büyük programlar yazmayı kolaylaştıran soyutlama,
programları değiştirmeyi ve korumayı kolaylaştıran saklama ve
programları kolayca genişletilebilir kılan sınıf hiyerarşisidir.
Herhangi bir programlama dilinde bu kavramları uygulayabilirsiniz; fakat, nesneye-yönelik programlama dilleri salt bu amaçla tasarlanmışlardır.

SOYUTLAMA – 1

“Soyutlama”, belirli bir bakış açısından, önemli özelliklere odaklanabilmek için ayrıntıları göz ardı etme sürecidir.

SOYUTLAMA – 2

Geleneksel olarak, bir programlama dili soyutlama yapmaya izin verdiği ölçüde yüksek-düzeyli (high-level) kabul edilir.
C++ (ve diğer nesneye-yönelik programla dilleri) verilen bir işi C’den daha soyut bir tarzda tanımlama imkanı verirken, C ise Birleştirici Dillerden daha soyut bir ortam sunar.
Bir programın ne yaptığını Birleştirici Dillerden daha ayrıntılı tanımlamak mümkün müdür?

PROSEDÜREL SOYUTLAMA – 1

İşlemlere ilişkin ayrıntıları göz ardı etmemize izin veren “prosedürel soyutlama” en yaygın soyutlama tarzıdır.
Belirli bir dilde bir program yazarken programcı kendisini bu dilin sunmuş olduğu soyutlama düzeyiyle sınırlamak zorunda değildir. Birçok dil kullanıcı-tanımlı fonksiyonlar (rutinler, prosedürler) yardımıyla prosedürel soyutlama düzeyini daha yukarılara taşımaya izin verir.

PROSEDÜREL SOYUTLAMA – 2

Kendi fonksiyonlarınızı yazarak, programın yaptığı bir dizi işleme bir isim vermiş olursunuz. Örneğin, iki karakter katarının aynılığını büyük-küçük harf ayrımı gözetmeksizin test eden aşağıdaki kodu,
while (*s != ‘\0’)
{ if ((*s == *t) ||
((*s >= ‘A’) && (*s <= ‘Z’) && ((*s+32) == *t)) ||
((*t >= ‘A’) && (*t <= ‘Z’) && ((*t+32) == *s)) )
{ s++; t++; }
else break; }
if (*s == ‘\0’) printf(“esit \n”);
else printf(“esit degil \n”);
bir fonksiyon içine yerleştirebiliriz:
if ( !_stricmp(s, t) ) printf(“eşit \n”)
else printf(“esit degil \n”);

PROSEDÜREL AYRIŞTIRMA

Yapısal programlama yaklaşımında,
ilk tasarım adımı programdan beklenen işlevselliği belirlemektir. Yanıtlanması gereken, “Bu program ne yapacak?” sorusudur.
Ardından, istenileni gerçekleştirmesi için programın atması gereken temel adımlar yüksek-düzeyli “pseudo” kodlar ya da akış diyagramları yardımıyla belirlenir.
Sonrasında, her temel adım daha küçük adımlara bölünerek tasarım daha rafine hale getirilir.
Bu yaklaşıma, prosedürel ayrıştırma (“procedural decomposition”) denir.

VERİ SOYUTLAMASI-1

Bir veri tipinin nasıl yapılandığının ayrıntılarını göz ardı etmemize izin veren soyutlama tarzına “veri soyutlaması” denir.
Örneğin, bilgisayardaki her tür veri ikili sayılar olarak düşünülebilir. Fakat, birçok programcı ondalık sayılarla düşünmeyi tercih ettiği için, dillerin çoğu tam ve ondalıklı sayıları destekler.
Basic dili karakter katarı (string) tipini bir veri soyutlaması olarak desteklerken, C dili string soyutlamasını doğrudan desteklemez. Bu dilde string’ler ardışık bellek hücrelerini işgal eden bir dizi karakter olarak tanımlanmıştır.

VERİ SOYUTLAMASI-2

Prosedürel soyutlama kapasitelerinin aksine, birçok dil yeni veri soyutlaması düzeyleri yaratmak konusunda sınırlı destek sağlarlar.
C kullanıcı tanımlı veri tiplerini struct ve typedef yapıları ile destekler.
Birçok programcı structure’ları basit bir değişkenler topluluğu olarak kullanır:
struct KisiBilgisi {
char isim[30];
long telefon;
char adres1[150];
}

Nesne: Prosedürel Soyutlama + Veri Soyutlaması

Bir struct bildirimini kendisini kullanmamız gereken fonksiyonları belirtmeden yapabiliriz. C dili, içsel olarak birbirlerine bağlı olmalarına rağmen, prosedürel soyutlamayı ve veri soyutlamasını iki ayrı teknik olarak sunar.
Bu tekniklerin birleştiği noktada nesne-tabanlı ya da nesneye-yönelik programlama yaklaşımı doğar.

SINIFLAR

Nesneye-yönelik programlama, prosedürel soyutlama ve veri soyutlamasını sınıflar biçiminde birleştirir.
Nesne: Belirlenmiş işleri yerine getiren ve bunun için çeşitli fonksiyonlar içeren bir yapıdır.
Sınıf: Nesnelerin davranışlarına göre tasnif edilmelerini sağlayan yapıdır.
Bazı kaynaklar sınıf için nesne, nesne için ise olay (instance) kavramlarını kullanmaktadır.

SARMALAMA

Programımızın tasarımını kendi işlem kümelerine sahip soyut veri tipleri etrafında yaparak kendimizi kodlama / gerçekleme detaylarından daha fazla arındırırız. Bu da bizi nesneye-yönelik programlamanın bir diğer avantajına, sarmalamaya, götürür.

Sarmalama = Bilgi Saklama

“Sarmalama”, soyutlamayı desteklemek yada güçlendirmek için bir sınıfın iç yapısının gizlenmesidir. Bu gizleme, bir sınıfın “görünür” arayüzü ile “özel” gerçeklemesi arasında keskin bir ayrım yapmamızı gerektirir.
Bir sınıfın arayüzü o sınıfın ne yapabileceğini, gerçeklemesi ise bunu nasıl yapabileceğini gösterir.

SINIF HİYERARŞİSİ

Nesneye-yönelik programlamada olup ta, prosedürel programlamada olmayan başka bir özellik ise “tip hiyerarşisi tanımlayabilme” yeteneğidir.
Örneğin, C Dili bütün veri tiplerini birbirinden bağımsız olarak ele alırken, C++ bir sınıfın başka bir sınıfın alt-tipi olarak tanımlanmasına; sınıflar arası benzerlikleri bir ortak üst-sınıf altında toplamaya izin verir.
Birkaç sınıf için ortak bir üst-sınıf tanımlama da bir tür soyutlamadır. Sınıfların ortaklaşa taşıdıkları bazı yönler üzerinde odaklanıp diğerlerini göz ardı etmeye izin verir.
Bir sınıf hiyerarşisi tanımlamanın 2 pratik faydası vardır:
Türetilmiş sınıf üst-sınıfın kodunu paylaşabilir;
Türetilmiş sınıf üst-sınıfın arayüzünü paylaşabilir.

Kalıtım (Inheritance)

Eğer yeni bir sınıf tanımlıyorsanız ve mevcut bir sınıfın işlevselliğinden yararlanmak istiyorsanız, yeni sınıfınızı mevcut sınıftan türetirsiniz. Bu durumda kalıtım mekanizmaları size mevcut kodu yeniden kullanma imkanı sağlar.

ARAYÜZ KALITIMI

Bir diğer kalıtım stratejisi, türetilmiş sınıfın üst-sınıfının eleman fonksiyonlarının yalnızca isimlerini kalıtım yoluyla almasıdır. Türetilmiş sınıf bu fonksiyonlar için kendi kodunu kullanır.
Arayüz kalıtımının temel faydası çok-biçimliliğe izin vermesidir.

  • FriendFeed'de Paylaş
  • Facebook'ta Paylaş
  • Twitter'da Paylaş
  • Bu Yazı Hakkında Birşeyler Demek İstermisiniz?





    Powered by WP Hashcash

    - Tüm Telif Hakları Yüce Türk Milleti'ne Aittir. -

    Valid CSS!

    şerit