Başlangıç » OOP » NESNEYE-YÖNELİK PROGRAMLAMANIN TEMEL İLKELERİ

NESNEYE-YÖNELİK PROGRAMLAMANIN TEMEL İLKELERİ

•Nesneye-yönelik programlamanın temel ilkeleri şunlardır:
▫Soyutlama
                                                 ————->                      SINIF
▫Saklama
▫Kalıtım
                                                 ————–>                  SINIF HİYERARŞİSİ
▫Çok biçimlilik
•Nesneye-yönelik programlamanın temel kavramları:
1.büyük programlar yazmayı kolaylaştıran soyutlama ve programları değiştirmeyi ve korumayı kolaylaştıran saklama
2.kalıtım  ve  çok biçimliğe izin veren 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
•“Soyutlama” önemli özelliklere odaklanabilmek için ayrıntıları göz ardı etme sürecidir.
•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 de Birleştirici Dillerden daha soyut bir ortam sunar.

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

PROSEDÜREL SOYUTLAMA

•İşlemlere ilişkin ayrıntıları göz ardı etmemize izin veren “prosedürel soyutlama” en yaygın soyutlama tarzıdır.
•Programlarda kişileştirilmiş kod kullanmak yerine, belirli görevleri gerçekleştirmek için standart fonksiyonların oluşturulması  bir prosedürel soyutlamadır.

•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 != ‘’)

{ if ((*s == *t) ||

((*s >= ‘A’) && (*s <= ‘Z’) && ((*s+32) == *t)) ||

((*t >= ‘A’) && (*t <= ‘Z’) && ((*t+32) == *s)) )

{ s++; t++; }

else break; }

if (*s == ‘’) 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”);

•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 ile kod tekrarlarından kurtulmak mümkündür.
VERİ SOYUTLAMASI
•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 “floating” sayıları destekler.
•Basic dili karakter katarı (string) tipini bir veri soyutlaması olarak destekler. Diğer yandan, C dili string soyutlamasını doğrudan desteklemez. Bu dilde stringler ardışık bellek hücrelerini işgal eden bir dizi karakter olarak tanımlanmıştır.
•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 “structure”lar ve “typedef”ler aracılığıyla 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[30];

char adrese2[30];

}

Nesne: Prosedürel Soyutlama + Veri Soyutlaması
•Bir “structure”ın 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.
Nesne tanımı
•Soyutlama, kodu ve kodun işlediği verileri bir araya getiren ve onları dış etkilerden, yanlış kullanımlardan koruyan mekanizmadır. Nesneye yönelik dillerde kod ve veri, bir “kara kutu” oluşturacak şekilde bir araya getirilir. Kod ve verinin bu şekilde birbirine bağlanmasıyla da nesne meydana gelmiş olur.
SINIFLAR
•Nesneye-yönelik programlama, prosedürel soyutlama ve veri soyutlamasını sınıflar biçiminde birleştirir.
•Bir sınıfı tanımlarken, yüksek-düzeyli soyut bir yapıya ilişkin her şey belirlenir.
•Bu sınıfa ait bir nesneyi kullanırken, sınıf içinde bildirilmiş veri tipleri ve onlar üzerinde tanımlanmış işlemler göz ardı edilebilir.
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 / BİLGİ 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.
•Gerçek bir sarmalama, verileri fonksiyonlarla gizlemeyi gerektirir.
•Nesnenin içindeki kod, veri veya her ikisi bu nesneye private (özel) veya public (genel) olabilir.
Private kod ve veriler, sadece o nesneye ait bileşenler tarafından bilinebilir ve erişilebilir. Programında nesneye ait olmayan bileşenleri bu private kod ve verilere erişemez.
•Kod ve verilerimiz public ise, belirli bir nesnenin içinde tanımlansalar da programın diğer parçaları tarafından erişilebilirler.
•Nesnelere ait public elemanları private elemanlara denetlenebilir şekilde erişebilmek amacıyla kullanırız.
•Her ne sebeple olursa olsun, nesne, kullanıcı tarafından tanımlanan tipte bir değişkendir. Nesne tipi tanımladığımızda aslında yeni bir veri tipi oluşturuyoruzdur. Bu veri tipi de bileşik bir değişkendir.
•Nesneye-yönelik programlamanın, prosedürel programlamada bulunmayan, bir özelliği, 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.
SINIF HİYERARŞİSİ
•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 odaklaşıp diğerlerini göz ardı etmeye izin verir.
•“Aslan”, “kaplan”, “ayı” ve “inek” türünün üst-sınıfı ne olabilir?
KALITIM

Kalıtım nesne yönelimli programlamada önemli bir özelliktir.  Kalıtım yolu ile eldeki sınıflardan yeni sınıflar türetilir. Türeyen sınıflar türedikleri sınıfın özelliklerini kalıtım yoluyla devralırlar ve kendisi de yeni özellikler tanımlayabilir. Türetme ile sınıflar arasında hiyerarşik bir yapı kurulabilir.

•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.
KOD KALITIMI
•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.
•Örnek: Veri Girişi Formlarının tasarlanması.
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.
•Örnek: Farklı veri tiplerindeki form girişleri ayrı ayrı alınır.
ÇOK BİÇİMLİLİK
•Genel anlamı ile bir adın birbiriyle alakalı fakat teknik açıdan farklı iki veya daha fazla amaç için kullanılabilmesi yeteneğidir.
•NYP’de ise oluşturulan nesnelerin gerektiğinde başka bir nesne gibi davranabilmesine denir.
Çok biçimlilikle programdaki her nesne kendi davranışını değiştirmeden, kalıtım hiyerarşisine göre farklı biçimlerde görülebilir
Bir çok biçimlilik örneği
•Örneğin C dilinde, mutlak değer bulma işlemi için üç farklı fonksiyon tanımlıdır: abs(), labs() ve fabs().
• Fakat çok biçimliliği destekleyen C++’da bu fonksiyonlar, abs() gibi tek bir isimle adlandırılırlar. Fonksiyonu çağırmak için kullanılan veri tipi, gerçekte hangi fonksiyonun çalışacağını belirler. Böylece bir fonksiyon adının birkaç farklı amaç için kullanılması mümkündür.  Buna fonksiyonların aşırı yüklenmesi denir

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Twitter picture

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Log Out / Değiştir )

Connecting to %s