Nesne Yönelimli Programlama, en basit anlatımıyla gerçek hayatı uygulama düzeyinde modellememizi sağlayan yaklaşımdır.

Bu prensipler çoğu yerde kopyala-yapıştır bir dil kullanılarak, havada kalan açıklamalar ile anlatılıyor. Ben bunun aksine, gerçek hayattan örnekler vererek, minik kod blokları şeklinde C# ile anlatmaya çalışacağım; mantık OOP olan her dil için zaten aynıdır. Yalnız zamanla genişleyen ve büyüyen projelerde, asıl işlerin bu şekilde sınıf içinde yapılması tavsiye edilmez. Ancak bunun ayrımı şu an için fazla karmaşa yaratacağından tüm işleri sınıf içinde yapacağız.

Temelde dört ana prensip olduğu varsayılır.

  • Encapsulation
  • Inheritance
  • Abstraction
  • Polymorphism

İlki ile başlayalım.

1-Encapsulation

İlk temel prensibimiz Encapsulation, yani Kapsülleme; en anlaşılır şekliyle sınıf içindeki üyelerin olası bir yanlış kullanımdan etkilenmemesi gerektiğini ele alan prensiptir. "Tamam ama olası yanlış kullanım nedir?" derseniz uygulamayı kullananlar değil geliştirme aşamasındaki yanlış kullanımlardan korumaktır amacımız. Modern dillerin çoğunda, bunun için düşünülmüş olan Accessor ya da property seviyelerinde kullanılır. Üyeyi niteleyen public, private, protected, internal erişim belirleyicileri ile veya read-only(sadece okunablir), write-only(sadece yazılabilir) kullanım şekilleri vardır. Kabaca ne olduklarına değinirsek :

public"Halka açık, herkes kullanabilir"  gibi anlamlara gelir. İşaretlediği üyeye diğer tüm sınıflardan erişilebilir.
private"Özel" anlamına gelir. İşaretlediği üyeye diğer sınıflardan değil sadece dahil olduğu sınıftan erişilebilir.
protected"Korumalı" anlamına gelir. Diğer bir OOP prensibi olan Inhertance(Kalıtım) ile doğrudan igilidir. İşaretlediği üyeye diğer sınıflardan erişilemez, sadece dahil olduğu sınıftan ve miras verdiği sınıflardan erişilebilir.
internal"Dahili, içe ait, içsel" gibi anlamları vardır. İşaretlediği üyeye sadece dahil olduğu projeden erişilebilir.

Bunlar kesinlikle bilinmesi gereken teorik bilgiler. Şimdi pratikte bunları küçük kod örneklerine dökelim; gerçek hayattan aklıma gelen örnekler aşağıda.

Bununla ilgili anlaşılması en kolay örnek bir kişinin yaşı olduğunu düşünüyorum. Yaşımızı kendimiz belirleyemeyiz; tabi eğer ışıktan ⚡ hızlı gitmiyorsak.😄Herkesin kesin ve net olarak tek bir doğum tarihi vardır; yaşımız buna göre her yıl değişir. Yani yaş, doğum tarihine sıkı bir şekilde bağlıdır. Siz eğer yaşı her yerden ya da herkes atayabilecek şekilde yazarsanız uygulamanın bir yerinde başka bir geliştirici de bir gün ona herhangi bir yaşı atabilir. Aslında ideal olanı yaş için bir constant tanımlamaktır ama gerçek hayat böyle değil, yaşın sonradan belli yetkiler dahilinde atanmasını doğurabilecek durumlar olabiliyor.

Başka örnekler, ek hesap falan gibi ekstralarını bir kenara bırakırsak; vadesiz hesapta nakit olmadıkça para çektirmezsiniz. Bir gelir için eksi değer girdirmezsiniz; eğer değer negatifse ayrı bir uyarı verip girdirebilirsiniz. Bir öğrenciye 0'dan düşük not verdirmeyebilirsiniz, gibi gibi...

Modellemeler olası en sade ve basit şekilde tutulmuştur.


namespace GurkanTuna.Encapsulation {
	
	class Employee {
        public Employee(string firstName, string lastName, DateTime birthDate) {
            this.FirstName = firstName;
            this.LastName = lastName;
            this.BirthDate = birthDate;
            this.DateOfRecruitment = DateTime.Now;
            Console.WriteLine($"{FirstName} {LastName} ({Age}) {DateOfRecruitment:F} işe başladı.");
        }
		public string FirstName { get; set; }
        public string LastName { get; set; }

        public DateTime DateOfRecruitment { get; private set; }

        public DateTime BirthDate { get; protected set; }
        public int Age => DateTime.Now.Year - BirthDate.Year;
    }	
	
	class Account {
		public decimal Balance { get; set; }
		
		public bool Withdraw(decimal amount) {
            var result = false;
            if (Balance <= 0) {
                Console.WriteLine($"Hesabınızda {Balance} bakiye bulunmaktadır.\n{amount} TL çekebilmek için hesabınıza en az " +
                                  $"{Balance * -1 + amount} TL yatırmanız gerekmektedir.");
            }
            else if (amount > Balance) {
                Console.WriteLine("Hesabınızda yeterli miktar bulunamadı!");
            }
            else {
                Balance -= amount;
                result = true;
            }
            return result;
        }
	} 
}

Nesne Yönelimli Programlama (OOP) Temel Prensipleri 2 - InhertanceNesne Yönelimli Programlama (OOP) Temel Prensipleri 3 - AbstractioNesne Yönelimli Programlama (OOP) Temel Prensipleri 4 - Polymorphism