December 17, 2025 (8mo ago) — last updated July 25, 2026 (24d ago)

Soyutlama vs Kapsülleme: TypeScript ile Modern Tasarım

TypeScript örnekleriyle soyutlama ve kapsüllemeyi öğrenin; tasarım ilkeleri, kod kokuları ve pratik refaktörleme adımlarıyla daha sürdürülebilir kod yazın.

← Back to blog
Cover Image for Soyutlama vs Kapsülleme: TypeScript ile Modern Tasarım

Soyutlama ve kapsülleme, modern yazılım tasarımının temel prensipleridir. Bu rehberde TypeScript örnekleriyle her iki kavramın farklarını, birlikte nasıl çalıştıklarını ve gerçek dünyadaki yaygın kullanım örneklerini keşfedeceksiniz.

Soyutlama vs Kapsülleme: TypeScript Rehberi

Kesin bir rehber: soyutlama ve kapsülleme. Pratik TypeScript örneklerini, gerçek dünya kullanım durumlarını ve temiz kod yazma için tasarım ilkelerini keşfedin.

Giriş

Soyutlama ve kapsülleme, modern nesne yönelimli tasarımın iki temel taşıdır. Soyutlama, bir bileşenin ne yaptığını açık ve basit bir arayüzle sunar; kapsülleme ise iç durumu korur ve bu duruma kontrollü erişim sağlar. Birlikte, ekiplerin öngörülebilir, ölçeklenebilir ve sürdürülebilir sistemler kurmasına yardımcı olurlar. Bu rehberde TypeScript örnekleriyle her iki kavramın nasıl uygulanacağını ve uygulamadaki yaygın tuzakların nasıl düzeltileceğini göreceksiniz.

Temel Farkı Anlamak: Soyutlama vs. Kapsülleme

Yazılım mühendisliğinde her iki kavram da temiz kod tasarımı için merkezi öneme sahiptir. Soyutlama, yalnızca gerekli olanı açığa çıkararak karmaşıklığı azaltır. Kapsülleme ise veriyi, üzerinde işlem yapan yöntemlerle paketler ve dış kodun iç durumu bozmamasını sağlar.

Soyutlamanın amacı karmaşıklığı dizginlemektir: temel özellikleri açığa çıkaran ve uygulama ayrıntılarını gizleyen yüksek seviyeli bir arayüz sunar. Örneğin, bir araba gösterge paneli hız ve yakıt göstergesini verir; arkasındaki sensörler ve kablolamayı göstermez.

Kapsülleme ise savunmacı bir stratejidir: bir nesnenin verilerini ve yöntemlerini koruyucu bir sınıf içine paketler; bu sayede dış kod nesnenin durumunu doğrudan manipüle edemez ve bütünlük korunur.

Kısa Karşılaştırma: Soyutlama vs. Kapsülleme

KavramBirincil AmaçUygulama MekanizmasıHangi Soruyu Yanıtlar
SoyutlamaKarmaşıklığı gizleyip arayüzü sadeleştirmekArayüzler, abstract sınıflar, net fonksiyonlarBu nesne ne yapıyor?
KapsüllemeVeriyi korumak ve yöntemlerle paketlemekErişim belirteçleri (private, public), getter/setter'larBu nesnenin içi nasıl çalışıyor?

Eğitim ve saha araştırmaları, iyi tanımlanmış soyutlama katmanlarının bileşen yeniden kullanımını ve sürdürülebilirliği artırdığını gösteriyor12.

Önemli çıkarım: Soyutlama basit bir “kamu yüzü” oluşturur. Kapsülleme ise güvenli bir “özel iç mekan” inşa eder.

Her iki ilke birbirini tamamlar: güçlü kapsülleme, tüketicileri kırmadan evrilebilen temiz bir soyutlama açığa çıkarmayı mümkün kılar. Daha derin karşılaştırma için OOP vs Functional Programming rehberine bakın.

Soyutlama Karmaşık Sistemleri Nasıl Basitleştirir

Soyutlama, geliştiricilerin önemli olana odaklanmasını sağlar. Büyük uygulamalarda iyi tasarlanmış soyutlamalar bilişsel yükü azaltır ve ekiplerin sistemin farklı parçaları üzerinde bağımsız çalışmasına imkan tanır. Endüstri anketleri, soyutlama ve arayüz kullanımının modern yığınlarda yaygın olduğunu gösteriyor2.

Bir Ödeme Ağ Geçidi ile Bir Sözleşme Tanımlama

Stripe veya PayPal gibi birden çok ödeme sağlayıcısını entegre ederken, TypeScript arayüzleri sisteminizi sağlayıcıdan bağımsız kılar.

// Soyut sözleşme
interface PaymentGateway {
  processPayment(amount: number): Promise<{ success: boolean; transactionId: string }>;
}

Bu arayüz sistemin neye ihtiyaç duyduğunu bildirir; sağlayıcıların nasıl uyguladığı değil. Bu ayrım sistemi esnek ve genişletmesi kolay kılar.

Soyut Sözleşmeyi Uygulama

Somut sınıflar arayüzü uygular ve sağlayıcıya özgü ayrıntıları kapsüller.

class StripeGateway implements PaymentGateway {
  async processPayment(amount: number): Promise<{ success: boolean; transactionId: string }> {
    console.log(`Processing payment of $${amount} via Stripe...`);
    const transactionId = `stripe_${Math.random().toString(36).substring(2)}`;
    return { success: true, transactionId };
  }
}

class PayPalGateway implements PaymentGateway {
  async processPayment(amount: number): Promise<{ success: boolean; transactionId: string }> {
    console.log(`Processing payment of $${amount} via PayPal...`);
    const transactionId = `paypal_${Math.random().toString(36).substring(2)}`;
    return { success: true, transactionId };
  }
}

Bu kurulumla uygulamanın geri kalanı sağlayıcıdan bağımsızdır. Yeni bir geçit eklemek, aynı arayüzü uygulayan yeni bir sınıf eklemeyi gerektirir.

Kapsüllemeyi Kullanarak Veri Bütünlüğünü Korumak

Kapsülleme, bir nesnenin özelliklerini bunlar üzerinde işlem yapan yöntemlerle paketler ve dış kodun iç durumu bozmasını engeller. Bu sayede iç doğrulama ve invariantlar tek bir noktada uygulanır.

UserProfile Sınıfı ile Pratik Bir Örnek

Aşağıdaki örnek, e-posta alanını özel yapıp güncelleme için kontrollü bir yöntem açığa çıkarır.

class UserProfile {
  private _email: string;
  public readonly userId: string;

  constructor(userId: string, email: string) {
    this.userId = userId;
    this.updateEmail(email);
  }

  public get email(): string {
    return this._email;
  }

  public updateEmail(newEmail: string): void {
    if (!newEmail || !newEmail.includes('@')) {
      throw new Error("Invalid email format provided.");
    }
    this._email = newEmail.toLowerCase();
    console.log(`Email updated for user ${this.userId}`);
  }
}

_email özel olduğu için dış kod onu doğrudan ayarlayamaz; tüm güncellemeler updateEmail üzerinden yapılır ve burada doğrulama uygulanır.

Kontrollü Erişimin Faydaları

Kapsülleme somut faydalar sağlar:

  • Geliştirilmiş bakım: iç doğrulamayı tüketicileri etkilemeden değiştirebilirsiniz.
  • Azaltılmış karmaşıklık: tüketiciler iç ayrıntılar yerine küçük bir genel yüzeyi kullanır.
  • Geliştirilmiş güvenlik: özel verilerin kazara veya kötüye kullanımını önler.

Soyutlama ve Kapsülleme Birlikte Nasıl Çalışır

Soyutlama kamu sözleşmesini tanımlar; kapsülleme bu sözleşmeyi yerine getiren iç ayrıntıları gizler. Birlikte kullanıldığında bileşenler kolayca değiştirilebilir ve test edilebilir olur.

Araba Analojisi

Gösterge paneli soyutlamadır: karmaşık bir makineyi sürmek için basit kontroller sunar. Motor bölmesi kapsüllemedir: ayrıntılar gizlenmiş ve korunmuştur. Sen gösterge panelini kullanırsın ve kapsüllenmiş motor öngörülebilir şekilde yanıt verir.

Sinerjiyi Koda Çevirme

React bileşeni geliştirirken kaygıları ayırın: bir IApiService arayüzü tanımlayın, HTTP mantığını kapsülleyen bir ApiHandler uygulayın ve bileşenin yalnızca soyut arayüzü tüketmesini sağlayın.

export interface IApiService {
  fetchData(endpoint: string): Promise<any>;
}

export class ApiHandler implements IApiService {
  private readonly baseUrl: string = 'https://api.example.com';
  private readonly apiKey: string;

  constructor(apiKey: string) {
    this.apiKey = apiKey;
  }

  public async fetchData(endpoint: string): Promise<any> {
    const response = await fetch(`${this.baseUrl}/${endpoint}`, {
      headers: {
        'Authorization': `Bearer ${this.apiKey}`,
        'Content-Type': 'application/json'
      }
    });

    if (!response.ok) {
      throw new Error('Network response was not ok');
    }
    return response.json();
  }
}

React tüketicisi yalnızca IApiServicee bağımlı olduğundan, test veya farklı bir arka uç için uygulamaları değiştirmek kolaylaşır.

Yaygın Kod Kokularını Tanımlama ve Düzeltme

Yanlış uygulanan soyutlama ve kapsülleme uzun vadede kaliteyi düşüren kod kokularına yol açar. En yaygın olanlar sızdıran soyutlamalar, Tanrı nesne (God object), veri kümelenmeleri ve ilkel obsesyondur.

Sızdıran Soyutlamalar

Sızdıran bir soyutlama, tüketicilerin işi yapmak için iç ayrıntıları bilmesini gerektirir. Bunu düzeltmek için soyutlamayı güçlendirin ve gerçek tüketici ihtiyaçlarını karşılayan daha yüksek seviyeli yöntemler ekleyin.

Tanrı Nesneler

Tanrı nesne çok fazla sorumluluk üstlenir ve tek sorumluluk ilkesini ihlal eder. Bunu daha küçük, uyumlu sınıflara bölün.

Yeniden Faktörleme Kontrol Listesi

Kod KokuTanımRefaktoring Eylemi
Leaky AbstractionSoyutlama uygulama detaylarını açığa çıkarırArayüze daha yüksek seviyeli metotlar ekleyin
God ObjectBir sınıf ilgisiz sorumluluklar toplarDaha küçük sınıflara ayırın
Data ClumpsDeğişken grupları tekrarlanırYeni bir sınıf/nesne oluşturun (ör. DateRange)
Primitive ObsessionDomain kavramları için ilkel tipler kullanımıDeğer nesneleri oluşturun (ör. EmailAddress)

Örnek: İlkel Obsesyonu Düzeltme

Önce: işlevler arasında tekrar eden doğrulama mantığı.

function sendWelcomeEmail(email: string, content: string) {
  if (!email.includes('@')) {
    throw new Error('Invalid email format in sendWelcomeEmail!');
  }
}

function updateUserProfile(userId: number, email: string) {
  if (!email.includes('@')) {
    throw new Error('Invalid email format in updateUserProfile!');
  }
}

Sonra: e-postayı bir değer nesnesine kapsülleyin.

class EmailAddress {
  private readonly value: string;

  constructor(email: string) {
    if (!email || !email.includes('@')) {
      throw new Error('Invalid email format.');
    }
    this.value = email.toLowerCase();
  }

  public asString(): string {
    return this.value;
  }
}

function sendWelcomeEmail(email: EmailAddress, content: string) {
  // use email.asString()
}

function updateUserProfile(userId: number, email: EmailAddress) {
  // use email.asString()
}

Kapsülleme yinelenen kontrolleri ortadan kaldırır ve geçersiz verilerin iş mantığına ulaşmasını engeller.

Yapay Zeka Çift Programlamayı Temiz Kod ile Güçlendirme

Temiz soyutlamalar ve kapsüllenmiş uygulamalar yapay zeka kod asistanlarının daha isabetli öneriler üretmesini sağlar. Net arayüzler AI’nın niyetini anlamasını kolaylaştırır; kapsülleme ise AI önerilerinin özel duruma doğrudan müdahale etmesini engelleyerek güvenliği artırır4.

Yaygın Takılma Noktaları: Soyutlama vs. Kapsülleme

Soyutlama olmadan kapsülleme olabilir mi?

Evet. Bir sınıf durumunu gizleyebilir ve onunla etkileşime giren yöntemler sağlayabilir. Ancak genel arayüz dağınık ise etkili bir soyutlama oluşmaz.

Soyutlama sağlamak için sadece arabirimler mi gereklidir?

Hayır. Soyutlama, karmaşıklığı gizleyen herhangi bir mekanizmadır. İyi adlandırılmış fonksiyonlar, modüller veya küçük servisler bile faydalı soyutlamalar sağlar.

Erişim belirteçleri nereye uyuyor?

private ve public gibi erişim belirteçleri kapsüllemeyi uygulamak için kullanılan araçlardır. Soyutlama ise hangi üyelerin genel olarak açığa çıkarılacağını seçen tasarım kararıdır.

Kısa Soru-Cevap

S1: Soyutlama ve kapsüllemeyi ayırt etmenin en basit yolu nedir?

C1: Farklı sorular sorun. Soyutlama “Bu ne yapıyor?” sorusunu yanıtlar; kapsülleme “İç durum nasıl korunuyor?” sorusunu yanıtlar.

S2: TypeScript’te ne zaman arayüzler yerine sınıflar kullanmalıyım?

C2: Sözleşmeleri tanımlamak için arayüzleri, davranışı uygulamak ve durumu kapsüllemek için sınıfları kullanın. Gevşek bağımlılık ve daha kolay test için arayüzleri tercih edin.

S3: Kodumda sızdıran bir soyutlamayı veya Tanrı nesneyi nasıl fark ederim?

C3: Tüketicilerde tekrar eden uygulama detayları, uzun yöntem listeleri ve sistemin birçok ilgisiz kısmına dokunan sınıflar arayın. Bu işaretler yeniden faktörleme gerektiğini gösterir.

Ek Kısa Soru-Cevap Bölümü

S4: Soyutlama her zaman iyi midir?

Hayır. Fazla soyutlama gereksiz karmaşıklık yaratabilir. Soyutlamayı, gerçek ihtiyaçları ve kullanım desenlerini destekleyecek şekilde uygulayın.

S5: Kapsülleme testleri zorlaştırır mı?

Hayır. Kapsülleme, iyi tasarlanmış arayüzlerle birleştiğinde birimleri kolayca izole edip test etmeyi sağlar.

S6: Hemen uygulamaya başlamak için en iyi adım nedir?

Kod tabanınızda sık tekrar eden veya çok büyük sınıfları tespit edip, önce onları küçük, anlamlı arayüzlere ve kapsüllenmiş sınıflara bölün.

1.
California Department of Education, “Bilgisayar Bilimleri Standartları ve Çerçevesi,” https://www.cde.ca.gov/ci/sc/cf/
2.
Stack Overflow, “Geliştirici Anketi 2022,” https://survey.stackoverflow.co/2022/
3.
Yazılım modülerliği ve yeniden kullanımı üzerine çalışma, ACM Digital Library, https://dl.acm.org/doi/10.1145/3468264.3468545
4.
← 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.