NESNEYE YÖNELİK PROGRAMLAMA
Temel Kavramlar
Özlem AYDIN
Trakya Üniversitesi
Bilgisayar Mühendisliği Bölümü
Not: Bu sunumda Doç. Dr. Yılmaz KILIÇASLAN’ın Nesneye Yönelik Programlama
dersi sunumlarından faydalanılmıştır.
Derse ilişkin genel bilgiler
Dersi veren: Özlem AYDIN
E-mail: [email protected]
Dersin yardımcıları: Edip Serdar GÜNER
Önder AÇIKGÖZ
Dersin web sayfası:
http://ozlemaydin.trakya.edu.tr/d1.html
Derse ilişkin genel bilgiler
Değerlendirme
Vize: %30
Proje: %20
Final: %50
Kaynaklar
• C ve C++, Harvey M. Deitel & Paul J. Deitel, Sistem Yayınları, 2004
• C++ Temel Öğrenim Kılavuzu, Herbert Schildt, Alfa Basım Yayın
Dağıtım, 2010
Derse ilişkin genel bilgiler
Dersin Amacı
Nesneye Yönelik Programlama dersinin iki ana amacı vardır:
1. nesneye yönelik programlamanın temel ilke ve kavramlarını
öğrenmek
ve
2. bu ilke ve kavramları C++ programlama dili ile etkin olarak
kullanabiliyor olmak.
Derse ilişkin genel bilgiler
Ders Konuları
• Nesneye yönelik programlamanın genel kavramları
• C dilinin bir üst kümesi olarak C++
• UML (Unified Modelling Language-Bütünleşik
Modelleme Dili) ile analiz
• UML ile tasarım
• Soyutlama
• Sarmalama
• Nesneye yönelik yaklaşımda dinamik bellek
yönetimi
Derse ilişkin genel bilgiler
Ders Konuları- devam…
• ‘Static’ eleman sahalar
• Arkadaş sınıf ve fonksiyonlar
• Eleman nesneler
• Nesne dizileri
• Kalıtım
• Sanal sınıflar
• Çok biçimlilik
• Diğer nesneye yönelik programlama dilleri
Projeler hakkında
• En fazla 5’er kişilik proje grupları oluşturulacak. Bir
hafta
sonrasında
proje
grupları
üyelerini
belirleyecek ve devamındaki bir haftalık süre
içerisinde seçmiş oldukları konuyu bildirecekler. Bir
proje konusunu en fazla iki grup seçebilir. Bu
sayıdan fazla olması durumunda kura çekilecek.
İsteyen grup kendi belirlediği proje konusu ile
gelebilir. Onay verdiğimiz takdirde belirledikleri
projeyi yapabilirler.
• Bütün projeler nesneye yönelik modellemeye ait
kavramları uygulamaya yönelik çalışmalar olmalıdır.
Projeler hakkında – devam…
• Projeler, başarı notunun hesaplanmasında %20’lik paya
sahiptir (vize %30, final %50).
• Projelerin Analiz-Tasarım aşamasında projeye ait UML
diyagramları hazırlanıp doküman olarak teslim edilecek.
• Projeler dönem sonunda doküman (rapor+kod)
olarak teslim edilecek. Proje bitiminde her grup
projesine ait sunumu uygulama dersinde sunacak.
• Not: Projelerin teslim şekline ilişkin ayrıntılı bilgi için
http://ozlemaydin.trakya.edu.tr/d1.html
sayfasına
bakınız.
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, C)
Fonksiyon yönelimli diller (örn. Lisp)
Nesne yönelimli diller (örn. C++, C#, Java)
Mantık yönelimli diller (örn. Prolog)
Prosedür yönelimli (yapısal) yaklaşım
• Prosedür yönelimli programlamada amaç problemi
alt parçalara bölerek bu parçaların çözümlerinin
birleştirilmesidir.
• Nesne yönelimli programlama yaklaşımlarını
kullanan dillerin neredeyse tamamı yapısal
programlamayı da bünyelerinde barındırmaktadır.
Fonksiyonel yönelimli yaklaşım
• Fonksiyonel yönelimli yaklaşımda bir veri işleme işinde
yapılacak işler sadece fonksiyon çağrıları ile ifade edilir.
• Kod tekrarını engellemekte ve aynı kodun farklı şartlar
için tekrar tekrar çalışmasını sağlamaktadır.
• Kodun okunabilirliğini arttırmakta ve kod analizini daha
kolay hale getirmektedir.
• Programın tasarlanması aşamasında tasarımcıya
modüler yaklaşım yapmasını sağlamaktadır.
Mantık yönelimli yaklaşım
• Mantık yönelimli yaklaşımda bir problemin
çözümünde
uygun
mantıksal
terimler
kullanılarak
bir
algoritma
kurulabileceği
görülmektedir.
• Burada problemin çözümünün nasıl bulunacağı
değil, problemin ne olduğunun tanımlaması
yapılır.
Nesne Yönelimli Yaklaşım
• Nesneye yönelik yaklaşım 1960’lı yılların sonuna doğru,
yazılım dünyasında beliren bir bunalımın sonucu olarak
ortaya çıkmıştır. Yazılımların karmaşıklığı ve boyutları
sürekli artıyor, ancak belli bir nitelik düzeyi korumak
için gereken bakımın maliyeti zaman ve çaba olarak daha
da hızlı artıyordu.
PROSEDÜR
YÖNELİMLİ
DİLLERE
OLARAK NESNE YÖNELİMLİ DİLLER
ALTERNATİF
• 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 nesneleri
ve 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 İLKELERİ
• Nesneye-yönelik programlamanın temel ilkeleri
şunlardır:
▫
▫
▫
▫
Soyutlama
Saklama
Kalıtım
Çok biçimlilik
SINIF
SINIF HİYERARŞİSİ
NESNEYE-YÖNELİK PROGRAMLAMANIN TEMEL KAVRAMLARI
• 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
“Soyutlama” , belirli
bir bakış açısından,
önemli özelliklere
odaklanabilmek için
ayrıntıları göz ardı
etme sürecidir.
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.
• 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.
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 SOYUTLAMA-3
• 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-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.
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
{ char
long
char
char
KisiBilgisi
isim[30];
telefon;
adres1[30];
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.
SARMALAMA
• 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.
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.
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?
Hayvan
Aslan
Kaplan
Ayı
İnek
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 üstsı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
Download

Nesneye Yönelik Programlamanın Temel İlkeleri