Spagetti Kod

Spaghetti Code
95
15/08/2026

Kontrol akışı anti-desenleri, kısıtlanmamış kod yürütmenin tarihi ve modüler, sürdürülebilir yazılımlar geliştirmeye yönelik pratik stratejiler üzerine bir inceleme.

Birincil Koku Karmaşık Atlamalar
Tarihsel Köken GOTO & Global Değişkenler
Çözüm Yapılandırılmış Akış
Hedef Desen Ravyoli (Modüler)

1. Spagetti Kod Nedir?

Spagetti Kod (Spaghetti Code), karmaşık, iç içe geçmiş ve kontrol yapısı düğümlenmiş bilgisayar kaynak kodları için kullanılan gayriresmî bir terimdir. Birbirine dolanmış bir tabak makarna gibi, kodun girdiden çıktıya çalışma sürecini takip etmek; öngörülemeyen atlamaları, global değişken değişimlerini ve birbirinden uzak rutinlerdeki yan etkileri izlemeyi gerektirir.

Bir kod tabanı spagettiye dönüştüğünde, tek bir özellik eklemek veya küçük bir hatayı düzeltmek genellikle uygulamanın görünüşte tamamen alakasız bölümlerinde beklenmedik hataları tetikler.

Tarihsel Perspektif 1968: Yapısal Programlamanın Doğuşu

İlk assembly ve prosedürel dillerde (BASIC, FORTRAN, erken dönem C), programcılar satırlar arasında geçiş yapmak için büyük ölçüde kısıtlanmamış GOTO atlamalarına güveniyorlardı. Mart 1968’de Hollandalı bilgisayar bilimci Edsger W. Dijkstra, insan bilişsel sınırlarının yürütme yapısının statik kod organizasyonunu yansıtmasını gerektirdiğini savunduğu çığır açan “Go To Statement Considered Harmful” (GOTO İfadesi Zararlı Kabul Edildi) mektubunu yayımladı.

Reklam
Okumaya Aşağıdan Devam Edin

2. Mimari Makarna Taksonomisi

Yazılım mühendisliği kültüründe, farklı mimari kusurlar yapısal düzenlerine göre makarna türleriyle adlandırılır:

Spagetti Kod Yapılandırılmamış & Düğümlü

Kontrol akışının rastgele atlamalar, global değişken mutasyonları ve belirgin modüler sınırları olmayan geri çağırma (callback) zincirleriyle öngörülemez şekilde aktığı kod yapısı.

Temel Yapısal Göstergeler:
  • Yüksek bağımlılık: 1 dosyayı değiştirmek 5 alakasız özelliği bozar
  • Derin koşul iç içeliği (> 4 girinti seviyesi)
  • Global duruma veya window değişkenlerine aşırı bağımlılık
  • İzole birim testleri (unit tests) yazmanın zor veya imkansız olması
Yapı Önizlemesi Spagetti Kod
// ❌ Spagetti Kod Örneği
function handleUserOrder(e) {
  window.currentUserState.status = "processing";
  if (e && e.target && e.target.dataset) {
    validateCart(window.cart, function(err, valid) {
      if (!err && valid) {
        chargeCard(function(paymentRes) {
          if (paymentRes.ok) {
            window.location.href = "/success";
            updateGlobalDatabaseDirectly();
          }
        });
      }
    });
  }
}

3. İnteraktif Yürütme Haritası

Düğümlü Spagetti Akışı

Fonksiyon çağrı graflarını gerçek zamanlı olarak görselleştirin. Düğümlenmiş bağımlılıkların, temiz ve tek yönlü katmanlı mimariye kıyasla nasıl öngörülemez ve çapraz kesişen yürütme yolları oluşturduğunu inceleyin.

Diyagramdaki düğümlere tıklayarak yan etkileri inceleyin.

Çalışma özelliklerini, bağımlılıklarını ve yan etkilerini incelemek için diyagramdaki herhangi bir fonksiyon düğümüne tıklayın.

4. Anti-Desenleri Yeniden Yapılandırma

Yaygın spagetti desenlerini temiz ve yeniden yapılandırılmış alternatifleriyle doğrudan karşılaştırın:


Yeniden Yapılandırma İlkesi: Derin geri çağırma girintileri (Piramit Deseni / Pyramid of Doom) hata yönetimini gizler ve asenkron kontrol akışını karmaşıklaştırır. Async/await yapısına geçmek akışı düzleştirir.

Önce: Düğümlü Anti-Desen Yüksek Sürtünme
// ❌ Düğümlü Callback Spagettisi
function getUserDashboard(userId, callback) {
  db.findUser(userId, function(err, user) {
    if (err) return callback(err);
    db.getOrders(user.id, function(err, orders) {
      if (err) return callback(err);
      db.getStats(orders, function(err, stats) {
        if (err) return callback(err);
        callback(null, { user, orders, stats });
      });
    });
  });
}
Sonra: Temiz Yapılandırılmış Akış Sürdürülebilir
// ✅ Temiz ve Düzleştirilmiş Asenkron Akış
async function getUserDashboard(userId: string): Promise<DashboardData> {
  const user = await db.findUser(userId);
  const orders = await db.getOrders(user.id);
  const stats = await db.getStats(orders);

  return { user, orders, stats };
}

5. Temiz Kontrol Akışı İçin 5 Altın Kural

Kural 01

Tek Sorumluluk Prensibi (SRP)

Her fonksiyon, modül veya bileşenin değişmek için yalnızca tek bir nedeni olmalıdır. DOM işlemlerini iş mantığı (business domain) kurallarından ayırın.

Kural 02

Derin İç İçe Geçme Yerine Koruma İfadeleri (Guard Clauses)

Geçersiz durum veya eksik parametrelerde erkenden dönüş (return) yapın. Ana yürütme akışını editörünüzün sol kenarında hizalı tutun.

Kural 03

Saf Fonksiyonlar & Açık Sözleşmeler

Paylaşılan global argümanları veya window durumunu değiştirmek yerine, her zaman yeni veri döndüren fonksiyonları tercih edin.

Kural 04

Tek Yönlü Veri Akışı

Veri ebeveynden çocuğa doğru aşağı akmalı, olaylar (events) ise yukarı doğru iletilmelidir. Asla çift yönlü olay döngüleri oluşturmayın.

Advertisement
Continue Reading Below