Spagetti Kod

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.
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.
İ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ı.
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:
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ı.
- •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ı
// ❌ 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.
Ç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:
// ❌ 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 });
});
});
});
}// ✅ 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
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.
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.
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.
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.