Skip to content

Bölüm 9 / 15

OOP nedir, neden var

Prosedürel koddan nesneye geçiş.

7 dakikalık okuma

Sekiz derste prosedürel programlamayı kurdun: veri değişkenlerde, iş metotlarda. Bu ders o yaklaşımın nerede tıkandığını sana bizzat yaşatıyor ve çözümü tanıtıyor: veriyi ve onunla yapılan işi tek birimde toplamak — nesne yönelimli programlama. OOP, İlan B'de açık madde, mülakatlarda ilk beş sorunun garantili üyesidir; bu ders "neden"i, sonraki beş ders "nasıl"ı verir.

01Ne öğreneceksin

  • Prosedürel yaklaşımın büyüme sancısı: paralel diziler ve dağılan kurallar — örnek üzerinde
  • OOP'nin temel fikri: veri + davranış = nesne; sınıf-nesne ilişkisi
  • Dört ilkenin haritası: kapsülleme, kalıtım, polimorfizm, soyutlama — her biri hangi derste derinleşecek
  • OOP'nin neyi çözdüğü, neyi çözmediği; aslında ilk günden beri nesne kullandığın gerçeği

02Sancıyı yaşa: paralel diziler

Bir kurs yönetim programı yazdığını düşün: öğrencilerin adı, notu ve kayıt tarihi tutulacak. Elindeki araçlarla doğal çözüm üç paralel koleksiyondur:

var adlar = new List<string> { "Aysel", "Deniz", "Burak" };
var notlar = new List<int>   { 85, 42, 90 };
var kayitlar = new List<DateTime> { /* ... */ };

// Deniz'in notunu bul: önce adı ara, indeksi diğer listede kullan
var i = adlar.IndexOf("Deniz");
Console.WriteLine(notlar[i]);

Çalışır — ve büyüdükçe çürür. Sorunlar sırayla:

  • Bütünlük senin omzunda: "bir öğrenci" diye bir şey kodda yok; üç listenin aynı indeksinde durması gereken üç parça var. Birinden eleman silip diğerlerinden silmeyi unutursan tüm kayıtlar kayar — derleyici bunu göremez, hata sessizdir.
  • Kurallar dağılır: "not 0-100 arasında olmalı" kuralını kim korur? Nota yazan her kod parçası ayrı ayrı hatırlamak zorundadır; bir yerde unutulursa geçersiz veri içeri sızar.
  • Yeni alan = her yere dokunmak: öğrenciye e-posta eklemek dördüncü liste demektir; öğrenciyle uğraşan her metodun imzası değişir (Yazdir(adlar, notlar, kayitlar, epostalar) — parametre listeleri şişer).

Bu üç sorunun ortak kökü tektir: birbirine ait veriler kodda ayrı yaşıyor; onları bir arada tutan kurallar ise hiçbir yerde yaşamıyor.

03Fikir: veri ve davranış tek birimde

OOP'nin önerisi şudur: "öğrenci" kavramını dilin içinde yeni bir tip olarak tanımla. Bu tip hem veriyi (ad, not, kayıt tarihi) hem o veriyle yapılan işi (not güncelle, geçti mi söyle) tek çatı altında toplar:

class Ogrenci
{
    public string Ad;
    public int Not;
    public DateTime KayitTarihi;

    public bool GectiMi()
    {
        return Not >= 70;      // kural, verinin YANINDA yaşıyor
    }
}

var deniz = new Ogrenci { Ad = "Deniz", Not = 42 };
Console.WriteLine(deniz.GectiMi());   // False — soru nesnenin kendisine soruluyor

Terimleri yerine oturt: sınıf (class), tipin tanımıdır — hangi veriler, hangi davranışlar. Nesne (object), o tipten yaratılmış somut bir örnektir (instance). İlişki, iki derstir kullandığın bir ilişkiyle aynıdır: int bir tip, 5 o tipten bir değerdir; Ogrenci bir tip, deniz o tipten bir nesnedir. Tek sınıftan istediğin kadar nesne yaratılır; her nesnenin verisi kendinindir — deniz.Not ile aysel.Not ayrı gözlerdir.

Paralel dizilerin üç sorunu bu hamleyle tek tek kapanır: öğrencinin parçaları artık tek nesnede durur, listeden tek şey silinir (List<Ogrenci>); kural (GectiMi, not doğrulama) verinin yanında tek yerde yaşar; yeni alan eklemek yalnızca sınıfın tanımına dokunur, metot imzaları değişmez — Yazdir(List<Ogrenci> ogrenciler) olduğu gibi kalır.

04Dört ilke: haritası

OOP dört ilkeyle anlatılır — mülakatın "OOP'nin 4 prensibi nedir?" sorusu, bu hattın kalan derslerinin listesidir. Bugün her birini tek paragraf tanı; her biri kendi dersinde kodla derinleşecek:

İlkeTek cümlelik özüDers
Kapsülleme (encapsulation)Nesnenin verisi dışarıdan gizlenir; erişim kontrollü kapılardan geçer — kural verinin önünde durur11. ders
Kalıtım (inheritance)Bir sınıf, başka bir sınıfın veri ve davranışını devralıp üzerine ekler — ortaklık tek yerde tanımlanır12. ders
Polimorfizm (polymorphism)Aynı çağrı, nesnenin gerçek tipine göre farklı davranır — çağıran, hangi türle konuştuğunu bilmek zorunda kalmaz13. ders
Soyutlama (abstraction)Kullanıcıya ne yapıldığı gösterilir, nasıl yapıldığı gizlenir — sözleşme ile içerik ayrılır13-14. dersler

Şimdiden bir bağ kur: kapsüllemenin tohumu 2. bölümdeki "kural kim korur?" sorusudur; 03. bölümdeki Ogrenci sınıfında Not alanı hâlâ public — yani dışarıdan hâlâ deniz.Not = -50; yazılabilir. Bu açığı bir sonraki iki ders kapatacak (property + erişim belirleyiciler). Dört ilkeyi sayarken bazı kaynakların soyutlamayı ayrı saymayıp üçlü anlattığını da bil; sınavda dörtlü liste beklenir.

05Zaten nesne kullanıyordun

OOP sana yeni bir dünya gibi sunuldu ama ilk günden beri içindesin — farkında olmadan:

  • "merhaba".Length ve metin.Split(' ') — string bir nesnedir: verisi (karakterler) ve davranışları (Length, Split, ToUpper) birliktedir.
  • DateTime.Now.AddDays(15) — DateTime, veri (tarih) + davranış (AddDays, ToString) paketidir; 2. derste kullandın.
  • List<int>'in Add'i, Dictionary'nin TryGetValue'su — geçen dersin koleksiyonlarının tamamı sınıftır; new List<string>() yazarken nesne yaratıyordun.
  • Console.WriteLine — Console da bir sınıftır; farkı, nesne yaratmadan sınıfın kendisi üzerinden çağrılmasıdır. Bunun adının static olduğunu bir sonraki derste öğreneceksin.

Yani bu hattın kalanında öğreneceğin şey "nesne kullanmak" değil — onu zaten yapıyorsun. Öğreneceğin şey kendi tiplerini tasarlamak: .NET'in sana string'i, List'i verdiği kalitede, kendi alanının kavramlarını (Ogrenci, Fatura, Siparis) dile eklemek.

06OOP neyi çözer, neyi çözmez

Dengeli bakış, mülakatta ezber sayan adayla düşünen adayı ayırır. OOP'nin gerçek kazançları: modelleme — kod, alanın kavramlarıyla konuşur; değişim dayanıklılığı — kural tek yerde olduğundan değişiklik tek noktaya iner; ekip ölçeği — sınıflar, farklı kişilerin birbirini bozmadan çalışabildiği sınırlar çizer. Kamu ilanlarının istediği ASP.NET Core, EF Core gibi çatıların tamamı OOP üzerine kuruludur; framework'ü iyi kullanmak, sınıf/arayüz dilini iyi konuşmaktır.

Çözmediği şeyler de net olsun: OOP kötü algoritmayı hızlandırmaz, yanlış problemi doğru yapmaz. Ve aşırısı vardır: üç satırlık betiğe beş sınıf çıkarmak, her kavrama "belki lazım olur" diye soyutlama katmak — bunun sektördeki adı aşırı mühendisliktir ve Hat 04'te (DRY/KISS/YAGNI dersi) ayrıca ele alınacak. Ölçüt şudur: sınıf, bir arada değişen veri ve davranış varsa kazanç sağlar; yoksa metot yeter. C#'ta pratik gerçek şu ki ölçeği büyüyen her kod sınıflara evrilir — dilin kendisi de bunu varsayar: yazdığın "sınıfsız" satırları bile derleyici perde arkasında bir sınıfın içine sarar (top-level statements). C# %100 nesne yönelimli bir dildir; şimdiye kadar dilin sana bunu göstermeyen kibar yüzünü kullandın.

07Mini alıştırma — sancıyı ölç

Yaklaşık 15 dakika · dotnet new console -o oop-oncesi · bu kod bir sonraki derste dönüştürülecek

  1. Paralel listelerle küçük kurs programı yaz: adlar, notlar (5'er kayıt). İki metot ekle: void Listele(List<string> adlar, List<int> notlar) (ad — not — geçti/kaldı satırları) ve double SinifOrtalamasi(List<int> notlar).
  2. Şimdi değişiklik iste(n)diğini varsay: her öğrenciye bir de kayitYili eklenecek ve listede o da görünecek. Ekle — üçüncü liste, Listele'nin imzası, çağrı yerleri… Kaç satıra dokunmak zorunda kaldığını say ve not al.
  3. Kasıtlı bozgun: listenin birinden (yalnızca birinden!) RemoveAt(1) ile kayıt sil, Listele'yi çağır. Kayıtların nasıl kaydığını — Deniz'in Burak'ın notunu almasını — gözle. Derleyicinin buna tek kelime edemediğine dikkat et: tip olarak her şey geçerli, anlam olarak her şey yanlış.
  4. Not düş: 2. adımda dokunduğun satır sayısı ve 3. adımdaki sessiz bozulma — ikisi bir sonraki dersin ölçüm çubuğu. Aynı programı sınıfla yeniden yazınca bu iki sayının nereye indiğini göreceksin. Projeyi silme.

08Kendini sına

Sınıf ile nesne arasındaki ilişki nedir? Daha önce bildiğin hangi ilişkiye benzer?

Sınıf tipin tanımıdır: hangi veriler ve hangi davranışlar olacağını söyler. Nesne, o tipten yaratılmış somut örnektir; her nesnenin verisi kendine aittir. İlişki, int tipi ile 5 değeri arasındaki ilişkinin aynısıdır — Ogrenci bir tip, deniz o tipten bir değerdir. Tek sınıftan sınırsız nesne yaratılabilir.

Paralel dizilerin üç temel sorunu nedir ve sınıf her birini nasıl çözer?

(1) Bütünlük: "bir kayıt" kavramı kodda yoktur, listeler ayrı ayrı bozulabilir — sınıf, parçaları tek nesnede toplar, liste tek tipten olur. (2) Kural dağılması: doğrulamayı her yazan yer ayrı hatırlamalıdır — sınıfta kural verinin yanında tek yerde yaşar. (3) Değişiklik maliyeti: yeni alan tüm metot imzalarını değiştirir — sınıfta yalnızca tip tanımı değişir, imzalar (List<Ogrenci>) sabit kalır.

OOP'nin dört ilkesini birer cümleyle say.

Kapsülleme: veri gizlenir, erişim kontrollü kapılardan geçer. Kalıtım: bir sınıf başka bir sınıfın üyelerini devralıp üzerine ekler. Polimorfizm: aynı çağrı, nesnenin gerçek tipine göre farklı davranır. Soyutlama: ne yapıldığı sözleşme olarak gösterilir, nasıl yapıldığı gizlenir. (Bazı kaynaklar soyutlamayı ayrı saymaz; sınav cevabı dörtlü listedir.)

"C#'ta şimdiye kadar nesne kullanmadım" iddiası neden yanlıştır? İki örnek ver.

string, DateTime, List, Dictionary — hepsi sınıftır ve kullanımları nesne kullanımıdır: metin.Split(' ') string nesnesinin davranışını çağırır; new List<int>() nesne yaratır; DateTime.Now.AddDays(15) veri+davranış paketidir. Hattın kalanında öğrenilen şey nesne kullanmak değil, bu kalitede kendi tiplerini tasarlamaktır.

09Sınav köşesi

Yazılıda nasıl sorulur

Bu konu yazılıda tanım düzeyinde gelir: "Aşağıdakilerden hangisi nesne yönelimli programlamanın temel ilkelerinden değildir?" (şıklara derleme/döngü gibi alakasız kavram karışır — dörtlüyü ezbere bil), "Sınıf ve nesne arasındaki ilişki hangisidir?" (kalıp/örnek; tip/değer). "Aşağıdaki dillerden hangisi nesne yönelimli değildir?" tipinde tarih sorusu da görülür — C#, Java, C++ nesne yönelimlidir; C değildir. İlkelerin tek tek derin soruları kendi derslerinin sınav köşelerinde.

Sözlüde nasıl anlatılır — 2 dakikalık taslak

"OOP nedir, neden kullanılır?" büyük olasılıkla mülakatının ilk teknik sorusu. Ezber liste okuma; sorun→çözüm anlat: (1) Prosedürel kodda birbirine ait veriler ayrı değişkenlerde gezer, kurallar dağılır — değişiklik her yere dokunur, bozulma sessizdir. (2) OOP veriyi ve davranışı sınıfta birleştirir: kural verinin yanında, değişiklik tek noktada. (3) Dört ilkeyi birer cümleyle say — kapsülleme, kalıtım, polimorfizm, soyutlama. (4) Kapanışı dengele: "Her şey sınıf olmak zorunda değil; sınıf, birlikte değişen veri ve davranış varsa değer üretir — aşırı soyutlama da bir maliyettir." Bu son cümle, ilkeleri yaşamış birinin cümlesidir.