NESNE TABANLI PROGRAMLAMA Temel Kavramlar Özkan BİNGÖL Gümüşhane Üniversitesi Not: Bu sunumda, Yrd. Doç. Dr. Özlem AYDIN ve Doç. Dr. Yılmaz KILIÇASLAN’ın Nesneye Yönelik Programlama dersi sunumlarından, ayrıca Turkcell Geleceği Yazanlar eğitim setlerinden faydalanılmıştır. Derse ilişkin genel bilgiler Dersin Amacı Nesneye Yönelik Programlama dersinin iki ana amacı vardır: • Nesneye yönelik programlamanın kavramlarını öğrenmek temel ilke ve • Bu ilke ve kavramları C# programlama dili ile etkin olarak kullanabiliyor olmak. PROGRAMLAMA YAKLAŞIMLARI • 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. Prosedür yönelimli (yapısal) yaklaşım Prosedür yönelimli (yapısal) yaklaşım • Geliştirilen uygulama parçalanamayan bir bütün halindeydi. Bu yüzden, uygulama üzerinde çalışan her geliştirici; uygulamanın hemen her yapısına hakim olmalıydı. • Projelere yeni yazılımcıların katılması önemli bir adaptasyon süreci gerektiriyordu. • Ufak değişiklikler uygulamanın farklı noktalarında büyük sorunlara yol açabiliyordu. • Yıllarla birlikte müşteri ihtiyaçları ve donanım kabiliyetleri arttı. Geliştirilen uygulamaların kapsamları ve boyutları büyüdü. Başlanan projelerin çoğu istenen sürelerde yetiştirilememeye ve geliştirme zorluklarından ötürü iptal olmaya başladı. Prosedür yönelimli (yapısal) yaklaşım • Uygulama maliyetleri giderek artmaya başladı. 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 • 1960’larda OOP fikrini ilk ortaya atan Alan Kay, önerdiği metodolojiyi şu şekilde ifade etmiştir: ▫ Uygulama, nesneler ve onların ilişkileri çerçevesinde belirli bir iş yapmak için geliştirilebilmelidir. ▫ Her nesnenin bir sınıfı olmalıdır ve sınıflar nesnelerin ortak davranışlarını ifade etmelidir. ▫ Nesneler birbirleri ile iletişime geçebilmelidir. 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#’ı prosedürel bir dil olarak kullanabiliriz; fakat, ancak nesneye-yönelik bir yaklaşımla bu dilin bütün potansiyelini açığa çıkarabiliriz. PROSEDÜR YÖNELİMLİ DİLLERE OLARAK NESNE YÖNELİMLİ DİLLER ALTERNATİF • Prosedürel programlamada bulunan soyut program geliştirme mantığını rafa kaldırıp, gerçek dünya modellemesi ile program geliştirme çabası olarak da düşünebiliriz. • Gerçek dünya modellemesiyle anlatılmak istenen şudur: Bir fabrika örneğini ele alalım. Bu fabrikada işçiler, makineler gibi birçok nesne bulunur ve bu nesnelerin ilişkisi çerçevesinde fabrika çeşitli işler yapıp çıktılar üretebilir. OOP ile programlama mantığında da, bu örnektekine benzer şekilde program kurgulanır. Çeşitli nesneler geliştirilip birbirleriyle ilişkilendirilerek, belirli amaçlara hizmet eden uygulamalar geliştirilir. PROSEDÜR YÖNELİMLİ DİLLERE OLARAK NESNE YÖNELİMLİ DİLLER ALTERNATİF • Bu yapının önemli getirileri şunlardır: Yazacağınız sınıflar birbirinden bağımsız olarak geliştirilebilir. Bu sayede program böl, parçala, fethet mantığı çerçevesinde çok kolay bir şekilde parçalanır ve her parça ayrı ayrı ele alınabilir. OOP, yapısı gereği kod tekrarlarının önüne geçer (doğru bir şekilde kullanılırsa) • Bu durum, özellikle ilk dönemlerde yazılımcıların hızlı bir şekilde OOP yapılarına geçmesinin temel nedenlerinden biri olmuştur. NESNE YÖNELİMLİ DİLLER • Projelerin yönetilebilirliğini büyük miktarda artırdığı için daha büyük projeler çok daha az çaba ile yönetilebilir hale gelmiştir. Yine aynı getiriler sayesinde, projeler rahat bir şekilde büyütülebilmiştir. 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. Nesne • OOP temelde nesneler ve onların ilişkisi üzerine kurulu bir metodoloji olarak tanımlanmıştır. • Nesneler sınıflardan türetilir ve yetenekleriyle yapabilecekleri sınıflarla belirtilir. • Nesne-Sınıf ilişkisi için şöyle bir örnek verilebilir: İnsan bir sınıftır, her bir kişi, insan sınıfının bir nesnesidir. Örneğin, günlük kullanımda Ali bir insandır diyebiliyor olsak da, şu denklem yanlıştır: İnsan=Ali. Eğer sözlükte insan maddesinin yanında tanım olarak Ali’den bahsedilmiyorsa, bu eşitlik hiçbir zaman doğru olamaz. İnsan sınıfı bize Ali gibi her insanın yapabileceklerini, yeteneklerini ve özelliklerini belirtir. İnsan konuşabilir, el sallayabilir, koşabilir v.s. dediğimiz her seferinde, bu işlerin Ali için de geçerli olduğunu kabul etmiş oluruz. Her insanın bir göz rengi vardır dersek, Ali’nin de bir göz renginden bahsedebiliriz. NESNEYE-YÖNELİK PROGRAMLAMANIN TEMEL İLKELERİ • Nesneye-yönelik programlamanın temel ilkeleri şunlardır: ▫ ▫ ▫ ▫ Soyutlama (Abstraction) Sarmalama (Encapsulation) Kalıtım (Inheritance) Çok biçimlilik (Polymorphism) 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ı verir. SOYUTLAMA “Soyutlama” , belirli bir bakış açısından, önemli özelliklere odaklanabilmek için ayrıntıları göz ardı etme sürecidir. 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. Erişim Belirleyiciler • Erişim belirleyiciler (access modifiers), sınıflara nerelerden ve ne şekilde erişileceğini belirtir. Public: Her yerden erişilebilir. Private: Sadece tanımlandığı sınıf içerisinden erişilebilir. Internal: Sadece bulunduğu projede erişilebilir. Protected: Sadece tanımlandığı sınıfta ya da o sınıfı miras alan sınıflardan erişilebilir. ▫ Protected Internal: Sadece tanımlandığı sınıfta ya da o sınıfı miras alan sınıflardan erişilebilir. Ayrıca tanımlamanın aynı proje içerisinde olma şartı yoktur. Protected'dan farkı budur. ▫ ▫ ▫ ▫ • Eğer erişim belirleyici belirtilmemişse, sınıflar internal’dır. SARMALAMA • Bir insanı örnek verelim. Vücudumuzun yaptığı işler sarmalanmıştır ve biz buna müdahale edemeyiz. • Örneğin, biz sadece solumakla ilgileniriz; ciğeri şişirmek, kana oksijen karıştırmak, kirli kanı temizlemek gibi işlemler içeride yapılıyor olsa da, bizim için durum sadece solumaktan ibarettir. Diğer işlemler sarmalanmıştır. • Gecerlitarih isimli property’e atılan değer dönüştürülerek DateTime tipindeki tarih isimli değişkene atılmaktadır. GunOlaraktarihFarki isimli metod parametre olarak almış olduğu farkAlinacaktarih isimli değişkenden tarih isimli değişkeni çıkarmaktadır. Kullanılan TotalDays özelliği çıkarılan iki tarih arasındaki farkı gün olarak hesaplamaktadır. KALITIM / MİRAS ALMA (INHERİTANCE) 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. İnsan – memeli ilişkisinde, insanın memeli sınıfını miras aldığı söylenebilir. Bu sayede insan sınıfını yazarken memelilerin özelliklerini tekrar yazmamıza gerek kalmaz. Elinizde bir taşıt sınıfı varsa; otomobil, kamyon, motosiklet gibi alt sınıfları üretmek çok daha az çaba gerektirir. 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. Çok Biçimlilik • Statik ve dinamik olmak üzere ikiye ayrılır. ▫ ▫ Statik çokbiçimlilik; metot ve operatörlerin aşırı yüklenmesi (overload) olarak belirtilir. Dinamik çokbiçimlilik; özet sınıflardan miras alma yoluyla işlemlerin gerçekleştirilmesi işlemine verilen isimdir. Sınıf İçindeki Yapılar FIELDS • Genellikle, nesnenin özellikleri (property) için değer saklama alanıdır. Varsayılan durumda private yapılardır. • Field, global alanda tanımlanmış bir değişken olarak da düşünülebilir. Yani class içerisindeki tüm metotlardan erişilebilecek bir değerdir. PROPERTIES • Nesnenin özellikleridir. • Kendi içinde iki metot barındırabilir: ▫ Set metodu: Bir property’ye yeni bir değer atamak için kullanılır. Set metodu olmayan property’ler readonly durumundadır. ▫ Get metodu: Bir property’nin değerini okumak için kullanılır • Genelde bir field’da bulunan değeri değiştirmek / okumak için kullanılır. METHODS • Nesnenin yapabildiği işlerdir. • Virtual, override, abstract metotlar oluşturulabilir. Bu sayede, miras alan sınıfın bu metot ile yapabileceği işler belirlenebilir. • Static olarak oluşturulabilir. Bu sayede, metot nesnenin değil sınıfın metotu haline gelir. • Static metotlar o metoda başka sınıflardan instance alınmadan ulaşılmasına olanak sağlar. CONSTRUCTOR • Constructor ismi, class’ın ismi ile aynı olmak zorundadır. • Nesne ortaya çıkartılırken yapılacak işlemleri barındırır. • Farklı parametreleri alarak aşırı yüklenebilir (overload). EVENTS • Nesnelerin tepkileridir. Delegate’ler ile birlikte kullanılır. • Düğmenin tıklanması bir event’tir. Daha önce düğmeyi tıklayınca bir tepki vereceği öngörülmüştür. • Aşağıdaki örnekte, Kettle sınıfına SuKaynama Eventi eklenmiş ve su derecesi 100’ü geçerse bu event’in tetikleneceği belirtilmiştir.