Java ile Nesne Merkezli Programlamaya Giriş 2. Bölüm Nesne Merkezli Programlamanın Temelleri Akın Kaldıroğlu Mayıs 2015
Küçük Ama Önemli Bir Konu Ø Bu dosya ve beraberindeki tüm, dosya, kod, vb. eğiam malzemelerinin tüm hakları Akın Kaldıroğlu na aier. Ø Bu eğiam malzemelerini kişisel bilgilenme ve gelişiminiz amacıyla kullanabilirsiniz ve isteyenleri hip:// adresine yönlendirip, bu malzemelerin en güncel hallerini almalarını sağlayabilirsiniz. Ø Yukarıda bahsedilen amaç dışında, bu eğiam malzemelerinin, Acari olsun/ olmasın herhangi bir şekilde, toplu bir eğiam faaliyeande kullanılması, bu amaca yönelik olsun/olmasın basılması, dağırlması, gerçek ya da sanal/ Internet ortamlarında yayınlanması yasakrr. Böyle bir ihayaç halinde lüten benimle, akin@javaturk.org adresinden ileaşime geçin. Ø Bu ve benzeri eğiam malzemelerine katkıda bulunmak ya da düzeltme ve eleşarilerinizi bana iletmek isterseniz çok sevinirim. Ø Bol Java lı günler dilerim. 2
Tanımlar 3
Soyutlama I Ø Soyutlama, bir şeyin, sahip olunan bakış açısı iabariyle, en önemli özelliklerini ön plana çıkarırken, önemli olmayan özelliklerini basrrmakrr, görmezden gelmekar: Ø Önemli olan özellikler, genel olarak o şeyi diğer şeylerden ayırt eden unsurlardır ya da ana, asli özelliklerdir, Ø Ayırt edici olmayanlara ise ikincil ya da arizi özellikler denir. Ø Zihnimiz karşılaşrğı her nesneyi tek tek algılamak yerine, nesneleri, karekterisak özellikleriyle algılar, sonra da ya zihinde var olan kavramsal bir kategoriyle örtüştürür ya da böyle bir kategori yoksa, bu nesneden yola çıkarak yeni bir kategori oluşturur. 4
Soyutlama II Ø soyutlama İng. abstrac-on (Lat. abstracao < abstrahere = çekip çıkarmak, soymak, ayırmak): 1. Gerçekte ayrılamaz olanı düşüncede ayırma eylemi. (Ör. Biçimi, rengi, boyutları özdekten ayırıp düşünme.) 2. Geneli ve öz olanı arınmış bir biçimde elde etmek için özle ilgili olmayanı bir yana bırakma. Bir tasarımın ya da bir kavramın nitelik ve bağınr gibi öğelerini göz önüne almayarak dikkaa doğrudan doğruya kavrama çeken düşünme eylemi. (Ör. Üçgen kavramında; üçgenin büyük, küçük, eşkenarlı ya da dik açılı oluşunu göz önüne almamak gibi.) Ø Bilim ve Sanat Terimleri Sözlüğü, hip://www.tdk.gov.tr/ 5
Soyutlama III Ø Soyutlamanın İngilizce karşılığı abstrac-on kelimesidir. Ø Britannica da şöyle tarif edilmektedir: The cogniave process of isolaang, or "abstracang," a common feature or relaaonship observed in a number of things, or the product of such a process. Ø Soyutlama, bu anlamda kavramsallaşrrma ile aynı anlamdadır. 6
Neden Soyutlama? Ø Çünkü zihnimiz bu haliyle soyutlama yapmadan bir nesneyi tüm yönleriyle kavrayamaz. Ø Dolayısıyla soyutlama, bir indirgemedir, basitleşarmedir ya da genellemedir. Ø Soyutlamalar, bir bebeğin dünyayı algılama şeklinde apaçık görülür: Ø Köpek: 4 ayaklı, havlayan ve kuyruğunu sallayan canlı 7
Soyutlama Örneği: Haritalar Ø Haritalar, soyutlamaya mükemmel bir örnekarler: Ø Farklı türdeki haritalar, aynı gerçekliğin farklı yönlerini beamlerler, amaçları dışındaki özellikleri göstermezler. Ø Dolayısıyla zihin de soyutlamaları bir amaç doğrultusunda yapar. Ø Amaç ya da ilgi alanı, aynı gerçekliğin farklı soyutlamalarının yapılmasını sağlar: Ø Otel zincirlerinin ya da benzin istasyonlarının haritaları, Ø Aynı binaya bakan farklı meslekteki kişilerin farklı soyutlamaları. 8
İstanbul Metro Haritası 9
"Ne"lik ve "Nasıl"lık Ø Soyutlamalar, bir şeyin "ne"liği üzerine yoğunlaşır, "nasıl"lık üzerine eğilmez. Ø Yani temel özellikleri, o özelliklerin oluşumundan, nasıl meydana geldiğinden bağımsız olarak ele alır: Ø Araba yı algılamak için, motor yapısını bilmeye gerek yoktur, Ø Ya da bir insanla ortaklık kurmak için onun DNA dizilerini bilmeye de gerek yoktur. 10
Soyutlama ve Gerçeklik Ø Soyutlama, sonsuz karmaşıklıktaki gerçekliği basitleşarerek anlama çabasıdır. Ø Aslında bütün soyutlamalar birer kurgudur, insanın gerçekliğe giydirdiği bir kisvedir, çoğu gerçeklikte ya yoktur ya da bizim algıladığımız şekilde değildir: Ø Banka ya da banka hesabı ya da bilgisayarda dosya sistemi tamamen insan kurgusudur Ø Dosya sistemine karşın hard diskin fiziksel yapısı ve dosya kopyalamayı düşünün. Ø Metre ya da gram ise gerçeklikte bizim algıladığımız şekilde değildir. Ø Dolayısıyla insan zihni, gerçekliği algılamak için olduğu kadar kendi gerçekliğini oluşturmak için soyutlamalar yapar. 11
Model I Ø Bir şey ile ilgili farklı açılardan ya da ilgi alanlarından yapılan soyutlamaların bütününe model denir. Ø Modeller, bir neseyi ya da olguyu daha bütünsel olarak ifade ederler, çünkü birden fazla soyutlama barındırırlar. Ø Bu nesne ve olguların çoğu zaman bir tek açıdan yapılan soyutlamayla anlaşılamayacak kadar farklı vechelere sahip olmasındandır. Ø Dolayısıyla modellerle biz gerçeklikteki şeylerin, zihnimizin daha rahat algılaması amacıyla, birden fazla bakış açısıyla elde edilmiş formal tanımlarını yapmış oluruz. 12
Model II Ø Ya da başka bir deyişle soyutlamaları da sınıflandırırız: Ø Bir binanın staak, dinamik açılardan özelliklerini ve davranışlarını farklı soyutlamalarla ortaya koyarız. Ø Aynı binanın elektrik donanımı, ısıtma/soğutma/ havalandırma düzeni ve ısı yalırmı vs., hepsi birer soyutlamadır. Ø Bir binayı ancak bu soyutlamaların bütünü temsil edebilir ki bu durumda binanın modeli elde edilmiş olur. 13
Sınıflandırma Ø Zihin, sonsuz sayıda soyutlama ile uğraşır, Ø Ve bu soyutlamalarla elde edilen genellemeler birer kategori oluşturur, Ø Soyutlamayı yönlendiren ilgi alanları ya da kriterler çerçevesinde kategori oluşturmaya sınıflandırma (classifica-on) denir. Ø Böylece nesneler, olgular, duygular vs. hepsi belli sınıflara ait hale gelirler. Ø Sınıflar, kavramsal genellemeleri, nesneler ise sınıfların gerçeklikte var olan örneklerini oluşturur. 14
Sınıflandırma Örneği Natural Objects Plant Animal Mineral Mammal Fish Bird Reptile Amphibian Insect Dog Cow Monkey... 15
Sınıf ve Nesne Ø Konuşmalarımızda "Köpek dediğin sadık olmalı." ya da "Köpekler çok sadık hayvanlardır." diyorsak, komşunun köpeğinden ya da sokakta az önce karşılaşrğımız köpekten değil de kavramsal olarak köpek sını3ndan bahsediyoruz demekar ve söylediklerimiz, var olmuş ve olacak bütün köpekler için geçerlidir. Ø "Komşunun köpeği çok sadık." dediğimizde ise köpek sınıonın bir örneği ya da nesnesi olan, soyut olmayıp somut olan bir canlıdan bahsediyoruz demekar. Ø İlk durumda "köpek" bir sınıo, "komşunun köpeği nde ise köpek bir nesneyi (object ya da instance) temsil eder. 16
Soyutlama ve Programlama Ø Peki bütün bunların yazılım ve programlamayla ne alakası var? Ø Yazılım gelişarme ve programlama da bir dizi soyutlamayı içerir. Ø Programlama dilleri de birer soyutlamadır haia modeldir: Ø Değişkenler ve veri Apleri Ø Operatörler ve kontrol yapıları Ø Fonksiyonlar Ø Sınıflar, modüller vs. 17
Bilgisayarda Soyutlamalar 18
Programlama Dilleri ve Soyutlama 19
Yazılım Mühendisliği ve Modelleri 20
Yazılım Mühendisliği ve Modeller Ø Çok basit olanlar dışında hemen hiç bir iş problemi, problemi ifade eden kişinin ağzından çıkar çıkmaz programlanıp, bir yazılım haline gearilemez. Ø Dolayısıyla yazılım gelişarme sürecinde, ihayacın alınmasından gerçekleşarilmesine kadar geçen süreçte pek çok modelin kurgulaması, karmaşık yazılımları gelişarilebilir kılar. Ø Ancak bu modeller yardımıyla karmaşık ihayaçları ve yazılmları basitleşarir ve anlaşılır hale geaririz. 21
Yazılım Mühendisliği Modelleri Ø Yazlım gelişarme süreci en temelde üç modelden oluşur: Ø Analiz (Analysis): Bu ihayacın modelidir. Ø Tasarım (Design): Bu ihayacın çözümünün modelidir. Ø Gerçekleş-rme (Implementa-on): Bu da çalışan modeldir. Ø Analiz modeli, ihayacın ne olduğunu anlamaya yönelikar. Ø Tasarım modeli, ihayacın nasıl yerine gearileceğini ortaya koyar. Mimari tasarım da bu modelin içindedir. Ø GerçekleşArme de, analizde detaylandırılan ihayaçların tasarımda ortaya konan çözüm modelini bir programlama dili ile kodlanır. 22
Modeller 23
Modellemenin Zorlukları Ø Sınırı yoktur, sonsuz sayıda ve derinlikte modeller oluşturulabilir. Ø Detay miktarı, amaç ve imkanlarla belirlenir. Ø Mutlak doğru model ancak gerçekliğin kendisidir. Ø Doğruluk ya da yanlışlık, ancak gerçekliğe uygunlukla ölçülebilir, Ø Gerekli özellikleri alıp gereksizleri bırakmak, soyutlamanın dolayısıyla da modelin doğruluğunu belirler. Ø Modellerin tesani yapmak zordur. Ø En iyi test, yazılımın müşteriyi ne kadar memnun eeğidir. 24
Başarılı Yazılım Ø En iyi, başarılı yazılım, ihayaçlarını tam ve doğru olarak yerine gearendir. Ø Bu sebeple doğru modeller için modellenen iş alanı çok iyi bilinmeli ve doğru soyutlamalar yapılmalıdır. Ø Bu bilgi, tecrübe, yararcılık ve yoğun ve sağlıklı bir ileaşim gerekarir. Ø Ayrıca yazılım gelişarmenin prensipleri, yazılım modelleri de iyi bilinmeli ve uygulanmalıdır. 25
Sınıf ve Nesne 26
Nesne (Object) Ø Nesne, insan zihninin algıladığı herhangi bir kavramsal ya da fiziksel şeydir: Ø Öğrenciler, derslere devam ediyorlar. Ø Öğretmen, sınısa öğrencileri dinliyor. Ø Dersler yarın başlıyor. Ø Nesnelerin özellikleri vardır ve bu özellikler, nesnelerin durumlarını (state) ve davranışlarını (behavior) ifade eder: Ø Sarı boyalı sınısa öğrenci şiir okuyor. Ø Kırmızı top suya yuvarlandı. 27
Sınıf I Ø Sınıf, benzer nesnelerin kategorisidir. Ø Sınıf, nesneler için bir kalıprr, şablondur, yani kendisinden ürealecek olan nesnelerin sahip olacağı özellikler ile davranışları tarif eder. Ø Sınıf, nesnelerinin özellikleri değişik Aplerde değişkenlerle ya da bir başka deyişle veri yapılarıyla (data structures), davranışlarını ise metotlarla (method) (fonksiyon (funcaon)/prosedür (procedure)) ifade eder. Ø Nesnenin özelliklerinin bütününe durum (state), metotların bütününe de arayüz (interface) denir. 28
Sınıf II Ø Böylece, aynı sınısan ürealen nesneler aynı Apte olurlar, yani: Ø Aynı özelliklere sahipar ama özelliklerin değerleri değişebilir, Ø Aynı davranışlara sahipar, Ø Davranışlar genelde duruma bağlı olduğundan, farklı durumdaki nesnelerin davranışları da farklı olur. 29
Yazılımın Nesnesi Ø Yazılımın nesnesi ise gerçek dünyadaki, kavramsal ya da fiziksel, bir nesneyi temsil etmek üzere, onun özelliklerini ve davranışlarını ifade eden yapıdır: Ø Yazılımın nesnesi, temsil eeği gerçek dünyadaki nesnenin durumunu, sınıonda tanımlanan değişkenlerle, davranışlarını da metotlarla yerine gearir. Ø Yani nesne, sınıonın ifade eeği soyut yapının hayat bulmuş, gerçekleşmiş halidir. 30
Durum Ø Nesnelerin durumu ile daha çok durağan (staac), görülen ve hissedilen, özellikleri kastedilir ve programlama dillerinde farklı Aplerde bir grup değişken ile ifade edilir. Ø Nesnenin durumunu oluşturan her bir ayrık bilgiye ise özellik (afribute) denir: Ø Öğrenci Ø No, isim, soy isim, doğum tarihi, cinsiyet, adres, bölüm, aldığı dersler, vs. Ø Ders Ø No, isim, bölüm, veren kişi, kredi sayısı, vs. 31
Davranış Ø Nesneler davranırlar, hareket ederler, belli işleri yerine gearirler. Ø Yazılım nesnelerinin davranışlarına, yerine geardiği sorumluluk (responsibility), verdiği hizmet (service) ya da aldığı mesaj (message) olarak bakmak, işimizi kolaylaşrrır: Ø Öğrenci Ø Kayıt olur Ø Ders alır Ø Sınava girer, vs. Ø Ders Ø Öğrencinin kaydolmasına/bırakmasına izin verir Ø Ön şart dersleri hakkında bilgi verir, vs. 32
Mesajlaşma Ø Bir nesne şu 4 şekilden biri ile bir sorumluluk yerine gearir: Ø Nesne, kendi durumu hakkında bilgi verir, Ø Nesne, kendi durumunu değişarir, Ø Nesne, bir işi ya da faaliyea yerine gearir ve zorunlu olmamakla birlikte bu faaliyet sonucunda bize birşeyler geri verir, Ø Nesne, bizim ondan istediğimizi, bir başka nesneye havale eder: Ø Havale edilen nesne bu sefer yukarıdaki 3 durumdan birisiyle istenileni yerine gearir. Ø Nesnelerin birbirlerinden bir sorumluluk/hizmet yerine gearmesini istemeye mesajlaşma (messaging) denir. 33
Nesne- Merkezli Yazılım Ø Nesne- merkezli yazılım sistemi ise, birbirleriyle mesajlaşan ve bu şekilde iş süreçlerini yerine gearen bir grup nesneden başka birşey değildir. Ø Nesneler, yazılım sisteminin yerine geareceği sorumlulukları paylaşırlar öyle ki her bir nesne, temsil eeği kavramla ilgili sorumlulukları yerine gearir. 34
Nesne Sorumluluk İlişkisi I Ø Bir nesne- merkezli yazılım gelişarirken önemli olan, yazılım sisteminin sorumluluklarından yola çıkarak hangi nesnelerin bulunacağı ve sorumlulukların bu nesnelere nasıl dağırlacağıdır. Ø Prosedürel programlamada, nesne kavramı olmadığı için, birbiriyle ilişkili sorumlulukları, fonksiyonlar halinde, olabildiğince birbirlerine yakın olacak şekilde, örneğin aynı dosyaya koymayı tercih ederiz. Ø Bu ise yazılımın daha rahat modellenmesi ve gelişarilmesiyle ilgili pek de önemli bir avantaj sağlamaz. 35
Nesne Sorumluluk İlişkisi II Ø Sağlıklı yazılımlar oluşturmak açısından, sorumlulukları nesnelerle ilişkilendirirken şu iki temel özelliği göz önüne almamız gerekmektedir: Ø İç tutarlılığı yüksek (highly- cohesive) nesneler: Nesne, sadece ve sadece tek bir şeyi soyutlamalı, birden fazla şeyi ile ilgili sorumlulukları bir araya gearmemeli, Ø Bağımlılıkları düşük (lowly- coupled) nesneler: Nesne, üzerine düşen sorumlulukları yerine gearirken, diğer nesnelere olan ihayacı/bağımlılığı olabildiğince az olmalı. Ø İç tutarlılığı düşük nesneler, birden fazla konuyla alakalı sorumluluklara sahip olurlar ve genelde bağımlılıkları da bu yüzden yüksek olur. 36
Yazılım ve Değişim Ø İç tutarlılığı yüksek ve bağımlılıkları az olan nesnelerden oluşan yazılımların, Ø Modellenmeleri, Ø Kodlanmaları, Ø Test edilmeleri, Ø Hatalarının ayıklanması (bug fix) ve Ø herhangi bir sebepten dolayı değişmeleri daha rahat olur Ø Unutmayalım ki yazılımların maliyetlerinin büyük kısmı bakımda harcanmaktadır, gelişarmede değil. 37
Sınıf Tanımlama ve Kod Yapısı 38
Java da Sınıf Tanımlama I Ø Java da sınıf tanımlamak için class anahtar kelimesi kullanılır: <niteleyici>* class <Sınıfİsmi>{ <özellik>* <metot>* } Ø Sınıon tanımı, Java da en geniş blok olan sınıf blokuyla yapılır. Ø Sınıon bir ya da daha fazla niteleyicisi (modifier) olabilir. Ø Sınıon geçerli ve anlamlı bir ismi olmalıdır. 39
Java da Sınıf Tanımlama II Ø Zorunlu olmamakla birlikte sınıon öğeleri, özellikler, kurucular ve metotlar olarak sıralanır. Ø Özellikler farklı Aplerde olan nesne değişkenleridir (instance variables). Ø Metotlar ise nesne fonksiyonlarıdır (instance methods). Ø Kurucu ya da yapılandırıcı (constructor), nesne yararrken çağrılan özel bir Ap metoiur. <niteleyici>* class <Sınıfİsmi>{ <özellik>* <kurucu metot>* <metot>* } 40
Özellik Tanımı Ø Sınısa özellikle şöyle tanımlanır: <niteleyici>* <tip> <değişkenismi> = [ilk değer] Ø Değişkenler için bir grup niteleyici vardır, Ø Java da her değişkenin bir Api olmak zorundadır, Ø Değişkenlere geçerli ve anlamlı bir isim verilmelidir, Ø Değişkene, isteğe bağlı olarak, ilk değer de verilebilir. 41
Metot Tanımı Ø Sınısa metot şöyle tanımlanır: <niteleyici>* <dönüş tipi> <metotismi>(<arguman>*){ <ifade>* } Ø Zorunlu olmamakla birlikte metotlar da farklı niteleyiciler alır, Ø Metotlar, zorunlu olmamakla birlikte, dışarıdan argümanlar alır, bu argümanları, ifadeleri ile işler yani bir iş manrğını yerine gearir ve yine zorunlu olmamakla birlikte, çağrıldıkları ortama bilgi geri döndürürler, Ø Dolayısıyla metota geçilen ve metoian dönen bilgi, metotun çağrıldığı ortam ile metot arasındaki ileaşimin öğelerindendir. 42
Java Kaynak Kodunun Yapısı Ø Sınıon bütün öğeleri sınıf bloku içinde tanımlanır, Ø Sınıon, sadece paket (package) bilgisi ile koduna dahil edeceği (import) diğer yapıların ifadeleri sınıf dışında tanımlanır. Ø En yaygın sınıf niteleyicisi public Ar ve sınıfa her yerden erişilebileceğini ifade eder. Ø Her public sınıf (arayüz ya da enum), kendi ismini taşıyan ve.java uzanrsına sahip olan bir dosyada yer almalıdır. Ø Dolayısıyla her.java kaynak kodu dosyasında en fazla bir tane public sınıf olabilir. 43
<package cümlesi> <import cümlesi>* public class <Sınıfİsmi-1>{... } class <Sınıfİsmi-2>{... }...... class <Sınıfİsmi-n>{... } 44
Nesne Yaratma Ø Java da nesne yaratmak için new anahtar kelimesi kullanılır, Ø new den sonra da kurucu metot çağrısı gelmelidir, Ø YaraRlan nesneyi, kendisine ulaşmakta kullanılacak olan bir referansa atamak gereklidir. Ø Bunların hepsini bir sarrda yapabiliriz: Student studentobject = new Student(); Ø Yukarıdaki sarrda, atamanın sağ taraonda oluşturulan nesne, sol taraondaki Student Apinden olan studentobject isimli bir referansa atanmaktadır. 45
Araba Ø Bir "Araba" soyutlaması yapın. Ø Soyutlamada bulunması gereken davranışlar nelerdir? Ø Gitmek Ø Durmak Ø Hızlanmak Ø vs. Ø Soyutlamada bulunması gereken durum bilgileri nelerdir? Ø Marka Ø Model Ø Yıl Ø Hız 46
public class Car { String make; String model; String year; int speed; int distance; } public void go(int newdistance){ distance += newdistance; } public void accelerate(int newspeed){ speed = newspeed; } public void stop(){ speed = 0; } public String getinfo(){ return "Car Info: " + year + " " + make +...; } 47
Main Metot Ø Java da pek çok sınıonız olsa bile en az bir tanesi main isimli özel bir metota sahip olmalıdır. Ø main metota sahip olan sınıf JVM e geçilerek çalışrrılabilir. Ø main metot, sistemin çalışmaya başladığı yerdir. Ø Nerede tanımlandığının pek önemi yoktur. Ø Dolayısıyla diğer sınıfların nesneleri bu metoia oluşturulur ve üzerindeki metotlar burada çağrılarak sistem çalışmaya başlar. Ø main metotun arayüzü (interface) aşağıdaki gibidir: public static void main(string[] args) 48
Test Sınıo Ø Şimdi de oluşturduğumuz sınıon, test ya da istemci (client) sınıonı oluşturup, main metot içerisinde bir kaç tane araba nesnesi yararn. Ø Daha sonra bu nesnenin durumunu değişarin ve üzerindeki metotları çağırın. Ø YaraRlan nesne üzerindeki değişken ve metotlara "." notasyonuyla ulaşılır: Car arabam = new Car(); int hiz = arabam.speed; arabam.go(50); 49
public class CarTest { public static void main(string[] args) { Car car1 = new Car(); car1.make = "Mercedes"; car1.model = "C200"; car1.year = "2011"; car1.distance = 0; car1.speed = 0; } } String infocar1 = car1.getinfo(); System.out.println(infoCar1); car1.accelerate(80); car1.go(10); infocar1 = car1.getinfo(); System.out.println(infoCar1); car1.accelerate(120); car1.go(20); infocar1 = car1.getinfo(); System.out.println(infoCar1); 50
Diğer Soyutlamalar Ø Aşağıdaki açılardan bakrğınızda soyutlamanızda neler değişir? Ø Sürücü Ø Akaryakıt kullanımı, maksimum hız Ø SaRcı Ø FiyaR Ø Araba tasarımcısı Ø Üstü açılabilir mi? Ø Tamirci Ø Motor özellikleri Ø Sigortacı Ø Nerede ve kim kullanıyor, hasarı var mı? 51
Özet Ø Bu bölümde nesne merkezli programlamaya giriş yaprk. Ø Bu amaçla, Ø Soyutlama, Ø Ne lik ve nasıl lık ayırımı, Ø Sınıf ve nesne kavramlarını, Ø Nesnenin durumu ve davranışlarını Ø Model kavramını ve Yazılım Mühendisliği modellerini, Ø Java kaynak kodunun yapısını işledik. 52