Temel Kavramlar

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.