Aikido

Fonksiyonlar nasıl kısa tutulur: sürdürülebilir kod yazma

Okunabilirlik

Kural

Fonksiyonları özlü tutun.
Uzun fonksiyonların anlaşılması, test edilmesi ve bakımı zordur.

Desteklenen diller: 45+

Giriş

Yüzlerce satır süren fonksiyonlar birden fazla sorumluluğu bir arada barındırır; bu da her satırı okumadan fonksiyonun ne yaptığını anlamayı zorlaştırır. Uzun fonksiyonlar genellikle doğrulama, iş mantığı (business logic), veri dönüşümü ve hata yönetimi gibi birden fazla konuyu tek bir yerde ele alır. Bu durum, tek sorumluluk prensibini (single responsibility principle) ihlal eder ve mevcut davranışı bozmadan test edilmesi, hata ayıklanması ve değiştirilmesi zor kodlar ortaya çıkarır.

Neden önemli?

Kodun sürdürülebilirliği: Uzun fonksiyonlar, geliştiricilerin davranışı kavrayabilmek için zihinlerinde daha fazla bağlam tutmasını gerektirir. Tüm mantık birbirine sarılı olduğu için bir kısmı değiştirmek diğerini bozma riski taşır. İstenmeyen yan etkileri öngörmek zor olduğundan hata düzeltmeleri riskli hâle gelir.

Test etme karmaşıklığı: 200 satırlık bir fonksiyonu test etmek, olası tüm kod yollarını tek bir testte kapsamak anlamına gelir; bu da karmaşık bir kurulum ve çok sayıda test senaryosu gerektirir. Daha küçük fonksiyonlar, odaklanmış birim testleriyle (unit test) bağımsız olarak test edilebilir, böylece test süreçleri daha hızlı ve güvenilir hale gelir.

Kod örnekleri

❌ Kural dışı:

async function processOrder(orderData) {
    if (!orderData.items?.length) throw new Error('Items required');
    if (!orderData.customer?.email) throw new Error('Email required');
    const subtotal = orderData.items.reduce((sum, item) => 
        sum + (item.price * item.quantity), 0);
    const tax = subtotal * 0.08;
    const total = subtotal + tax + (subtotal > 50 ? 0 : 9.99);
    const order = await db.orders.create({
        customerId: orderData.customer.id,
        total: total
    });
    await emailService.send(orderData.customer.email, `Order #${order.id}`);
    await inventory.reserve(orderData.items);
    return order;
}

Neden yanlış: Bu fonksiyon; doğrulamayı, hesaplamayı, veritabanı işlemlerini, e-postayı ve envanteri yönetir. Test etmek tüm bağımlılıkların taklit edilmesini (mocking) gerektirir. Vergi mantığında veya doğrulamada yapılacak herhangi bir değişiklik, bu fonksiyonun tamamının değiştirilmesini zorunlu kılar.

✅ Kurallara uygun:

function validateOrder(orderData) {
    if (!orderData.items?.length) throw new Error('Items required');
    if (!orderData.customer?.email) throw new Error('Email required');
}

function calculateTotal(items) {
    const subtotal = items.reduce((sum, item) => 
        sum + (item.price * item.quantity), 0);
    return subtotal + (subtotal * 0.08) + (subtotal > 50 ? 0 : 9.99);
}

async function createOrder(customerId, total) {
    return await db.orders.create({ customerId, total });
}

async function processOrder(orderData) {
    validateOrder(orderData);
    const total = calculateTotal(orderData.items);
    const order = await createOrder(orderData.customer.id, total);
    
    // Non-critical operations in background
    emailService.send(orderData.customer.email, `Order #${order.id}`).catch(console.error);
    
    return order;
}

Neden önemli: Her fonksiyonun tek ve net bir sorumluluğu vardır. validateOrder() ve calculateTotal() mock'lara ihtiyaç duymadan bağımsız olarak test edilebilir. createOrder() veritabanı mantığını izole eder. E-posta ve envanter işlemlerini sipariş oluşturmayı engellemez ve olası hatalar ayrı ayrı ele alınır.

Sonuç

API'leri eklemeli değişikliklerle geliştirin: yeni alanlar, yeni uç noktalar (endpoints) ve isteğe bağlı parametreler ekleyin. Kırıcı değişiklikler kaçınılmaz olduğunda, eski ve yeni sürümleri aynı anda çalıştırmak için API sürümlendirmesini kullanın. Kaldırmadan önce eski alanları net zaman çizelgeleri ve geçiş kılavuzlarıyla kullanımdan kaldırın (deprecate edin).

Sık Sorulan Sorular

Sorularınız mı var?

Uzun fonksiyonları nasıl parçalara ayırabilirim?

Fonksiyon içindeki farklı sorumlulukları belirleyin. Doğrulama işlemlerini ayrı fonksiyonlara çıkarın. Hesaplamaları saf fonksiyonlara (pure functions) dönüştürün. G/Ç işlemlerini (veritabanı, API çağrıları) kendi fonksiyonlarına taşıyın. Ayıklanan her fonksiyon, açıklayıcı bir isme sahip net ve tek bir amaç gütmelidir.

Küçük fonksiyonlar ek yük (overhead) yaratıp performansı olumsuz etkilemez mi?

Modern derleyiciler ve yorumlayıcılar küçük fonksiyonları satır içi (inline) hale getirerek çağrı yükünü ortadan kaldırır. Sürdürülebilirlik sağladığı faydalarla karşılaştırıldığında performans etkisi göz ardı edilebilir düzeydedir. Optimizasyon yapmadan önce profil çıkarın. Gerçek performans darboğazlarını (bottleneck) tespit ettiğinizde, okunabilir kodun optimize edilmesi çok daha kolaydır.

Çok sayıda ardışık adım içeren fonksiyonlar ne olacak?

Ardışık adımlar, daha küçük fonksiyonlara bölünebilecek bir iş akışına işaret eder. Her adım için yardımcı (helper) fonksiyonlar oluşturun ve bunları bir koordinatör fonksiyon içerisinden sırayla çağırın. Bu yaklaşım iş akışını okunabilir kılarken her adımın bağımsız olarak test edilmesini sağlar.

Ayıklama işlemi sonrasında çok sayıda parametre gerektiren fonksiyonlarla nasıl başa çıkmalıyım?

Uzun parametre listeleri kullanmak yerine, birbiriyle ilişkili parametreleri içeren nesneler (objects) aktarın. Alternatif olarak, ayıklanan fonksiyonların paylaşılan durumu tutan bir sınıfın (class) metotları olup olamayacağını değerlendirin. Bir fonksiyon 6 veya daha fazla parametreye ihtiyaç duyuyorsa, bu durum zayıf soyutlamaya (abstraction) veya eksik veri yapılarına işaret ediyor olabilir.

Yalnızca bir kez çağrılsalar bile fonksiyonları ayıklamalı mıyım?

Evet, eğer bu ayırma işlemi okunabilirliği artırıyorsa. İyi isimlendirilmiş bir fonksiyon, bir kod bloğunun ne yaptığı açıklamalardan çok daha iyi ifade eder. Karmaşık mantığı netleştirdiğinde veya ana fonksiyondaki iç içe geçme (nesting) seviyelerini azalttığında, tek seferlik fonksiyon ayıklama işlemi oldukça değerlidir.

Şimdi güvenliğinizi sağlayın

Kodunuzu, bulutunuzu ve çalışma zamanınızı tek bir merkezi sistemde güvenceye alın.
Güvenlik açıklarını otomatik olarak hızla bulun ve düzeltin.

Kredi kartı gerekmez | Tarama sonuçları 32 saniyede.