Bölüm 12 Nesneye Yönelik Programlama
Transkript
Bölüm 12 Nesneye Yönelik Programlama
Bölüm 12 Nesneye Yönelik Programlama (NYP) Object Oriented Programming (OOP) Object-Oriented Bölüm 12 Başlıklar ş Giriş Nesneye Yönelik Programlama (NYP) Nesneye Yönelik Programlama Dillerinde Tasarım Konuları C++ Nesneye Yönelik Programlama J Java N Nesneye Yö Yönelik lik P Programlama l C# Nesneye Yönelik Programlama 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 2 Girişş NYP destekleyen dillerin kategorileri: 1. NYP desteği ğ eklenmiş ş diller C++ (ayrıca yordamsal ve veriye yönelik programlamayı da destekler) Ada 95 (ayrıca yordamsal ve veriye yönelik programlamayı da destekler) CLOS (Lisp NYP sürümü 1988) (ayrıca fonksiyonel programlamayı da destekler) Scheme (ayrıca fonksiyonel programlamayı da destekler) 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 3 Girişş 2. NYP desteklenir, fakat buyurgan dillerin tipik özellikleri de bulunur Eiffel ((Daha önceki herhangi g bir dile dayanmaz) y ) Java (C++ kaynaklı) 3. Saf NYP Dilleri S llt lk 80 Smalltalk 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 4 Paradigma g Evrimi Paradigma Evrimi (Paradigm Evolution) ((Paradigma: g Bir süreç yya da model için esas olan örnek yya da örüntü)) 1. Yordamsal (Procedural) - 1950-1970 (yordamsal soyutlama) 2. Veriye Yönelik (Data-Oriented) - erken 1980ler (Veri soyutlaması) 3 NYP – geç 1980’ler 3. 1980 ler (SVT, (SVT Kalıtım (inheritance) ve dinamik bağlama) 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 5 Nesneye y Yönelik Programlama g Kalıtımın başlangıcı 1980lerin ortalarından gözlemler : Yazılımcılar üzerinde üretkenliğin artması yönünde büyük baskı vardı. Üretkenlik artışı tekrar kullanımla elde edilebilirdi. N yazıkk ki, Ne ki Soyut veri tiplerinin (SVT) yeni problemlerde tekrar kullanılması zor. Bütün SVT bağımsız ve aynı seviyede. Kalıtım bu iki problemi de çözer-SVT’yi küçük değişikliklerle tekrar kullan ve sınıfları (class) hiyerarşi ile tanımla. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 6 Nesneye y Yönelik Programlama g NYP Tanımları: SVT’lere class ((sınıf)) denir. “Class” somutlaşmış örneklerine objects (nesne) denir. Kalıtımla başka bir sınıfın özelliklerini alan “class”a derived class (türetilmiş sınıf) veya subclass denir. denir Kalıtımla başka bir sınıfa özelliklerini veren“class”a parent class (ebeveyn sınıf) veya superclass (süpersınıf) denir. N Nesneler l ü üzerinde i d yapılacak l k iişlemleri l l i ttanımlayan l altprogramlara lt l metot t t denir. d i Metotların çağrılmasına message (mesaj) denir. Bir nesnenin bütün metot setine nesnenin message protocol (mesaj protokolü) veya message interface (mesaj arayüzü) denir. Temelde bir sınıf ebeveyninin bütün öğelerini kalıtımla alır (In the simplest case, a class inherits all of the entities of its parent)) 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 7 Nesneye y Yönelik Programlama g Kılıflanmış öğelere erişim kontrolü ile kalıtım zor olabilir. Bir sınıf alt sınıflarından öğelerini ğ saklayabilir. y Bir sınıf öğelerini kullanıcılarından saklayabilir. Bir sınıf öğelerini kullanıcılarından saklarken alt sınıflarına açabilir. Metotların M t tl kkalıtımla l t l alınması l yanında, d bi bir sınıff kalıtımla k l t l alınan l bir bi metodu t d değiştirebilir. Yeni olan kalıtımla geleni overrides çürüterek üstüne çıkar. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 8 Nesneye y Yönelik Programlama g Bir sınıfta iki tip değişken bulunur: 1. Sınıf değişkeni (Class variables) – bir/sınıf 2. Somutlaşan örnek değişkeni (Instance variables) – bir/nesne Bir sınıfta iki tip metot bulunur: 1. Sınıf metodu(Class methods) – sınıfa gelen mesajları kabul eder 2. Somutlaşan örnek değişkeni (Instance methods) – nesnelere gelen mesajları kabul eder Tek e karşı çoklu kalıtım Tek’e Kalıtımın tekrar kullanım için dezavantajı: Bakımı zorlaştıran karşılıklı bağımlılıklar yaratır. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 9 Nesneye y Yönelik Programlama g Bir abstract method (soyut metot) protokolü (parametreleri, döndüğü değer) tanımlı ve fakat kendisi tanımlı olmayan y sınıftır. Bir abstract class( soyut sınıf) en az bir sanal metot barındıran sınıftır. Soyut sınıf somutlaştırılamaz. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 10 C++ Genel özellikler: Karışık ş tipli p sistem: C’den türetildiğinden, ğ , onun özellikleri korunmak istenmiştir. ş Bu nedenle hem buyurgan dillerin tiplerini hem de sınıf yapısını destekler. Yapıcılar ve yok ediciler (constructors/destructors). Sınıf öğelerine ayrıntılı erişim kontrolü 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 11 C++ Kalıtım Bir sınıf bir başka sınıfın alt sınıfı olmak zorunda değil. Üyelerin erişim hakları 1. “Private” (sadece “class” ve “friends” erişebilir) 2. “Public” (altsınıflardan ve kullanıcılardan erişilebilir) 3. “Protected” (sınıf içinden veya altsınıflardan erişilebilir fakat kullanıcılar erişemez) 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 12 Example p class base_class { p private: int a; float x; protected: int b; float y; public: int c; float z; }; class l subclass_1 b l 1 : public bli b base_class l { … } }; // - burada, b ve y protected ve // c ve z public class subclass_2 : private base_class { … }; // - burada, burada b, b y y, c c, ve z private private, // ve türetilecek hiçbir sınıf ebeveyn sınıfa erişemez. // örneğin “c”ye erişilebilmesi için aşağıdaki yöntem kullanılır class subclass_3 : private base_class { base_class :: c; } 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 13 C++ Değerlendirme gelişmiş erişim kontrolü sağlar çoklu kalıtım mümkün Programcı metotların statik veya dinamik bağlanmasına tasarım aşamasında karar vermelidir. Statik bağlanma daha hızlı! 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 14 Java C++’a çok benzediğinden bazı farklılıklardan bahsedelim Genel özellikler Temel tipler hariç her türlü veri nesne. Sadece boolean, character ve sayısal tipler nesne değil. Bu durum kimi zaman problemler de yaratır. Örneğin ArrayList sınıfının somutlaşmış örneği “array”dir array dir ve eleman olarak sadece nesneler alır ve bu durumda örneğin sayılar doğrudan yerleştirilemez. Bu durum Java 5.0 a kadar myArray.add(new Integer(10)); şeklinde çözülürken çözülürken, 5 5.0’dan 0’dan sonra örtülü olarak düzenlenmiştir myArray.add(10); Bütün nesneler yığın dinamik, referans değişkenlerle erişilebilir ve new ile üretilir. Açık bir silici yok, çöp toplama ile işi biten nesneler sisteme iade ediliyor. “finalize” metodu ç çöp p toplamadan p önce örtülü olarak ççağrılarak ğ bazı başka ş temizlik işleri yaptırılabiliyor. Problem ne zaman çalışacağının belli olmaması. Bütün sınıflar bir sınıfın alt sınıfı olmak zorunda. En üstteki sınıfın adı “Object”. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 15 Java Kalıtım (Inheritance) Tek kalıtım desteklenir. Ancak,, “interface” isimli soyut y sınıfla ççoklu kalıtıma destek sağlanır. Bu sınıfın tipik kullanımı ebeveynden kimi metot ve özellikleri alarak bunlara ebeveyne arayüz hazırlamaktır. Bir “interface” interface sadece isimli sabitler ve metot tanımlamaları içerebilir. Örneğin Java “Arrays” sınıfı dizilim sıralama metodu içerir. Bunun için aşağıdaki gibi bir arayüzün tanımlanması gerekir. Daha sonra “CompareTo” metodunu tanımlayan her sınıf bu metoda g göre sıralama yapabilir. y p public interface comparable { public int compareTo(Object b); } Metotlar final tanımlanabilir. Bu tanım, metodun takip eden kalıtımsal takipçilerinde değiştirilemeyeceğini belirler. Eğer sınıf tanımında kullanılırsa, bu sınıfın f hiçbir sınıfın f ebeveyni olamayacağını gösterir. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 16 Java Dinamik bağlanma Bütün mesajlar j ((metot ççağrıları) ğ ) metotlara dinamik olarak bağlıdır. ğ Bunun istisnası final metotlardır çünkü bunlar tekrardan tanımlanamayacakları için dinamik bağlanmanın bir anlamı yoktur. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 17 Java Kılıflama İki şekilde yapılır, class ve package Package ilişkili sınıfları birleştirir (isimli veya isimsiz olabilir) Bir kapsamda tanımlanmayan bütün öğeler isimsiz “package” yapısı altında tanımlanmış sayılırlar, bu paket içinde görünebilirdirler. Paket içindeki her sınıf paket içindeki diğer öğelerin “friend”idir. Bu nedenle paket kapsamı C++ friend uygulaması ile benzeşir. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 18 C# General characteristics NYP desteği ğ Java g gibidir. class ve struct yapılarını destekler Sınıflar Java sınıflarına benzer 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 19 C# Kalıtım Sınıf tanımlamak için ç C++ sözdizimi kullanılır public class NewClass : ParentClass { … } Ebeveynden kalıtım kalmış metot, türetilmiş sınıfta tanımı new ile işaretlenerek değiştirilebilir. değiştirilebilir Ebeveyn sınıfı metodu hala açıkça aşağıdaki örnekte olduğu gibi çağrılabilir: base.Draw(); 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 20 C# Dynamic binding Metotların dinamik bağlarla ğ ççağrılabilmesi ğ için: ç Temel sınıf metodu “virtual” işaretlenir. Türetilmiş sınıflardaki metotlar ise “override ” tanımlanırlar. Soyut metotlar “abstract abstract ” olarak işaretlenmeli ve bütün altsınıflarda tanımlanmalıdır. Bütün C# sınıfları Object sınıfından türetilmiştir. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 21 C# Değerlendirme C# en yyeni C tabanlı nesneye y yönelik y programlama p g dilidir. C# ve Java arasında NYP açısından çok az fark bulunur. 5 Mayıs 2011 Tuğrul Yılmaz - Pamukkale Üniversitesi 22