Nesneye yönelik programlama 1990’lı yılların ve günümüzün teknolojisidir ve büyük olasılıkla yakın gelecekteki programlama teknolojisi olmaya da devam edecektir. 1970’lerdeki Yapısal Programlamanın (Structured Programming) yerini tamamı ile almıştır.
Nesneye yönelik programlamada, programlama ortamındaki her şey bir nesne olarak kabul edilmekte, nesnelerin özellikleri (Properties) değiştirilerek onlara yeni biçimler verilebilmektedir. Ayrıca her nesnenin duyarlı olduğu olaylar (Events) mevcuttur. Her nesne üzerine uygulanabilecek farklı metotlar (Methods) oluşturulmuştur.
Yapısal Programlamada ağırlık programlama komutlarında iken, Nesneye Yönelik Programlamada yazılımcının ortamdaki nesneler, özellikleri, hassas oldukları olaylar ve nesnelere uygulanabilecek metotlar hakkında da detaylı bilgi sahibi olması gerekmektedir.
Nesne Yönelimli Programlama (NYP) mantıksal işlemlerden ziyade, nesnelere (object) ve nesneler üzerinde işlemlere odaklanan programlama dili modelidir. NYP’de programlar, nesnelerin birbirileriyle etkileşime geçmeleri sağlanmasıyla tasarlanır. Java, C++, C#, Python, PHP, JavaScript, Ruby, Perl, Smalltalk, Objective-C gibi diller başlıca nesne yönelimli programlama dilleridir. NYP teorisinde 4 temel özelliğin gerçekleştirilmesi zorunlu sayılmıştır ve biri bile eksik ise bu dil saf NYP sayılmamıştır.
Bu dört temel özellik şunlardır:
- Soyutlama (Abstraction)
- Kapsülleme (Encapsulation)
- Çok Biçimlilik (Polymorphism)
- Kalıtım (Inheritance)
Soyutlama (Abstraction)
Soyutlama, NYP’de programlama dilinin farklı tip verileri ve sınıfları farklı şekilde işleme yeteneğini belirten özelliğidir. Temel olarak, metotları ve türetilmiş sınıfları yeniden tanımlama yeteneğidir.
Örneğin, yeryüzünde bulunan her şey bir nesnedir. Bilgisayar yazılımı açısından nesne, bir varlığın temsil biçimidir. Bir bina da bir nesnedir. Binayı bilgisayar yazılımı içinde temsil etmek istersek, bu nesnenin ayırt edici özelliklerini belirlemeliyiz. Bina yüksekliği, dış yüzey rengi, kat sayısı, zemin alanı ve zemin boyutları gibi özellikler, binayı temsil etmek için ilk akla gelen özelliklerdendir. O halde nesnenin bilgisayarda temsilinde, özellikleri (properties) kilit rol oynamaktadır.
Nesnenin karakteristik özellikleri (properties) ve gerçekleştirebileceği eylemler de metot olarak adlandırılır. Bu anlamda, soyutlaştırmanın sonucunda bir nesne, özellikleri ve metotları ile temsil edilebilir.
NYP dilleri, soyutlamayı sınıf (class) yapısı ile gerçekleştirirler. Sınıf yapısı içerisinde o nesneye ait özellikler ve metotlar tanımlanır. Ancak sınıf soyut bir yapıdır ve doğrudan kullanılamaz. O sınıftan üretilen örnekler (instance) sınıfa ait tüm özelliklere ve metotlara sahip olurlar ve bunlar program içinde doğrudan kullanılabilirler.
Soyutlamada, alt sınıfların ortak özelliklerini ve işlevlerini taşıyan ancak henüz bir nesnesi olmayan bir üst sınıf oluşturmak istenirse bir soyut (abstract) üst sınıf oluşturulur. Soyut sınıfın yöntemleri alt sınıfları tarafından üzerine yazılmak üzere şablon olarak tanımlanabilir veya soyut metot olarak oluşturulabilir. Soyut metoda sahip bir sınıf otomatik olarak kendisi de soyut hale gelir ve soyut sınıflardan nesne oluşturulmaz.
Aşağıda soyutlamanın bir örnek bulunmaktadır. "Sekil" adlı bir soyut sınıf oluşturulmuştur. Bu sınıfa alt sınıf olarak "Dikdortgen" diye gerçek bir sınıf oluşturulmuştur. Bu alt sınıfa "cevre" diye bir metot oluşturulmuştur ve "Sekil" altındaki diğer alt sınıflar ve ortak bir metot olduğu için bu metot "Sekil" soyut sınıfının altına da eklenmiştir.
public abstract class Sekil { public int cevre() { return 0; } } public class Dikdortgen : Sekil { private int boy; private int en; public int cevre() { return (2 * (boy + en)); } }
Kapsülleme (Encapsulation)
Kapsülleme, NYP'nin temel kavramlarından biridir. Genel tanımıyla kullanıcı tarafından verilen, sınıfların ve metotların ne kadarının görüntülenebileceği ve değiştirilebileceğinin sınırlarının konulmasını sağlar. Public (herkese açık), private (özel) ve protected (koruma altında) olmak üzere üç adet access modifier’dan (erişim dönüştürücüsü) bahsedilebilir.
Public olanlar herkes tarafından görülebilir ve değiştirilebilir yani en güvensiz sınıf çeşididir. Bir program yazılırken programın iç yapısını değiştirecek metotların Public olması önerilmez. Public modifier dış kullanıcı tarafından eklenmesi veya değiştirilmesi istenen veriler için kullanılır.
Protected modifier, public modifier’dan daha güvenli bir access modifier’dır. Aynı sınıf içinde görüntülenebilir veya erişilebilirler. Aynı zamanda üst sınıflar, ondan türetilmiş sınıflar ve aynı paket içinde bulunan sınıflar tarafından görüntülenebilir veya erişebilirler.
Private en güvenli access modifier’dır. Private olanlar yalnızca içinde olduğu sınıf tarafından görülebilir veya erişilebilirler. Sınıflar private olabileceği gibi özellikleri ve üstünde tuttuğu veriler de private olabilir.
Aşağıda objenin private, public ve protected üç özelliği görülmektedir. Öğrencinin isim, bölüm, gano bilgileri dış kullanıcı tarafından görüntülebilirken kimlik numarası yalnızca "Ogrenci" sınıfının içindeyken görüntülenebilmekte ve değiştirilebilmektedir. Bölüm sıralaması ise "Ogrenci" sınıfının içindeyken veya "Ogrenci" sınıfından türetilmiş sınıfların içindeyken görülebilir ve değiştirilebilir.
public Ogrenci(string aisim, string abolum, double agano) { isim = aisim; bolum = abolum; gano = agano; } private Ogrenci(int akimlikno) { kimlikno = akimlikno; } protected Ogrenci(int abolumsiralamasi) { bolumsiralamasi = abolumsiralamasi; }
Çok Biçimlilik (Polymorphism)
Çok biçimlilik, NYP'de programlama dilinin farklı tip verileri ve sınıfları farklı şekilde işleme yeteneğini belirten özelliğidir. Daha belirgin olmak gerekirse; metotları ve türetilmiş sınıfları yeniden tanımlama yeteneğidir.
Aşağıda çok biçimliliğin daha iyi anlaşılmasını sağlayacak bir ekran görüntüsü mevcuttur. "NesneCiz" adlı üst sınıfa "Kare" ve "Ucgen" alt sınıfları oluşturulmuştur. "Ciz" metotu kullanılarak farklı iki geometrik şekli doğru şekilde çizilmesi sağlanır.
public class Kare : NesneCiz { public override void Ciz() { } } public class Ucgen : NesneCiz { public override void Ciz() { } }
Katılım (Inheritance)
Katılım, bir sınıftan başka bir sınıf türetirken aralarında bir alt-üst ilişkisi oluşturmayı ve bu sınıflar üzerinde ortak metotlar ve özellikler kullanılmasını sağlayan bir mekanizmadır. NYP'nin temel kavramlarından biridir. Hali hazırda var olan sınıfların üzerine başka bir sınıfların inşa edilmesini sağlar. Beş çeşit katılım çeşidinden söz edilebilir.
- Single Inheritance (Tekli Katılım): Alt sınıf tek bir üst sınıfın tüm özelliklerini taşır.
- Multiple Inheritance (Çoklu Katılım): Bir alt sınıf birden fazla üst sınıfın tüm özelliklerini taşır.
- Multilevel Inheritance (Çok Seviyeli Katılım): Bir sınıfın alt sınıfı oluşturulduktan sonra bu alt sınıfın da bir alt sınıfının oluşturulmasına denir.
- Hierarchical Inheritance (Hiyerarşik Kalıtım): Bir üst sınıfın birden fazla alt sınıfa base class (temel sınıf)'lik yapmasına denir.
- Hybrid Inheritance (Melez Kalıtım): Diğer katılım türlerinin 2 veya daha fazlasını barındıran katılım türüdür.
Aşağıda "Ogrenci" sınıfının bir alt sınıfı "FizikOgrenci" oluşturulmuştur. "FizikOgrenci" alt sınıfı, "Ogrenci" alt sınıfının metotlarını kullanabilen ancak daha spesifik bir nesne grubunu belirten bir sınıftır.
class FizikOgrenci : Ogrenci { }