NESNE YÖNELİMLİ PROGRAMLAMAYA GİRİŞ VE MÜŞTERİ ÖRNEĞİ (OOP INTRODUCTION WITH EXAMPLE OF CUSTOMER)

Merhaba;
Bugün size c# üzerinden object oriented programming nedir kısaca anlatmaya çalışacağım.
OOP
Nesne yönelimli programlama, Her işlevin nesneler olarak soyutlandığı bir programlama yaklaşımıdır. OOP destekleyen programlama dilleri yüksek seviye diller olarak adlandırılır. OOP Merkezi nesne (object) ve sınıftır(class).
İlk olarak VS19 IDE açmak ile başlayalım. Create a new project tıklayalım.

Karşınıza aşağıdaki resim gibi bir pencere çıkacaktır. Açılan pencereden arama kısmına tıklayalım ve şunu yazalım: Blank Solution
Blank Solution seçelim.

Açılan aşağıdaki pencerede projemizin solution ismini ve location yani yerini görmekteyiz.

Solution ismine MediumOOPIntro yazalım ve create yani oluştur tuşuna basalım.
Sizce solution isminin baş harfleri neden büyük yazdık bir fikriniz var mı ???
Çünkü OOP C# dilinde PascalCase Kuralını benimseriz. Peki nedir bu PascalCase ? Class , Interface , Solution, Proje isimlerinde, Mimari Yapıların dosya isimlerinde veya Methodlar için isimlendirme yaparken genellikle kullanılır. Büyük Harf ile başlanır.

Yukarıdaki resimde görmüş olduğunuz kırmızı ile işaretlenen yere sağ tık yapalım.
Açılan pencerede add tıklayalım ardından tekrar new project yani yeni proje oluştur basalım. Açılan pencere hiç yabancı gelmeyecektir. Arama kutucuğuna Console App yazın ve .NET Framework olanı seçin.


Burada tek yapmamız gereken değişiklik project name yani projemizin ismidir. Proje ismine şunu yazalım: ConsoleUI
Create tuşuna basalım.
Bizi aşağıdaki ekran karşılaması gerekmektedir.

Kod yazmaya başlamadan önce class, abstraction, inheritance, polymorphism, encapsulate ve interface nedir gelin onları tanıyalım.
Abstraction(Soyutlama)
Bir sınıfın ortak özelliklerin belirlenmesi, başka bir nesnenin ihtiyaçı olmayacak prop (özellik), Method(Metot) vb. erişimlerinin kısıtlanması soyutlanmasıdır.
Inheritance(Miras,Kalıtım)
Bir classın ihtiyaç duyacağı property , metot vb. başka bir sınıftan miras almasıdır. Base olarak bilinir.
Polymorphism(Çok Biçimlilik)
Kısacası çok özellikli ve miras alınan sınıf dışında başka bir sınıf gibi davranması diyebiliriz.
Static Polymorphism(Statik Çok Biçimlilik)
Method overload (Aşırı yükleme):Bir metodun nesne tipine göre farklı kullanım şekilleri ve farklı dönüş tipleri için kullanırız.
Dynamic Polymorphism(Dinamik Çok Biçimlilik)
Method Override(Metot Ezme, Çiğneme, Geçersiz Kılma): Herhangi bir sınıftan miras alınmış metotları geçersiz kılmasıdır. Böylelikle Corporate Customer ve Individual Customer sınıfları birbirinden farklı çalışabilen birer sınıf haline gerir.
Override: Soyut sınıfların miras alınmasından sonra metotların geçersiz kılınmasıdır.
Encapsulate || Encapsulation
Tanımlanmış özellikleri private yaparak dışarıdan müdahale edilmesini engellemektir.
Class(Sınıf)
Veriler içeren (değişken) ve bu verileri işleyen yapılardır. Ayrıca metotlar ile iş mantığı fonksiyonelliğini sağlarlar .
Constructor(Yapıcı Metot)
Bir nesnenin ilk oluştuğunda çalışmasını sağlayan metottur.
- Kendi sınıf adı ile aynı isime sahip olmak zorundadırlar.
- Public erişime açıktır
- Void tiptir yani geri dönüşü olmaz.
- Birden fazla constructor metot olabilir parametre almadan da çalışabilirler.
Interface
Interface yapılar sadece tanımlamalardan ibarettir, içerisinde hiçbir yapıcı metod ekleyemeyiz. Dolayısıyla burada sadece operasyon olaylarımızı tanımlarız CRUD Operasyonunu örnek alabiliriz.
- Create ( Ekle )
- Read ( Oku )
- Update ( Güncelle )
- Delete (Sil)
İlk olarak spagetti kod örneği üzerinden anlatacağım. çünkü amacım sizlere ilk önce kötü kod örneği gösterip doğrusunu yapmanızdır. Peki spagetti kod nedir ?
Spagetti Code
Ne iş yaptığı anlaşılmayan, yığılmış kodlardan oluşmaktadır.
Hadi gelin şimdi program.cs dosyamızı açalım.

Kırmızı alan içindeki Program.cs (csharp dosyası) bizim main yani ana sınıfımızdır program ilk olarak oradan başlar.
Çift tıklayıp dosyamızı açalım.
Ardından ekrana yazı yazdıralım. Bunun için snippet kısayolunu kullanacağız

Yukarıdaki resimde gördüğünüz gibi cw yazın ve iki kere tab basın.

İki kere tab bastığınız zaman sizi yukarıdaki resim de yazan Console.WriteLine karşılaması gerekiyor.

“ “ içerisinde istediğiniz yazıyı yazabilirsiniz. Sadece yazı değil sayı veya variable yazabilirsiniz.

F5 Kısayoluna veya kırmızı ok ile göstermiş olduğum start tuşuna basarak çalıştırabilirsiniz.

Gelin şimdi birde artık gerçek hayata yakın örnekler yapalım. Bir bankayı düşünelim.
Bizim ihtiyacımız olanlar:
- Müşteri Sınıfı (Customer Class)
- Bireysel (Individual)
- Kurumsal(Corporate)
- Interface & CRUD Operation
ilk olarak müşteri sınıfını oluşturalım.

Bir müşterinin neyi olabilir ??
- Id
- Şifre
- Telefon
Gibi özelliklere sahip olabilir. Hadi gelin şimdi bu özellikleri tanımlayalım.


Özelliklerimizi tanımladık ve encapsulate ettik fakat private olduğu için bizim bunlara erişim iznimiz yok… Erişim için getter ve setter dediğimiz türkçe karşılığı veriyi al(get), veriyi değiştir(set) yapmalıyız.
Şimdi ilk olarak setter metotlarını tanımlayalım.

this ile yukarıda bu sınıfa ait tanımladığımız özelliklere eriştik ve metot içinden almış olduğumuz parametleri artık set edebilir diğer ifade ile özelliği artık değiştirebiliriz.
Şimdi birde özelliklerimize erişelim ve özelliği geri döndürelim. Unutmayınız ki void herhangi bir özelliği geri döndürmez .

Public yani dışarıdan erişebilir metot tanımladık ve bu metotların tipini string olarak belirledik. Burada bir noktaya değinmek istiyorum.
Return veriyi geri döndürmek için kullanırız yani callback yaparız.

Bakın şimdiden spagetti kodlar yığılmaya başladı… Bunun için refactor dediğimiz kodu iyileştirme sürecine geçiş yapacağız ama şimdi değil.
Şimdi gelin Main içine tıklayın. tabi ilk olarak bu kodlarımızı comment yapalım yani yorum satırına alalım bunuda CTRL + K + C kısayolu ile halledeceğiz eğer ileride uncomment yorum kaldırmak istersek CTRL + K + U yapabilirsiniz.

Yeni bir kod yazmaya geçmeden önce Instance nedir onu anlatmak istiyorum önemli bir konu.
Instance
Yazmış olduğumuz Customer sınıfın örneğini oluşturmaya Instance denir.
Main metodu içinde yeni bir satıra geçelim.

İlk Customer referans tipini belirtik yani referans alacağını söyledik.
İkinci Customer ise yeni bir müşteri oluşturmuş olduk.
Müşteri oluşturduk oluşturmasına ama maalesef ki hala müşterinin bilgileri tanımlı değil.
Hadi gelin özelliklerini yani bilgilerini tanımlayalım.

musteri. yazdığınız zaman ekranınızda setter ve getter listelenecektir.
Şuan herhangi bir değerimiz olmadığı için yani null(Boş) olduğu için ilk olarak setter kullanmalıyız.

Gördüğünüz gibi son hali bu şekilde olacaktır fakat dikkatinizi bir yere çekmek istiyorum müşteri.id bize kızdı. Sebebi encapsulate yani dışarıdan erişim vermediğimiz için kızarıyor.
Şimdi o satırı silip yeni bir satıra geçelim ve ardından şunu yazalım:

Burada gördüğünüz gibi ekrana müşterinin email adresini getter yaparak bastırıyoruz.

Ekran çıktısının sonucu yukarıdaki resim gibidir.
Hadi Gelin şimdi ufak bir refactor yapalım yani kodumuzu iyileştirelim.
Customer sınıfın üstüne gelip ampüle basalım. Move Type to Customer.cs seçelim.


Bakın yukarıdaki resimde gözüktüğü gibi kodumuz hem okunabilir oldu hem de kısa oldu…
Birde Individual Customer oluşturalım yani bireysel müşterimizi. Solution üstüne sağ tık yapıp yeni bir class oluşturalım aynı şekilde ve sınıf adı IndividualCustomer.cs yapalım.

Bir önemli noktaya daha değinmek istiyorum.
Extend
Sınıfların birbirlerini miras/kalıtım(inheritance) olarak kullanımında yer almaktadır.

Yukarıdaki resimde Bireysel müşteri de bir müşteridir ifadesini sınıfımıza tanıttık.
Bireysel müşterinin kendine has özellikleri olabilir bunlar:
- TCNO
- Adres Bilgisi
Gibi çeşitli özellikler olabilir fakat daha çok uzamasın diye kısa tutacağım. Setter ve Getter tanımlayalım.

IndividualCustomer Customer sınıfından miras aldığı için id , email, telefon nuamrası ve şifre gibi diğer özellikleri tekrar yazmak zorunda değiliz biz bireysel müşteri çağırırken onlarda gelecektir.
Instance örneğini değiştirmek ile başlayalım.

Referans Tip Müşteri tipinde fakat şöyle bir detay var örneğini oluşturduğumuz sınıf ondan miras alan sınıftır dolayısıyla herhangi bir sınıf ondan inheritance alıyor ise çağırabilirsiniz. Kaydedelim ve F5 basalım.

Yukarıdaki gördüğünüz gibi herhangi bir sorun olmadı. Bireysel müşterimizi tanımladık ve ekrana bastırdık.
Gelin şimdi birde bireysel müşteriye has özellikleri tanımlayalım ve set edelim.
Tanımlamadan önce Customer referans tipini IndividualCustomer olarak değiştirelim.

Artık Hem Müşteri sınıfın özelliklerini hem de Bireysel Müşteriye ait özellikleri get ve set edebiliyoruz.
Aynı şekilde yukarıda yaptığımız adımları corporate yani kurumsal müşteri içinde yapacaksınız.
Birlikte örnek CRUD operasyonu yapalım.
Yine aynı şekilde yeni bir class ekle penceresine gelin. Oradan Interface yazanı seçin. İsmini IIndividualService.cs yapın.
C# İsimlendirme gereği Interfaceler isimlendirilirken mutlaka başına I Interface baş harfi konulur bir interface olduğunu belirtir. Örneğin ICustomerService gibi.

Bireysel müşteri servisimizi tanımladık şimdi interface içine CRUD operasyonu tanımlamak kaldı. CRUD İşlemlerini tanımlayalım.

CRUD İşlemini tanımladık. Birde bu servisi implemente edecek managera ihtiyacımız var.
Manager
İş katmanında kontrolleri ve olayları yaptığımız sınıftır. Bir manager implemente ediliyorsa artık o manager hangi metotları oluşturacağını biliyor demektir.
Class oluşturalım ve ismini IndividualManager.cs yapalım.

Şuanda IndividualManager IIndividualService implemente ediyor ve bakın bize kızıyor. Bunun sebebi üstüne geldiğinizde göreceksiniz. Diyor ki ya sen implemente ettin ama benim metotlarımı oluşturmadın benim onlara ihtiyacım var. IIndividualService üstüne gelelim ve ampüle tıklayalım. Ardından Implement interface seçelim.

Artık sınıfımızı implemente etmiş olduk. Oluşturmuş olduğu metotlar bizim servise tanımladığımız metotlardır fakat onların içinde throw new yazan satırları silelim.
Sildiğimiz satırlar yerine ekran çıktımızı yazdıralım.

Tekrar Program.cs çift tıklayalım.
Şimdi Oluşturmuş olduğumuz IndividualManager için main içinde instance oluşturalım.


Yeni bir müşteri oluşturmak istediğimizde manager çağırdık fakat bize kızdı bunun sebebi bizim servis ve managerda method parametresi olarak bana bir müşteri göndermelisin dediğimiz içindir. Oluşturmuş olduğunuz bireysel müşteriyi create içine tanımlayın.

Bakın artık kızmıyor. Tüm isterini yerine getirdik.
Gelin şimdi f5 basarak çalıştıralım.

Başarılı şekilde bireysel müşterimizi oluşturduk.
Hepsi bu kadardı artık C# OOP dünyasına geçiş yaptınız.
Aramıza Hoş geldiniz 🎉
Bu medium makalemde amacım hızlıca sizi oop dünyasına hızlı giriş yaptırmaktı umarım faydalı olabilmiştir 👍