Nesne Yönelimli Programlama (Object Oriented Programming-OOP ); aslında bahsi geçen konu neredeyse her yazılımcının az veya çok bilgi sahibi olduğu aşina bir kavram. Çoğu yazılım dilinde kullanılan ve problem çözümlerinde yazılım geliştiricileri oldukça rahatlattığını söylemek yanlış olmaz. Bunun sebebi de gerçek hayatı ve gerçek sorunları aslında bilgisayara ortamına taşımamıza izin veren yapısıdır. Sınıf (Class) ve Nesne (object) kavramları ile soyut kavramları somutlaştırarak geliştirme imkanı sunmaktadır. Burada aslında Sınıf (Class) en yalın haliyle soyut haldedir.
Sınıf (Class)
Bilgisayar ortamı dışarısındaki varlıkların özellikleri (property) ve davranışları veya yapabildiklerinin (methodlar) tanımıdır diyebiliriz. Kendi başına sadece bir tanım kümesi gibi görülebilir. Bu küme içerisinde bulunan tanımlamalar ise bir Nesne vasıtası ile daha somut bir şeye dönüştürülür.
Nesne (Object)
Bir sınıftan türetilerek ortaya çıkan, özellikleri ve davranışlarıyla diğer benzerlerinden ayrılan veya benzer davranışları sergileyen şeylerdir diyebiliriz. Dünyamızdan bu ortama taşınan kavramları nesnelere çevirerek daha anlaşılır hale getiririz.
Örnek vermek gerekirse:
Hayatımızın her alanında kullandığımız ve programların sürekli geliştirildiği akıllı telefonlar. Bir akıllı telefonu “Sınıf” olarak aktardığımızda bazı özellikleri olduğunu görürüz.
- Kamerası var mı?
- Çift Kameralı mı?
- Dokunmatik ekran mı?
- Rengi
- İnceliği vb. gibi.
Ve ayrıca sıkça kullandığımız bazı işlemlere sahip olacaktır;
- Arama
- Resim çekme
- Ses kayıt etme
- Video kayıt etme vb.
public class Telephone
{
public string Model { get; set; }
public string Color { get; set; }
public bool FrontCamera { get; set; }
public double Thickness { get; set; }
public bool TouchableScreen { get; set; }
public void Call()
{
Console.WriteLine("Call someone..");
}
public void RecordVoice()
{
Console.WriteLine("Voice Recorded..");
}
}
Her telefonun aynı olmadığı gibi benzerlikleri olanlar da olacaktır. Sınıf kavramımız Telefon iken, buna bağlı oluşturduğumuz nesneler de hangi özelliklere veya davranışlara sahip olup olmadığını belirler. Sınıf daha genel iken, nesne içi doldurulmuş haldedir. Burada ortaklıkları veya farklı durumları kontrol etmek için farklı alt başlıkları incelememiz gerekecek. Bunlar:
- Kalıtım (Inheritance)
- Soyutlama (Abstraction)
- Kapsülleme (Encapsulation)
- Çok Biçimlilik (Polymorphism)
Kalıtım (Inheritance)
Bir sınıftan benzer özellikleri sahip olan başka bir sınıf üretme işlemine kalıtım denir. Kalıtım hangi sınıftan alınıyorsa onun özelliklerini ve metotlarını aldığı gibi kendi içerisinde farklı özellikler ve metotlar tanımlayabilir. Kalıtım veren sınıf Base Class (Super Class veya Parent) görevi görerek başka sınıflara (Child) da içeriklerini aktarabilir. Erişim belirteçleri (Access modifiers) ile birlikte kısıtlanabilir veya kullanımlarına izin verilebilir. Böylece kod tekrarı engellendiği gibi, daha okunaklı, geliştirilebilir ve tekrar kullanılabilir bir yapıya sahip olmuş oluyoruz.
Abstraction (Soyutlama)
Dahili detayları saklayarak (gizleyerek) ve kullanıcıya sadece işlevselliği göstererek (gerekli kısımları), karmaşıklığı ve çabayı azaltmak için geliştirilmiş bir metodoloji olarak adlandırabilir. Ortak sınıf davranışını kazandırmak için bir şablon niteliğindeki yapıdır. Abstract Class anahtar kelimesi veya interface ile oluşturulabilir. Temel kullanım açısında birbirlerine benzeseler de, ayrımı sağlayacak birkaç farklı özellikleri bulunmaktadır. Benzer ve farklı özelliklerinden birkaçı aşağıdaki gibidir:
Abstarct
- İçerisinde bulunun metotların gövdeleri dolu veya boş olabilir.
- Soyut kavramlar oldukları için yeni anahtar kelimesi ile direk nesne oluşturulamaz.
- Erişim belirteçleri barındırabilir ve bununla belirli kısıtlamalara sahip olabilir.
- Çoklu kalıtımı desteklemez.
- Abstract olan veya olmayan metotlar tanımlanabilir. Daha sonra override edilerek inherit edildiği sınıfta farklı şekilde kullanılabilir.
- Bir sınıf sadece bir tane abstract sınıfı implemente edebilir.
- Sealed ve private erişim belirteçleri ile kullanılamaz.
- Must-do veya can-do ilişkisi oluşturmak için kullanılır.
- Sınıf hiyerarşisinde Base Class görevini üstlenirler.
Interface
- Değişken veya gövdesi dolu metot yoktur. Sadece metot imzalarını barındırır.
- Erişim belirteçleri ile kullanılamaz, tamamı public olarak kabul görür.
- İçerisindeki tüm metot tanımlarımın implemente edilmesi zorunludur.
- Abstract Classlar gibi direk yeni anahtar kelimesi ile kullanılamazlar.
- Genellikle is-a ilişkisi barındırır.
- Bir interface başka bir interfaceden inherit olabilir. Bir sınıf bir base sınıftan inherit olabilir ve birden fazla interface’ı implement ederek kullanabilir.
- Ortak özellik kazandırmak için kullanabilirler.
Abstact
public abstract class A
{
protected int _number;
public int Add(int num1,int num2)
{
return num1 + num2;
}
public abstract int Muptiply(int num1, int num2);
public abstract int Numbers { get; set; }
}
Gövdesi dolu ve boş 2 tane, bir tane abstract özellik tanımlandı.
public class B : A
{
public override int Numbers
{
get
{
return Numbers;
}
set
{
_number = value;
}
}
public override int Muptiply(int num1, int num2)
{
return num1 * num2;
}
}
Özellik ve metot ezilerek (override) istediğimiz şekilde dizayn edildi.
B b = new B();
b.Add(5, 6);
b.Muptiply(4, 5);
Console.WriteLine($"Adding two numbers, result is: { b.Add(5, 6)}/n
Muptiply two numbers, result is:{ b.Muptiply(4,5)}");
//output Age is:15
// Adding two numbers, result is : 11
// Muptiply two numbers, result is : 20
Console app içerisinde kalıtım alan B sınıfı içerisinden çağılarak metotlar kullanıldı.
Interface
public interface IPerson
{
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class Worker : IPerson
{
public string FirstName { get ; set ; }
public string LastName { get ; set ; }
}
Kapsülleme (Encapsulation)
Dışarıdan müdahaleye açık olmasını istemediğimiz veya yanlış ve bilinçsiz kullanımları önlemek amacıyla özellik erişimini başka sınıflara veya nesnelere sınırlandırma işlemleridir. Örneğin; kullanıcıdan yaşıyla ilgili bir değer girmesini istediğimiz eksi bir değere sahip olamayacağını biliyoruz. Bunun içinde private erişim belirtecini kullanarak bir field tanımlayıp get ve set metotlarında düzenleme yaparak böyle yanlış bir değer girilmesini engelleyebiliriz. Ayrıca farklı durumlarda, sadece set veya sadece get metotlarını kullanarak da özelliği kullanabiliriz
public class Person
{
private int _age;
public int age
{
get
{
return _age;
}
set
{
_age = Math.Abs(value);
}
}
}
Person person = new Person();
person.age = -15;
Console.WriteLine($"Age is :"{ person.age});
//output Age is:15
Çok Biçimlilik (Polymorphism)
Bir türün farklı veya başka bir türe benzer gibi davranabilmesi ve onun özelliklerini kullanabilmesidir. Nesne Yönelimli Programlama dillerinde ise aynı temel sınıftan türetilmiş olan sınıflarda paylaşılan metodun farklı şekillerde uyarlanabilmesidir.
Faydaları
- Gereksiz kod parçacıklarından kurtularak zaman verimi sağlanır ve gerektiğinde başka bir yerde kullanmamız olanak sağlar.
- Sorun çözümlemeleri bu ilişkilerle daha kolay bir şekilde yapılabilir.
- Genişletilebilir ve okunabilir bir yapı sağlar.
- Oluşturulan nesnelerin birbirinden farklı olması sebebiyle bilgi gizliliği sağlanmış olur.
- Nesne bir sınıftan türetilerek projenin çeşitli yerlerinde kullanılmasına olanak sağlar.





Yorum Yap