Nesne Yönelimli Programlamaya Giriş - Cem Ahmet MERCAN http://www.be.itu.edu.tr/~mercan/ 09/04/009
Nesne Yönelimli Programlama ) Object - Oriented Programming ( Bilgisayar programının, nesneler ve aralarındaki ilişkiler biçiminde yapılandırılmasıdır. Nesneler, sınıf denilen kalıplar kullanılarak oluşturulur. Bazı dillerde herşey bir nesnedir. Bunlara tam nesne yönelimli diller denir. Diğerlerinde ise nesneler kullanılabilmesine rağmen, herşey bir nesne değildir. C++, ikinci gruba girer.
Başlangıçta Programlama 4 5 6 7 8 9 0 Değişken Tanımı Değişken Tanımı Değişken Tanımı if/ goto Değiş. Sonu Program alt alta yazılmış işler (komutlar) listesinden ibaret. Sınama (if) ve Atlama (goto) komutları ile kod basit bir listenin ötesinde bir işlev görür.
Başlangıçta Programlama 4 5 6 7 8 9 0 4 5 6 7 8 9 Küçük kodlar için en basit yaklaşım. Küçük programlar için yazması en kolayı. Herşey programcının emrinde: Tüm verilere her yerden ulaşılabilir, her noktadan bir diğer noktaya atlanabilir.
Başlangıçta Programlama 4 5 6 7 8 9 0 4 5 6 7 8 9 Birkaç yüz satırlık kodu takip etmek zor. Birkaç bin satır kodu anlamak imkansız gibi! Programın tekrar kullanım olanağı son derece sınırlı. Problemdeki en ufak bir değişiklik, kodda büyük değişiklikler gerektirebilir.
Programlar Kaç Satır? RedHat 7. ( 0 0 ):. 47. 470 kernel -. 4.. 065. 4 mozilla. 87. 608 XFree86-4. 0 984. 076 gcc -. 96 474. 89 LAPACK 455. 980 gimp -.. 40. 799 mysql -. 04. 89 tetex -. 0 98. 74 qt-.. 0 Fedora 9 ( 0 0 8 ): 5. 96. 705 kernel -. 6. 5 4. 99. 96 OpenOff ice. 8. 05 Gcc- 4.. 0. 664. 66 Ent. Sec. Client. 6. 5 eclipse -.... 90 Mono-. 9.. 088. 84 f irefox -. 0. 79. 48 bigloo. 0b. 788. 9 gcc -. 4. 6
Çözüm: Böl, Parçala, Yönet! (ama nasıl?)
Programlamada İstenen Özellikler Minimum Karmaşıklık Bakım Kolaylığı Taşınabilirlik Genişleyebilirlik Yeterli ve Gerekli Miktarda Özellik İçermek Yeniden Kullanılabilirlik Yüksek Çağrılma / Düşük Çeşitte Çağırma Bölümler Arası Maksimum Ayrışma Katmanlı Yapıda olmak Standart (Tanıdık ve Anlaşılabilir) bir yapı
Programlama Modelleri ) Paradigmaları ( Unstructured, Structured, Procedural, Modular, Object -oriented, Component based, DataFlow,...
Unstructured Programlama 4 5 6 7 8 9 0 Değişken Tanımı Değişken Tanımı Değişken Tanımı if/ goto Değiş. Sonu Program alt alta yazılmış komutlardan oluşan tek bir dosya. Sınama (if) ve Atlama (goto) komutları ile değişik girdilerde / durumlarda da programın çalışması sağlanır.
Unstructured Programlama 4 5 6 7 8 9 0 4 5 6 7 8 9 Sınama (if) ve Atlama (goto) komutları ile kod kolayca programcının anlama sınırlarının ötesinde bir karışıklığa ulaşır. Birkaç bin satır kodda takip etmek imkansız
yin: x=0; Örnek Program ) Unstructured Programlama ( int x=0, y=0; double xd[0][00], xb[0],xr[00],z; z=0.0; xin: z=z+xd[y][x]*xr[x]; x=x+; if (x<00) goto xin; xb[y]=z; y=y+; if (y<0) goto yin;
Programlama Modelleri ) Paradigmaları ( Unstructured, Structured, Procedural, Modular, Object -oriented, Component based, DataFlow,
Structured Programlama 4 5 6 7 8 9 0 Değişken Tanımı Değişken Tanımı Değişken Tanımı for/ while Değiş. Sonu For-while-do döngü yapısı teoride bir if-goto ile aynı şey ise de, pratikte döngünün sınırlarının daha aşikar olmasını sağladığından okunurluk sağlar.
Örnek Program ) Structured Programlama ( int x, y; double xd[0][00], xb[0],xr[00],z; for (y=0; y<0; y++) { z=0.0; for (x=0; x<00; x++) { z=z+xd[y][x]*xr[x]; } xb[y]=z; }
Örnek Program (Kimlik Karşılaştır) Nüfus Cüzdanında 6 bilgi var! char Seri ] 4 [; char No] 8 [; char Tc] [; char Soyad ] [; char Ad] [; char Baba ] [; char Ana] [; char Dyeri ] [; unsigned DTarihi; char Cins; char MedeniHali; char Dini] 6 [; char Kan] 8 [; char KO_ il] [; char KO_ ilce] [; char KO_ mahkoy ] [; char KO_ ciltno] 8 [; char KO_ aileno ] 8 [; char KO_ sirano ] 8 [; char Veril _ Yer ] [; char Veril _ Neden ] 6 [; char KayitNo ] 8 [; unsigned Veril _ Tarihi; char Hazirlayan ] 64 [; char Onaylayan ] 64 [; char OnceSoyad ] [; En az x 6 = 5 Bilgi Karşılaştırılacak Güv enli çözüm 6 x5 = 0 Parametre ister.
int bulunan=-99; Kimlik Karşılaştır (Kod örneği, 78 parametreli) for (x=0 == ) then x<kayit_sayisi == ) then x++) { if (!strncmp(seri[x],a_seri,n_seri) &&!strncmp(no[x], a_no,n_no) &&! strncmp(tc[x], a_tc,n_tc) &&!strncmp(soyad[x], a_soyad, n_soyad) &&! strncmp(ad[x], a_ad, n_ad) &&!strncmp(baba[x], a_baba, n_baba) &&! strncmp(ana[x], a_ana, n_ana) &&!strncmp(dyeri[x], a_dyeri, n_dyeri) && (DTarihi == a_dtarihi) && (sizeof(a_dtarihi) == n_dtarihi) && (Cins == a_cins) && (n_cins == ) && (MedeniHali == a_medenihali) &&! strncmp(dini[x], a_dini, n_dini) &&!strncmp(kan[x], a_kan, n_kan) &&! strncmp(ko_il[x], a_ko_il, n_ko_il) &&!strncmp(ko_ilce[x], a_ko_ilce, n_ko_ilce) &&...
Kimlik Karşılaştır [Devamı] (Kod örneği, 78 parametreli)...!strncmp(ko_mahkoy[x], a_ko_mahkoy,n_ko_mahkoy) &&! strncmp(ko_ciltno[x], a_ko_ciltno, n_ko_ciltno) &&!strncmp(ko_aileno[x], a_ko_aileno, n_ko_aileno) &&!strncmp( KO_sirano[x], a_ko_sirano, n_ko_sirano) &&!strncmp(veril_yer[x], a_veril_yer, n_veril_yer) &&! strncmp( Veril_Neden[x], a_veril_neden, n_veril_neden) &&! strncmp(kayitno[x], a_kayitno, n_kayitno) && (Veril_Tarihi == A_Veril_Tarihi) && (sizeof(veril_tarihi) == n_veril_tarihi) &&! strncmp(hazirlayan[x], a_hazirlayan, n_hazirlayan)!strncmp( Onaylayan[x], a_onaylayan, n_onaylayan) &&!strncmp(oncesoyad[x], a_oncesoyad, n_oncesoyad)) { bulunan=x; break;} } if (bulunan<0) printf( Aranan Kayit Bulunamadi!\n ); else printf( Aynisi BULUNDU! Kayit No: %d\n,bulunan);
Programlama Modelleri ) Paradigmaları ( Unstructured, Structured, Procedural, Modular, Object -oriented, Component based, DataFlow,
Procedural Programlama 4 5 6 7 8 9 0 Global Değişken G Yerel Değişken M Prosedür A Prosedür A Yerel Değişken Z Değiş. Sonu 4 Yerel Değişken P
Procedural Programlama 4 5 6 7 8 9 0 Global Değişken G Yerel Değişken M Prosedür A Prosedür A Yerel Değişken Z Değiş. Sonu 4 5 Input Output Yerel Değiş. P Yerel Değiş. X
Örnek Program ) Procedural Programlama ( int main() { double xd[0][00], xb[0],xr[00]; matvecmul (double *res, double *mat, double *vec, int rown, int coln ) { double z; for (y=0; y<rown; y++) { matvecmul(xb,xd,xr,0,00); return 0; } } z=0.0; for (x=0; x<coln; x++) z=z+mat[(y*coln)+x]*vec[x]; res[y]=z; }
Procedural Programlama Özellikle diziler pointer ile fonksiyona geçilmesini gerektirdiği için tehlikededir. Pointer ile erişimde sorunlar: C'de dizi boyutu saklanmaz, diziler tehlikededir. Pointer aritmetiği hataya açıktır. Pointer ile ulaşılan veri değiştirilebilir. Değiştirilmesi gereken verinin içeriği sınırlanamaz.
Kimlik Karşılaştırması 4 (78 parametreli) int bulunan=-99; for (x=0; x<kayit_sayisi; x++) { if ( karsilastir( Seri[x],a_Seri,n_Seri, No[x],a_No,n_No, Tc[x],a_Tc,n_Tc, Soyad[x],a_Soyad,n_Soyad, Ad[x],a_Ad,n_Ad, Baba[x],a_Baba,n_Baba, Ana[x],a_Ana,n_Ana, Dyeri[x],a_Dyeri,n_Dyeri, Dtarihi,a_DTarihi,n_DTarihi, Cins,a_Cins,n_Cins, MedeniHali,a_MedeniHali, Dini[x],a_Dini,n_Dini,Kan[x],a_Kan,n_Kan, KO_il[x],a_KO_il,n_KO_il, KO_ilce[x],a_KO_ilce,n_KO_ilce, KO_mahkoy[x],a_KO_mahkoy,n_KO_mahkoy, KO_ciltno[x],a_KO_ciltno,n_KO_ciltno,...
Kimlik Karşılaştırması 5 (78 parametreli)... KO_aileno[x],a_KO_aileno,n_KO_aileno, KO_sirano[x],a_KO_sirano,n_KO_sirano, Veril_Yer[x],a_Veril_Yer,n_Veril_Yer, Veril_Neden[x],a_Veril_Neden,n_Veril_Neden, KayitNo[x],a_KayitNo,n_KayitNo, Veril_Tarihi,a_Veril_Tarihi,n_Veril_Tarihi, Hazirlayan[x],a_Hazirlayan,n_Hazirlayan, Onaylayan[x],a_Onaylayan,n_Onaylayan, OnceSoyad[x], a_oncesoyad,n_oncesoyad)) { bulunan=x; break;} } if (bulunan<0) printf( Aranan Kayit Bulunamadi!\n ); else printf( Aynisi BULUNDU! Kayit No: %d\n,bulunan);
Procedural Programlama 4 5 6 7 8 9 0 Prosedür A Prosedür A Değiş. Sonu
Procedural Programlama 4 5 6 7 8 9 0 Global Değişken G Prosedür A int Prosedür A Yerel Değişken M Yerel Değişken Z Değiş. Sonu int int char Struct double double int
Struct struct T arih { int Gun; int Ay; int Yil; }; bayram. Gun= ; bayram. Ay= 4 ; bayram. Yil= 0 0 9 ; tatiller[0 ]. Gun= ; tatiller[5 ]. Yil= 8 5 6 ; struct Tarih bayram; struct Tarih tatiller[ 0 ]; struct T arih * birgun; birgun = &bayram; birgun- > Gun= 0 ; birgun- > Ay= 8 ;
Örnek Program (Kimlik Karşılaştır) struct Kimlik Struct Kimlik { char Seri ] 4 [; char No] 8 [; char Tc] [; char Soyad ] [; char Ad] [; char Baba ] [; char Ana] [; char Dyeri ] [; char Cins; char MedeniHali; char Dini] 6 [; char Kan] 8 [; char KO_ il] [; char KO_ ilce] [; char KO_ mahkoy ] [; char KO_ ciltno] 8 [; char KO_ aileno ] 8 [; unsigned Dtarihi; char KO_ sirano ] 8 [; char Veril _ Yer ] [; char Veril _ Neden ] 6 [; char KayitNo ] 8 [; unsigned Veril _ Tarihi; char Hazirlayan ] 64 [; char Onaylayan ] 64 [; char OnceSoyad ] [; };
Kimlik Karşılaştırması 7 (78 parametreli) struct Kimlik aranan; struct Bakilacak bakilacak; struct Kimlik mevcut_kayitlar[kayit_sayisi]; int bulunan=-99; for (x=0; x<kayit_sayisi; x++) { if ( karsilastir( mevcut_kayitlar[x], aranan,bakilacak)) { bulunan=x; break; } } if (bulunan<0) printf( Aranan Kayit Bulunamadi!\n ); else printf( Aynisi BULUNDU! Kayit No: %d\n,bulunan);
Örnek Program (Kimlik Karşılaştır) Struct Kimlik / / DAHA SADE OLSA DAHA KULLANISLI OLURDU! struct Kimlik { char Seri ] 4 [; char No] 8 [; char Tc] [; char Soyad ] [; char Ad] [; char Baba ] [; char Ana] [; char Dyeri ] [; char Cins; char MedeniHali; char Dini] 6 [; char Kan] 8 [; char KO_ il] [; char KO_ ilce] [; char KO_ mahkoy ] [; char KO_ ciltno] 8 [; char KO_ aileno ] 8 [; unsigned Dtarihi; char KO_ sirano ] 8 [; char Veril _ Yer ] [; char Veril _ Neden ] 6 [; char KayitNo ] 8 [; unsigned Veril _ Tarihi; char Hazirlayan ] 64 [; char Onaylayan ] 64 [; char OnceSoyad ] [; };
Örnek Program (Kimlik Karşılaştır) Struct Kimlik struct Kimlik struct Kimlik struct Kimlik { { { char Soyad ] [; char Soyad ] [; char Soyad ] [; char Dini] 6 [; char Ad] [; char Ad] [; char Ad] [; char Kan] 8 [; }; char Baba ] [; char Baba ] [; char KO_ il] [; char Ana] [; char Ana] [; char KO_ ilce] [; char Dyeri ] [; char Dyeri ] [; char KO_ mahkoy ] [; unsigned Dtarihi; unsigned Dtarihi; char KO_ ciltno] 8 [; char Cins; char Cins; char KO_ aileno ] 8 [; char MedeniHali; char MedeniHali; char KO_ sirano ] 8 [; }; };
Kimlik Karşılaştırması 0 (78 parametreli) struct Kimlik aranan; struct Bakilacak bakilacak; struct Kimlik mevcut_kayitlar [ Kayit_Sayisi ]; int bulunan=-99; for (x=0; x<kayit_sayisi; x++) { if ( karsilastir ( mevcut_kayitlar [ x], aranan, bakilacak )) { bulunan=x; break; } } if (bulunan<0) printf( Aranan Kayit Bulunamadi!\n ); else printf( Aynisi BULUNDU! Kayit No: %d\n,bulunan);
Procedural Programlama Prosedür A Global Değişken G Yerel Değişken M Yerel Değişken Z. Değiş Sonu 4 5 6 7 8 9 0 Prosedür A
Procedural Programlama Tek dosyada çok fazla fonksiyon kontrolü ve genel yapının anlaşılmasını engeller. Yazılan kodun başka projelerde de kullanılması zorlaştırır. Kodu başka programcılara kullandırmanın tek yolu tüm kodu vermektir. Kodu başka programcıların kullanmasının tek yolu kabaca da olsa tüm kodu anmalarıdır ki, hiçbir ayrıma gidilmeden verilecek yüzlerce binlerce fonksiyonu anlamak çok zor!
Procedural Programlama. Değiş Sonu 4 5 6 7 8 9 0 Prosedür A Prosedür A Struct Struct Struct Struct Struct Struct
Procedural Programlama Tek dosyada çok fazla fonksiyon beraberinde birçok global değişken, macro ve diğer fonksiyonların kullandığı alt fonksiyonlar getirir. Kodu başka bir yerde kullanmaya kalkılınca bu yapılardan hangisinin hangi fonksiyon için gerekli olduğunu takip etmek çok zor. Kopyala yapıştır yöntemi binlerce satırda işe yaramaz. Başka dosyadan getirilen kod ile yeni dosyadaki kodda aynı isimli değişken/fonksiyon varsa tüm kodu gözden geçirmek gerekir ki çok zor!
Programlama Modelleri ) Paradigmaları ( Unstructured, Structured, Procedural, Modular, Object -oriented, Component based, DataFlow,
Modular Programlama Program herbiri kendi verisine sahip, belli bir iş için özelleşmiş ayrık parçalara ayrılır. Her parçanın kendi işileri için fonksiyonları vardır. Program, ana programın modülünün diğer modülleri (diğer modüllerin fonksiyonlarını) çalıştırması şeklinde bir ayrık yapıdadır. Modüller arası haberleşme bu amaçla yazılmış fonksiyonlar yolu ile olur.
Modular Programlama 4 5 6 7 8 9 0 Modul Bildirimleri Global Değişken G Yerel Değişken M Prosedür Yerel Değişken Z Değiş. Sonu
Modular Programlama Modul Bildirimleri Global Değişken G Yerel Değişken M Struct Tanımı Procedür Tanımı Procedür Tanımı 4 5 Struct T anımı Procedür Tanımı 6 7 Yerel Değişken Z Procedür Tanımı 8 9 0 Prosedür Değiş. Sonu Struct T anımı Procedür Tanımı Procedür Tanımı
Modular Programlama # include < A> Global Değişken G Yerel Değişken M Struct T anımı Procedür T anımı Procedür T anımı 4 5 # include < A> 6 7 Yerel Değişken Z 8 9 0 Prosedür Değiş. Sonu
Örnek Program ) Procedural Programlama ( // ANA PROGRAM prog. cpp #include matvec.h int main() { double xd[0][00], xb[0],xr[00]; matvecmul(xb,xd,xr,0,00); return 0; } // M ODULE matvec. cpp #include matvec.h matvecmul (double *res, double *mat, double *vec, int rown, int coln ) { double z; for (y=0; y<rown; y++) { z=0.0; for (x=0; x<coln; x++) z=z+mat[(y*coln)+x]*vec[x]; // HEADER matvec. h matvecmul (double *res, double *mat, double *vec, int rown, int coln ); } } res[y]=z;
Modular Programlama Modüller veri ve fonksiyon karmaşasına bir çözüm getirir. Ancak bu struct ve fonksiyon çeşitliği sorununu çözmez, artırır. Ayrık veri yapıları, veri tipi güvenliğini bozar. Hazırlanırken ayrı yerlerde oldukları için modül yazımı kolaydır, ama kullanırken tekrar bir araya geldikleri için kullanımları karışıklaşır. Verileri ayrılığı, bilmediğiniz bir kodun verilerini koruma zorunluluğunu (zorluğunu) getirir.
Örnek Program (Kimlik Karşılaştır) Struct Kimlik MODULE A MODULE B MODULE C Tümü Aynı struct Kimlik struct Kimlik struct Kimlik İsimde! { { { char Soyad ] [; char Soyad ] [; char Soyad ] [; char Dini] 6 [; char Ad] [; char Ad] [; char Ad] [; char Kan] 8 [; }; char Baba ] [; char Baba ] [; char KO_ il] [; char Ana] [; char Ana] [; char KO_ ilce] [; char Dyeri ] [; char Dyeri ] [; char KO_ mahkoy ] [; unsigned Dtarihi; unsigned Dtarihi; char KO_ ciltno] 8 [; char Cins; char Cins; char KO_ aileno ] 8 [; char MedeniHali; char MedeniHali; char KO_ sirano ] 8 [; }; };
Örnek Program (Kimlik Karşılaştır) Struct Kimlik / / MODULE A, parametreli Kimlik struct' ını kullanıyor Karsilastir ( struct * Kimlik a, struct Kimlik b ) {... }; / / MODULE B, 8 parametreli Kimlik struct' ını kullanıyor Karsilastir ( struct * Kimlik a, struct Kimlik b, struct Bakilacak c ) {... }; / / MODULE C, 7 8 parametreli Kimlik struct' ını kullanıyor Karsilastir ( struct * Kimlik a, struct Kimlik b, struct Bakilacak c ) {... };
Programlama Modelleri (Paradigmaları) Unstructured, Structured, Procedural, Modular, Object- oriented, Component based, DataFlow,
Object - Oriented Programlama 4 5 6 7 8 9 0 Global Değişken G int Yerel Değişken M Method Method 4 Yerel Değişken Z Değiş. Sonu int Pro te cte d: Public: char double double int Method Method Method Method int 4
Class class Tarih { priv ate: public: int Gun; int Ay; int Yil; int gun() { return Gun;} int ay() { return Ay;} int yil() { return Yil;} bool Tarih:: ayarla( int g, int a, int y) } { if (( g > 0 )&&( g< = )) return false; if (( a > 0 )&&( a< = )) return false; if (( y > 0 )&&( g< = 9 9 9 9 )) return false; Gun= g; Ay= a; Yil= y; return true; bool ayarla( int g, int a, int y); };
Class T arih bayram; Tarih tatiller[ 0 ]; T arih * birgun; bayram. Gun= ; bayram. Ay= 4 ; bayram. Yil= 0 0 9 ; HATA! HATA! HATA! Derlenemez birgun = &bayram; tatiller[0 ]. ayarla(,, 0 0 ); x= tatiller[5 ]. gun(); bayram. ayarla(,4, 0 0 9 ); cout< < Gün: < < bayram. gun(); birgun- > ayarla(,, ); cout< < Ay: < < bayram. ay(); cout< < Yıl: < < bayram. yil(); birgun- > ayarla(, 6, 0 0 9 ); birgun- > ayarla(-,0,- 9 );
Örnek Program ) Object - Oriented Programlama ( // ANA PROGRAM prog. cpp #include matvec.h // M ODULE matvec. cpp #include matvec.h int main() { matrix xd(0,00); vector xb(0), xr(00); return 0; } xb=xd*xr; // HEADER matvec. h matrix::matrix (int x, int y) {... } vector * matrix::operator* (matrix x, vector y) {... } vector::vector(int s) {... } vector & vector::operator= (vector & a) {... } class matrix {... } class vector {... }
Programlama Modelleri (Paradigmaları) Unstructured, Structured, Procedural, Modular, Object -oriented, Component based, DataFlow,
Referanslar ) ( More than a Gigabuck : Estimating GNU/ Linux' ssize '' by David A. Wheeler, located at http:// wwwdwheeler.. com / sloc ) ( Estimating the Total Development Cost of a Linux Distribution By Amanda McPherson, Brian Proff itt, and Ron Hale- Evans. http:// wwwlinuxfoundation.. org/ publications / estimatinglinux. php ) ( Code Complete, second edition, Steve McConnell, Microsoft Press, ISBN : 0-756 -967-0 ) 4 ( Introduction to Object - Oriented Programming Using C + +, Peter Müller, http:// gd. tuwien. ac. at / languages / c/ c+ + oop - pmueller / tutorial. html ) 5 ( http:// en. wikipedia. org/ wiki / Object - orientated _ programming