250 likes | 572 Views
NESNEYE YÖNELİK PROGRAMLAMANIN TEMEL İLKELERİ GENEL BİR BAKIŞ. Yılmaz Kılıçaslan. Sunum Planı. Bir önceki derse bağlantı Programlama yaklaşımları Nesneye-Yönelik Programlamanın İlkeleri Soyutlama Saklama Kalıtım Çok biçimlilik. SINIF. SINIF HİYERARŞİSİ. Bir Önceki Derse Bağlantı.
E N D
NESNEYE YÖNELİK PROGRAMLAMANIN TEMEL İLKELERİGENEL BİR BAKIŞ Yılmaz Kılıçaslan
Sunum Planı • Bir önceki derse bağlantı • Programlama yaklaşımları • Nesneye-Yönelik Programlamanın İlkeleri • Soyutlama • Saklama • Kalıtım • Çok biçimlilik SINIF SINIF HİYERARŞİSİ
Bir Önceki Derse Bağlantı • Gerçeğin bütün düzlemleri karmaşıklığın üstesinden gelmek için, bölümleyerek soyutlama ilkesini kullanır. • Dijkstra’nın belirttiği gibi, karmaşıklıkla nasıl baş edleceği antik dönemden beri bilinmektedir: “böl ve yönet” (divide et impera – divide and rule).
PROGRAMLAMA YAKLAŞIMLARI • Bir programlama dili algoritmalar ve veri yapılarından oluşur. • Programlama dilleri programlamaya yaklaşım açısından 4 gruba ayrılabilir: • Prosedür yönelimli diller (örn. Fortran, Pascal) • Fonksiyon yönelimli diller (örn. Lisp) • Nesne yönelimli diller (örn. C++, C#, Java) • Mantık yönelimli diller (örn. Prolog)
PROSEDÜR YÖNELİMLİ DİLLERE ALTERNATİF OLARAK NESNE YÖNELİMLİ DİLLER • 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++’ı tümüyle prosedürel bir dil olarak kullanabiliriz; fakat, ancak nesneye-yönelik bir yaklaşımla bu dilin bütün potansiyelini açığa çıkarabiliriz.
NESNEYE-YÖNELİK PROGRAMLAMANIN TEMEL KAVRAMLARI • Nesneye-yönelik programlamanın temel kavramları, • büyük programlar yazmayı kolaylaştıran soyutlama veprogramları değiştirmeyi ve korumayı kolaylaştıran saklama • 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 - 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 de Birleştirici Dillerden daha soyut bir ortam sunar.
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 DEKOMPOZİSYON • 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.
PROSEDÜREL DEKOMPOZİSYON "Structured programming appears to fall apart when applications exceed 100,000 lines or so of code" (Stein 1988)
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 “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.
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 “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.
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 = 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.
Verileri Fonksiyonlarla Gizleme • Gerçek bir sarmalama, verileri fonksiyonlarla gizlemeyi gerektirir: Fonk. Erişilebilir verili nesne VERİ Fonk. Fonk. Fonk. Fonk. Fonk. Gizli verili nesne VERİ Fonk. Fonk. Fonk.
SINIF HİYERARŞİSİ • 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. • 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.
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.
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.
ÖZET • NYP’de sınıflar, • Soyutlama • Sarmalama • Hiyerarşik veri yapılanması için gerekli desteği sağlarlar.
Kaynaklar • Robert, L. 2002. Object-Oriented Programming in C++. S˄MS, Indianapolis, Indiana. • Stein, J. March 1988. Object-Oriented Progran-iming and Database Design. Dr.Dobb'sjoumal of Software Tbolsfor tbe Professional Programmer, No. 137, p. 18.