NESNEYE YÖNEL*K PROGRAMLAMA

Download Report

Transcript NESNEYE YÖNEL*K PROGRAMLAMA

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
Arasınav: %30
Ödevler+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++
• Başvurular
• UML 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, ödevler ile birlikte 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 (sunum+kod)
olarak teslim edilecek. Proje bitiminde her grup
projesine ait sunumu uygulama dersinde sunacak.
Ödevler hakkında
• Dönem boyunca verilecek ödevler, Microsoft .Net C++,
Dev C++, Microsoft Visual C++ veya Linux ta herhangi bir
C++ ortamında yazılacaktır.
• Her kişi ödevde yazdığı kodun açıklamasını ve ödevde
öğrendiklerini Microsoft WordPad ya da .doc uzantılı
Word Dokümanı şeklinde yazmalıdır.
Not: Projelerin ve ödevlerin 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)
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 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. 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
{ 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