Programlama'da OOP (Nesne Yönelimli Programlama)

OOP (Object-Oriented Programming) ya da Türkçe olarak Nesne Yönelimli Programlama gelişmiş bir programlama modelidir. Mantıksal işlemlerden ziyade nesneler üzerinde işlem yapmaya odaklandığı için bu şekilde isimlendirilmiştir.

C++, PHP gibi gelişmiş tüm programlama dilleri tarafından benimsenmiş ve desteklenmiştir. Ve örneğin Java gibi bazı dillerde tek programlama modeli OOP'dir.

Sınıf (Class) ve Nesne (Object)

Encapsulation (Kapsülleme)

Inheritance (Kalıtım)

Polymorphism (Çok Biçimlilik)

Abstraction (Soyutlama)

Sınıf (Class) ve Nesne (Object)

Sınıf (Class) içerisinde çeşitli özellik (property) ve yöntemler (method) bulunan yapıdır.
Daha iyi anlamak için şimdilik özellikleri (properties) sınıf içerisinde tanımlanmış değişken, yöntemleri (methods) sınıf içerisinde tanımlanmış işlevler (function) olarak düşünebilirsiniz.

Aşağıdaki C++ ile yazılmış Ogrenci adındaki basit sınıf örneğini görebilirsiniz.

class Ogrenci{
public:
int no = 0;
string name, surname;

public:
Ogrenci(int no, string name, string surname)
{
this->no = no;
this->name = name;
this->surname = surname;
}
};

Nesne (Object) bir sınıf (class) ya da alt sınıf (subclass) ile türetilmiş yapıya verilen isimdir.

Yukarıda verilen örnek sınıf ile bir aogrencisi ve bogrencisi diye iki nesne oluşturmak;

Ogrenci aogrencisi = new Ogrenci(444, "Muhammet", "Şafak");
Ogrenci bogrencisi = new Ogrenci(555, "Selim", "Güngör");

Bununla birlikte bir programlama dili ile nesne yönelimli programlama yapılabilmesi için 4 temel özelliği desteklemesi gerekiyor.

Encapsulation (Kapsülleme)

Inheritance (Kalıtım)

Polymorphism (Çok Biçimlilik)

Abstraction (Soyutlama)

Encapsulation (Kapsülleme)

Sınıflar özellik ve yöntemleri için 3 farklı erişim dönüştürücüye (access modifier) sahiptir. Bunlar;

public (Herkese Açık) : Yöntem ve özelliklere sınıf dışından da erişilebileceğini ifade eder. Bu aynı zamanda sınıf özelliklerinin dışarıdan değiştirilebileceği anlamına gelir.

protected (Korumalı) : Yöntem ve özelliklere sadece sınıf içerisinden ve sınıfı kalıtım alan sınıflardan ulaşılabilir olacağı anlamına gelir.

private (Özel) : Yöntem ve özelliklere sadece sınıf içerisinden ulaşılabilir olacağı anlamına gelir.

Nihayetinde bazı özelliklere ya da yöntemlere dışarıdan doğrudan erişilmesi çoğu zaman istenmeyecek bir durumdur. Kullanıcıdan verileri alarak bunları ilgili özelliklere atayacak ya da gerekli yöntemleri çalıştıracak yöntemler oluşturma işlemine kapsülleme denir.

Kapsülleme neden kullanılmalıdır?

Bu konuda bir alt başlık açarak kapsüllemenin niçin ve neden kullanılması gerektiğini anlatma gereği duydum.

Şöyle çok basit bir örnek vereyim; kullanıcıdan aldığı doğum yılı bilgisine göre kullanıcının yaşını hesaplayan bir sınıf yazdığınızı varsayalım. Kullanıcının verdiği doğum yılı verisini tutmak için kullanacağınız bir özellik tanımladınız. Kullanıcı doğrudan bu veriye erişip örneğin 234345355 gibi bir değer verirse yazılan sınıf kendisinden beklenen işlemi başarılı şekilde yerine getiremeyecektir. Bunun yerine özelliği protected ya da private olarak tanılayarak public bir yöntem aracılığı ile bu değer alınır, kontrol yapıldıktan sonra özelliğe atanır.

Bunu kullanmayı alışkanlık haline getirmeniz ileride olası sorunlardan korunmanızı sağlayacaktır.

Inheritance (Kalıtım)

Bir sınıfın özellik (property) ve yöntemlerinin (method); başka bir sınıf tarafında miras olarak alınması ile oluşan yapılar için kullanılan kavramdır. Kalıtım alınan sınıf ile kalıtım alan sınıf arasında bir alt-üst ilişkisi oluşur.

Nesne yönelimli programlama da 5 çeşit kalıtım şekli vardır. Bunlar;

Single Inheritance (Tekli Kalıtım) : Bir alt sınıfın tek bir üst sınıfı miras alması ile oluşur.

Multiple Inheritance (Çoklu Kalıtım) : Bir alt sınıfın birden fazla üst sınıfı miras alması ile oluşur.

Multilevel Inheritance (Çok Seviyeli Kalıtım) : Bir ve ya daha fazla sınıfı miras almış bir alt sınıfı da miras alan bir alt seviye sınıf ile oluşan yapıdır. Yani bir alt sınıfı miras alan alt sınıflar.

Hierarchical Inheritance (Hiyerarşik Kalıtım) : Bir üst sınıfın birden fazla alt sınıf tarafında miras alınması ile oluşan yapılara verilen isimdir.

Hybrid Inheritance (Melez Kalıtım) : Yukarıdaki 4 farklı kalıtım şeklinden 2 ve ya daha fazlasını barındıran yapılara verilen isimdir.

Polymorphism (Çok Biçimlilik)

Farklı tip veri ve sınıfları farklı şekilde ele alma yeteneğini ifade etmek için kullanılan kavramdır.

Bunu daha iyi anlayabilmeniz için şöyle açıklayayım. Kalıtım olarak alınan sınıfın yöntemini (methodunu) ezerek (override) yeni bir davranış ekleyebilme durumudur. Biraz daha iyi anlayabilmeniz için aşağıdaki C++ ile yazılmış bir örneği inceleyebilirsiniz.

class Sekil{
public:
void ciz()
{
// Bir şekil çiz
}
};

class Kare: public Sekil
{
public:
void ciz()
{
// Kare çiz
}
};

class Daire: public Sekil
{
public:
void ciz()
{
// Daire çiz
}
};

Abstraction (Soyutlama)

Birden fazla sınıf tarafından kullanılacak ortak özellik (property) ve yöntemleri tanımlayan ancak kendi yöntemi bulunmayan sınıflara; soyut sınıf, soyut bir sınıfı kalıtım olarak alarak bir sınıf oluşturma işlemine soyutlama denir.

Aşağıdaki C++ örneğini inceleyebilirsiniz.

class Insan{
protected:
string name, surname;
int year;

public:
virtual void setName(string name);
virtual void setSurName(string surname);
virtual void setYearOfBirth(int year);

string getName()
{
return this->name;
}

virtual int getAge() = 0;
};

class Erkek: public Insan
{
void setName(string name)
{
this->name = name;
}

void setSurName(string surname)
{
this->surname = surname;
}

void setYearOfBirth(int year)
{
this->year = year;
}

int getAge()
{
return 2021 - this->year;
}
};

Nesne yönelimli programlamada mutlaka bilmeniz gereken yapı ve kavramları aktarmaya çalıştım. Programlamaya yeni başlayan birisine başlangıçta bu kavram ve yapıların çok karmaşık gelmesi oldukça normaldir. Çünkü bu sayfayı sadece OOP hakkında teorik bilgileri vermek için hazırladım. :)