January 4, 2026 (3mo ago)

Nesne Yönelimli Kapsülleme için Pratik Bir Rehber

Daha temiz, daha sürdürülebilir kod yazmak için nesne yönelimli kapsüllemeyi öğrenin. Bu rehber, bu temel programlama ilkesini gerçek dünyadan örneklerle açıklar.

← Back to blog
Cover Image for Nesne Yönelimli Kapsülleme için Pratik Bir Rehber

Daha temiz, daha sürdürülebilir kod yazmak için nesne yönelimli kapsüllemeyi öğrenin. Bu rehber, bu temel programlama ilkesini gerçek dünyadan örneklerle açıklar.

Nesne Yönelimli Kapsülleme için Pratik Bir Rehber

Daha temiz, daha sürdürülebilir kod yazmak için nesne yönelimli kapsüllemeyi öğrenin. Bu rehber, bu temel programlama ilkesini gerçek dünyadan örneklerle açıklar.

Giriş

Nesne yönelimli kapsülleme, veriyi onu işleyen yöntemlerle bir arada tutar ve iç karmaşıklığı net bir açık arayüzün arkasına gizler. Bu koruma, durumun geçerli kalmasını sağlar, kazara yanlış kullanım riskini azaltır ve büyük kod tabanlarını değiştirmeyi ve test etmeyi kolaylaştırır. Bu rehber, kapsüllemenin neden önemli olduğunu, yaygın hataları ve bugün uygulayabileceğiniz pratik bir TypeScript örneğini açıklar.

Kapsülleme Nedir ve Neden Önemlidir?

Bir direksiyonun üst üste yerleştirilmiş dahili elektronik bileşenlere bağlı olduğunu gösteren bir arabanın eskizi.

Arabayı sürmeyi düşünün. Motorun veya şanzımanın nasıl çalıştığını bilmeden direksiyon, pedallar ve kontrolleri kullanırsınız. Kapsülleme yazılımda da aynı ayrımı sağlar: kullanıcılar için açık kontroller ve uygulama için gizli iç mekanizma. Veriyi özel tutup yalnızca iyi tanımlanmış yöntemleri açığa çıkararak, sistemin diğer parçalarının güvenebileceği öngörülebilir bileşenler yaratırsınız.

Kodun Koruyucu Bariyeri

Kapsülleme, uygulamanın diğer bölümlerinin bir nesnenin iç durumunu doğrudan değiştirmesini engeller. Bunun yerine, etkileşim girdileri doğrulayan, değişmezlikleri (invariants) uygulayan ve değişiklikleri kaydeden veya denetleyen genel (public) yöntemler aracılığıyla gerçekleşir. Faydalar hemen göze çarpar:

  • Veri bütünlüğü: Nesneler geçerli durumları zorlayabilir (örneğin, negatif bakiyeyi engellemek).
  • Azalan karmaşıklık: Tüketiciler uygulama ayrıntılarına değil, basit bir arayüze güvenebilir.
  • Daha güvenli yeniden düzenleme (refactoring): Dahili mantık, genel arayüz sabit kaldığı sürece değiştirilebilir.

Sınıflarda kapsülleme, 1960’larda sınıf kavramını tanıtan Simula gibi nesne yönelimli dillerin ilk günlerine kadar uzanır1.

Kapsülleme Hızlı Başvuru

Temel İlkeNe Anlama GelirNeden Önemlidir
Paketleme (Bundling)Veriyi (özellikler) ve davranışı (yöntemler) tek bir birimde gruplamak.Düzenli, yeniden kullanılabilir modüller oluşturur.
Veri gizlemeDahili verilere doğrudan erişimi kısıtlamak.Durumu korur ve değişmezlikleri uygular.
Genel arayüzYalnızca kontrol edilen yöntemleri açığa çıkarmak.Kullanımı basitleştirir ve karmaşıklığı gizler.

Kapsülleme, bir nesne ile sistemin geri kalanı arasında net bir sözleşme oluşturur; bu da davranışı öngörülebilir ve bakımını kolaylaştırır.

Kapsüllenmiş Kodun Stratejik Faydaları

AlışverişSepeti (ShoppingCart) sınıfı, özel öğeler ve genel yöntemlerle nesne yönelimli kapsüllemeyi gösteren diyagram.

Kapsülleme sadece düzenli bir desen değildir. Zamanla riski azaltır, bakım maliyetlerini düşürür ve güvenliği artırır. İç mekanizmalar açığa çıktığında, değişiklikler bir kod tabanında dalga etkisi yapıp beklenmedik hatalara neden olabilir. Kapsülleme, sabit bir yüzey oluşturur: iç yapıları tüketicileri etkilemeden yeniden düzenleyebilirsiniz.

Esneklik ve Sağlayıcı İzolasyonu

Eğer ödeme mantığı uygulama genelinde dağınık ise, sağlayıcı değiştirmek risklidir. Ödeme mantığını PaymentProcessor gibi bir nesnede kapsüllemek, gateway'e özgü kodu processPayment() gibi tek bir arayüzün arkasına izole eder. Bu, örneğin Stripe'ı PayPal ile değiştirmeyi diğer yerlerde asgari değişiklikle kolaylaştırır.

Kapsülleme ayrıca güvenliği artırır. Parola hash'lerini gizli tutan bir User nesnesi, tüm erişimi doğrulama, kayıt ve izin kontrolleri ekleyebilecek yöntemler üzerinden zorunlu kılar.

Kapsülleme, nesneler için bir güvenlik duvarı gibi davranır: neyin içeri girdiğini ve neyin çıktığını kontrol eder, istenmeyen yan etkiyi azaltır ve hata ayıklamayı basitleştirir.

Ekip Verimliliği

Net nesne sınırları işe alım süresini kısaltır ve bilişsel yükü azaltır. Geliştiriciler bir nesnenin içindekileri değil, onun genel arayüzünü öğrenir; bu da paralel çalışma ve daha güvenli yeniden düzenlemelere imkan verir. Bu uygulamalar, karmaşık sistemler inşa eden ekipler için iyi ölçeklenir.

Uygulamaya Girme: TypeScript'te Kapsülleme

Refactoring yapıldıktan sonra açık 'public' kutudan çıkan uçan böceklerin kilitli 'private' kutuya dönüştüğü bir görsel.

İşte pratik bir karşıtlık: iç durumu açığa çıkaran kırılgan bir alışveriş sepeti ve onu koruyan yeniden düzenlenmiş bir sınıf.

Anti-pattern: Açığa Çıkan Veri

// Bad example: free access to state
const badShoppingCart = {
  items: [
    { name: 'Laptop', price: 1500, quantity: 1 },
    { name: 'Mouse', price: 50, quantity: 2 }
  ],
  total: 1600,
  addItem: function(item) {
    this.items.push(item);
    // Manual total update is error-prone
  }
};

// External code can corrupt state
badShoppingCart.items[0].quantity = -5; // Invalid state
badShoppingCart.total = 100; // Now inconsistent

Herhangi bir kod items veya total üzerinde değişiklik yapabilir ve bu da sepeti güvenilmez hale getirir.

Kapsüllenmiş Sınıf (TypeScript)

class ShoppingCart {
  private _items: { name: string; price: number; quantity: number }[] = [];

  public addItem(name: string, price: number, quantity: number): void {
    if (quantity <= 0 || price < 0) {
      console.error("Invalid item quantity or price.");
      return;
    }

    const existing = this._items.find(i => i.name === name);
    if (existing) existing.quantity += quantity;
    else this._items.push({ name, price, quantity });
  }

  public removeItem(name: string): void {
    this._items = this._items.filter(i => i.name !== name);
  }

  public getTotal(): number {
    return this._items.reduce((t, i) => t + i.price * i.quantity, 0);
  }

  public getItems(): readonly { name: string; price: number; quantity: number }[] {
    return [...this._items];
  }
}

Bunun Neden Daha İyi Olduğu

  1. Özel durum (private state) dış mutasyonu engeller.
  2. Genel yöntemler doğrulama ve değişmezlikleri zorlayacak kontrollü giriş noktalarıdır.
  3. Hesaplanan toplamlar senkronizasyon hatalarını önler.
  4. Savunmacı kopyalama (defensive copying), çağıranların iç dizilere referans tutmasını engeller.

Bu desen, kırılgan bir veri çantasını üzerinde düşünmesi ve test etmesi kolay, kendi içinde tutarlı bir bileşene dönüştürür.

Kaçınılması Gereken Yaygın Kapsülleme Hataları

Güvenlik, test, AI araçları ve çeşitli bağlı yazılım modülleri ile bir API modüler yüzeyini gösteren eskiz diyagram.

Birçok proje birkaç yaygın hata nedeniyle kapsüllemeyi zayıflatır.

Genel (Public) Alanların Aşırı Kullanımı

Alanları (fields) public yapmak, nesnenin değişmezlikleri uygulamasını imkânsız bırakır. Alanları varsayılan olarak private yapın. Davranışı yöntemlerle açığa çıkarın ve yalnızca gerekli olduğunda belirli getter'lar sağlayın.

Genel Get ve Set Yöntemlerinin Yanlış Kullanımı

Her alan için get/set oluşturmak genellikle ekstra adımlar ekleyerek bir public alanı yeniden yaratır. Bunun yerine gerçek işlemleri modelleyin: bir BankAccount için setBalance() yerine deposit() ve withdraw() olmalıdır. Bu davranış zengini yöntemler doğrulama, kayıt ve iş kuralları için doğru yerdir.

Kırılgan Temel Sınıf Problemi

Kalıtım (inheritance), alt sınıflara iç ayrıntıları açığa çıkarabilir ve sıkı bağlanma ile kırılgan temel sınıf problemine yol açabilir. 1980’lerde yapılan araştırmalar, kalıtımın kapsüllemeyi zayıflatabileceğini ve kırılganlığa neden olabileceğini vurgulamıştır2. Bileşimi (composition) tercih edin: bir Car bir Engine olmak yerine bir Engine'e sahip olmalıdır. Bileşim, etkileşimleri genel API'lerle sınırlı tutar ve uygulamaları değiştirmeyi kolaylaştırır.

Bu tuzaklardan kaçınarak, sistem evrildikçe kullanışlı ve güvenilir kalan daha güçlü soyutlamalar yaratırsınız.

Kapsülleme Geliştirmeyi Nasıl Şekillendirir

Kapsülleme testi iyileştirir, API'leri öngörülebilir kılar ve araç destekli geliştirmeyi destekler. İç durum gizli tutulduğunda ve erişim kontrol edildiğinde, birim testleri daha basit ve daha az kırılgan hale gelir. Bir kod tabanı içindeki sabit genel sözleşmeler, dağıtık sistemler için iyi tanımlanmış harici API'lerin sağladığı aynı faydaları yansıtır.

Kapsülleme ve Yapay Zeka Asistanları

Yapay zeka kod araçları yaygınlaşıyor, ancak bunlar kodunuzun açığa çıkardığı bağlama bağlıdır. Alanlar public ise, bir yapay zeka doğrulamayı atlayan kod üretebilir. Özel veri ve temiz bir genel arayüz ile yapay zeka asistanları doğal olarak amaçlanan yöntemleri kullanır ve ince hatalı hataların olasılığını azaltır4.

Kapsülleme Gerçekte Nasıl Kullanılıyor?

Kapsülleme hâlâ yeterince kullanılmıyor. Java kodu üzerine yapılan derin bir analiz, sınıfların yalnızca küçük bir kısmının tamamen sınırlandırıldığını (fully confined) gösterdi; bu da gerçek dünyadaki kod tabanlarında geliştirme için büyük bir fırsat olduğunu ortaya koydu3. Daha iyi araçlar ve alışkanlıklar, iyi kapsüllenmiş sınıfların oranını önemli ölçüde artırabilir.

Temiz Kod Zihniyeti Benimsemek

Kapsülleme bir felsefedir: veriyi koruyun, karmaşık detayları gizleyin ve net sınırlar tanımlayın. Kapsüllemeyi Tek Sorumluluk Prensibi (Single Responsibility Principle) gibi ilkelerle birleştirdiğinizde, bakım ve evrim için daha elverişli bileşenler yaratırsınız.

Mevcut kodu yeniden düzenlerken küçük başlayın. Sorun çıkaran bir sınıf seçin, alanları private yapın, davranışı yöntemler aracılığıyla açığa çıkarın, doğrulama ekleyin ve yineleyin. Sık değişen alanlara odaklanın—buralar en yüksek getiriyi sağlar.


Hazır mısınız kalıcı yazılımlar inşa etmeye? Clean Code Guy, ekiplerin sürdürülebilir, ölçeklenebilir kod göndermesine yardımcı olur; bu da geliştiricilerin ve yapay zeka araçlarının en iyi işlerini yapmalarına olanak tanır. Daha fazla bilgi için ziyaret edin: https://cleancodeguy.com.

Sıkça Sorulan Sorular

Kapsülleme ile soyutlama (abstraction) arasındaki fark nedir?

Kapsülleme, veriyi gizleme ve davranışı açığa çıkarma tekniğidir. Soyutlama, karmaşıklığı gizleyen basitleştirilmiş bir arayüz sunma konseptidir. Kapsülleme, kodda bu soyutlamayı gerçekleştirmenin yollarından biridir.

Fonksiyonel programlamada kapsülleme önemli mi?

Evet. Kapanışlar (closures) ve modül kapsamı (module scope), fonksiyonel kodda kapsüllenmenin biçimlerini sağlar. Amaç aynı: uygulama ayrıntılarını özel tutmak ve etkileşim için küçük, net bir yüzey açmak.

Bir miras kod tabanını nasıl yeniden düzenlemeye başlarım?

Yüksek riskli bir sınıf seçin, alanları private yapın, davranış açısından zengin yöntemler ekleyin, doğrulama ekleyin ve kademeli olarak yeniden düzenleyin. Sık değişen kod parçalarını önceliklendirin.

Hızlı Soru-Cevap

S: Kapsülleme ne kadar hızlı hata sayısını azaltır?
C: Yüksek trafiğe sahip bir bileşeni kapsülledikten sonra, doğrulama ve kontrollü mutasyon birçok yaygın hatayı durdurduğu için genellikle durumla ilgili daha az hata görürsünüz.

S: Her zaman kalıtımdan kaçınmalı mıyım?
C: Her zaman değil. Gerçek bir "is-a" ilişkisini modellediğinde kalıtımı kullanın. Esneklik ve daha iyi kapsülleme için bileşimi tercih edin.

S: Kapsülleme performansa zarar verir mi?
C: Genellikle güvenlik ve bakım kolaylığı faydaları, minimal ek yükü aşıyor. Performans kritik hale gelirse, belirli darboğazları ölçün ve optimize edin.

1.
Dahl, Ole-Johan, and Kristen Nygaard. “Simula—An Algol-based Simulation Language.” 1967. https://en.wikipedia.org/wiki/Simula
2.
Snyder, Allan. “Encapsulation, Inheritance, and the Fragile Base Class Problem.” 1986. http://www.cs.tufts.edu/comp/150CBD/readings/snyder86encapsulation.pdf
3.
Palsberg, Jens, et al. Deep dive analysis on encapsulation in Java programs; study accessed at http://web.cs.ucla.edu/~palsberg/paper/toplas06.pdf
4.
GitHub Copilot features and documentation. https://github.com/features/copilot
← Back to blog
🙋🏻‍♂️

AI kod yazar.
Siz onu uzun süre dayanır hale getirirsiniz.

AI hızlanması çağında, temiz kod sadece iyi bir uygulama değil — ölçeklenen sistemlerle kendi ağırlığı altında çöken kod tabanları arasındaki farktır.