Object Oriented Programing
Object Oriented Programing
Nesne Yönelimli Programlama; Her işlevin nesnesel olarak tanımlandığı bir programlama yaklaşımıdır. 1960'lı yıllarda o dönem yazılım hayatındaki bunalımın önüne geçebilmek maksadıyla üretilmiştir. Temel mantığı birimselliktir. Tüm yazılım dillerinde kullanılabilen ve gerçek hayat anlayışını temel alan bir yapıdır. Yapı içerisinde yazılan sınıflar birbirinden bağımsız olarak geliştirildiğinden "Böl, Parçala, Fethet" mantığı ile her parça ayrı ayrı ele alınabilir. Kod tekrarının önüne geçerek clear kod yazılmasını sağlar ve kod okumayı kolaylaştırır. OOP; 4 temel üzerine oluşturulmuştur. Bunlar; Inheratance (Kalıtım), Encapsulatıon (Kapsülleme), Abstraction (Soyutlama), Polymorphism (Çok biçimlilik) olarak adlandırılır.
OOP temelde Class'lar üzerine kurulmuştur.
Class; her türlü varlığın ve nesnenin tanımlandığı yerlerdir. Geliştirilen programı mümkün olduğu kadar küçük parçalara bölerek, her parçayı bir türde nesne haline getirip ve daha sonra bu nesneleri gerekli yerlerde çağırarak kullanmaktır. Nesneleri yazmak için önce bir şablon (prototip) oluşturulur. Daha sonra bu şablondan istenilen sayıda nesne çıkarılır. Programlama dilinde bu şablonlara class, nesnelere de object adı verilir.
Object; classlardan üretilen ve kendine has özellikleri olan canlı varlıklardır. Bir ifadenin nesne olabilmesi için bellekte yer kaplaması gerekir.
Field and Property;
Field'ı alan yada veri olarak tanımlayabiliriz. Property, bir sınıfın fieldlarına erişim sağlamak için kullanılan bir sınıf üyesi türüdür, “set” ve “get” metodlarını içerir.
Eğer bir propertyinin set metodu bulunmuyorsa bu property sadece okunabilir olarak değerlendirilir. Aynı şekilde eğer sadece set metodu bulunuyorsa sadece yazılabilir olarak düşünülür.
Inheratance (Kalıtım), Encapsulatıon (Kapsülleme), Abstraction (Soyutlama), Polymorphism (Çok biçimlilik)
Inheratance
Inheratance; bir nesnenin başka bir nesne üzerinde kurulmasıdır. Biyolojideki kalıtım ile OOP'taki kalıtımın mantığı aynıdır. OOP ile istediğimiz nesneleri oluşturabiliriz fakat öncelikle bu nesneler için prototiplerini, inharetance (kalıtım) mantığı ile oluşturmamız gerekir. Prototipler, BaseClass'larda oluşturulur ve bu BaseClass'larda kalıtım verilecek alt sınıfların ortak özellikleri tutulur. Alt sınıfların kendine ait özellikleri BaseClass'larda tutulmaz. BaseClass'lar alt sınıflara şu şekilde tanımlanır;
Encapsulatıon
Kapsülleme; bir nesnenin iç yapısını (verilerini ve özelliklerini) dışarıdan doğrudan erişime kapatılması veya kontrollü erişimine izin verilmesi anlamına gelir. Erişilemeyen bir alanı erişilen bir alanla kontrol etmek demektir. Encapsulatıon uygulanırken Access modifierlar kullanılır. Encapsulatıon'ın uygulaması özet olarak şu şekildedir. Sınıfın, altsınıflarda kullanılmak istenilen üyesinin kontrol altına alınmasıdır. Bu kontrol altına alınma, ilgili üyenin get ve set methodlarında, aynı class içerisindeki Private erişim imleçli üye ile yapılır. BaseClasslarda sadece özellikler değil yetenekler de methodlar aracılığı ile tutulur. Bu methodlar; virtual olarak tutulabilir ve Override işlemi bu methodlara uygulanır. Virtual methodların içerisinde uygulanacak yetenek tanımlanmalıdır. Altsınıfta eğer farklı bir tanımlama apılmak istenilirse override edilerek gövde içi değiştirilebirlir. Virtual methodlar ile bir sonraki konuda göreceğimiz abstract methodların farklı şudur; abstract methodların gövdelerinin içerileri boş bırakılır ve kullanılacağı yerde override zorunlu kılınarak içleri tanımlanır. Böylece kullanılacağı yerde özgü olarak gövdenini içi doldurulurulur.
Abstraction
Abstraction (Soyutlama), yalnızca temel nitelikleri "gösteren" ve gereksiz bilgileri "gizleyen" nesne yönelimli programlama kavramıdır. Object Oriented programlamada sınıfların soyutlanmasını ise Abstract Class ve Interface ikilisi sağlamaktadır.
Abstract Class ve Interface kullanımı
Abstract Class ve Interface arasındaki farklılık incelenirken öncelikle şunun farkında olmak gerekir; Abstrack classlar adı üzerinde sınıf, interfaceler is arayüz olarak adlandırılabilir. Yani temel olarak birbirinden farklıdırlar.
Abstarct Classlar; yalnızca kendisinin inherit edilmesine izin veren ve tüm alt sınıfları belirli hiyerarşide çalışmaya zorlayan yapılardır. Bir class ve method soyutlandırılmak istenirse onu "abstract " olarak işaretlenmelidir. Abstract sınıflar alt sınıfları kullanılması zorunlu tutumak istediğimiz özellikleri barındırmalıdır. Abstract classların içinde tanımlanan ve override işlemi yapılacak olan methodlar abstract olarak tanımlanır. Abstract methodlar, sadece abstract olarak olarak işaretlenmiş sınıflar içerisinde tanımlanır. Bir sınıf abstract olarak işaretlenmemiş ise içerisinde abstract bir üye barındırmaz.
Interface ; interfaceler class değildir üzerinde sadece imza tutulur. İnterface olarak işaretlenir. Özet olarak gerçek proje kullanımlarında interfacelerde methodlar abstract classlarda propertiler tutulur. Abstract sınıflardaki override mantığı burada geçerli değildir. İnterfacelerde implemantation kullanılır. Propertiler genel kullanımda abstract sınıflarda tutulur. İnterfacelerde tutulması hoş karşılanmaz. c# 8.0 dan sonra interfaceler gövde kazanmaya başlamıştır. abstract sınıfların tüm özelliklerini kazanmaya başlasada inherit edilme özelliği en belirgin özellik olarak devam etmektedir.
Projelerde; genel yaklaşım olarak Abstract sınıflarda propertyler/özellikler interfacelerde Methodlar/yetnekler tanımlanır.
Abstract Class
Interface
Bir ChildClass'a sadece 1 tane abstract class inherit olabilir
Bir ChildClassa birden fazla ınterface implemnt olabilir.
constroctor method oluşturulabilir
oluşturulamaz
methodları ve propertyleri abstract olarak işaretlemediğince oveeride etme zorunluluğun yoktur
içersisinde yazılı olanlar impleent edilmek zorundadır.
abstract sınıflarda methodlar gövdelendirile bilir
interfacelerde methodlar gövdelednirime işlemi, yapılmaz Fakat c# 8.O dan sonra desteklesede projelerde kullanılmaz.
Override etmek istediğimiz method ve propertyileri absratct veya virtual olarak işaretleriz.
overide mantığı geçerli değildir.Sadece imza içerir. Tanımlanan methodlar gövdesiz gelir. Gövdesi child classlarda tanımlanabilir.
Özellikler ve yetenekler için acces modifiers içerir
Herhangi bir erişim belirteci içermez. İçerdiği tüm üyeler altclasslarda kullanılacağı için.
Bir sınıfın çekirdek benliğini tanımlamak için kullanılır. Özellik ve yetenekler dahildir.
Bir sınıfın çevresel yeteneklerini tanımlamak için kullanılır.
Daha hızlı çalışır.
Sadece imza barındırdığı için ilgili sınıflarda doğru methodların çalıştırılması biraz zaman alır.
Yeni bir method eklersek sorunsuz çalışır. abstact methodlar haric onların gövdelenmesi gerekir.
Yeni bir method eklersen, bunun için tüm uygulamaya tanımlamamız gerekir.
Polymorphism
Polymorphism -çok biçimlilik-, farklı sınıflar BaseClasslardan ve Interfacelerden kalıtım alarak türetildiğinde, türeyen sınıfların ana sınıftan aldığı yetenekleri kendine göre farklı olarak uygulamasıdır. Aşağıda görüleceği gibi phonecall() her markaya göre kendi ses tonu tanılanacaktır. AplleSound, SamsungSound, NokiaSound vs gibi.
Bir projede sağlıklı bir OOP uygulaması için aşağıdaki klasörlerin açılmış ve etkin bir şekilde kullanılıyor olması gerekmektedir.
OOP Uygulaması;
Yukarıdaki proje; gerçek olmayan, katmanlı mimarı içermeyen ve sadece OOP'un anlaşılması amacıyla yapılmıştır. Burada temel mantık Encapsulatıon, Abstractıon, Inharetance ve Pholimorfhizm'in anlaşılmasıdır. Bu proje incelendiğinde Entities ve Repository olarak temel 2 klasör açıldığı görülecektir. Entities klasörünün içerisine Abstract Concrete Enum klasörleri açılmalıdır. Absract sınıfların Abstract klasörünün içerisinde tutulması gerekir. Concrete kelime olarak somut anlamını taşımaktadır. Yani uygulamada kullanılacak varlıklarımı tanımladığı yer olarak düşünebilir. yukarıda görüldüğü gibi ; concrete içerisine bir sipariş uygulmasında özelliklerini ve yetenekleri asbtrack classdan ve interfacelerden almış menu classı vs oluşturulabilir. Enumlar enum klasöründe tutulur. Interfaceler ise Repository klasörünün içine tanımlanır.
Last updated
Was this helpful?