Aikido

Fonksiyonları nasıl kısa ve öz tutabiliriz: bakım kolaylığı sağlayan kod yazma

Okunabilirlik

Kural

Şunu işlevleri kısa tutun.
Uzun işlevler zor zor anlaşması anlaşması, ve ve bakımı zor.

Desteklenen diller: 45+

Giriş

Yüzlerce satırdan oluşan işlevler, birden fazla sorumluluğu bir araya getirir; bu da her satırı okumadan işlevin ne yaptığını anlamayı zorlaştırır. Uzun işlevler genellikle doğrulama, iş mantığı, veri dönüştürme ve hata işleme gibi birden fazla konuyu tek bir yerde ele alır. Bu durum, tek sorumluluk ilkesini ihlal eder ve mevcut davranışı bozmadan test edilmesi, hata ayıklanması ve değiştirilmesi zor bir kod ortaya çıkarır.

Neden önemli?

Kodun bakım kolaylığı: Uzun fonksiyonlar, geliştiricilerin davranışı anlayabilmeleri için kafalarında daha fazla bağlam bilgisi tutmalarını gerektirir. Tüm mantık birbiriyle iç içe olduğu için bir kısmı değiştirmek, başka bir kısmın bozulmasına yol açma riski taşır. İstenmeyen yan etkilerin öngörülmesi zor olduğundan, hata düzeltmeleri riskli hale gelir.

Test karmaşıklığı: 200 satırlık bir fonksiyonu test etmek, tek bir testte tüm olası kod yollarını kapsamayı gerektirir; bu da karmaşık bir kurulum ve çok sayıda test senaryosu gerektirir. Daha küçük fonksiyonlar ise odaklanmış birim testleriyle bağımsız olarak test edilebilir; bu da test takımlarını daha hızlı ve daha güvenilir hale getirir.

Kod örnekleri

❌ Uygun değil:

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 işlev, doğrulama, hesaplama, veritabanı işlemleri, e-posta ve envanter işlemlerini yürütür. Testler için tüm bağımlılıkların simülasyonu yapılması gerekir. Vergi mantığında veya doğrulama işlemlerinde yapılacak herhangi bir değişiklik, bu işlevin tamamının değiştirilmesini gerektirir.

✅ Uygunluk:

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;
}

Bunun önemi: Her fonksiyonun tek ve net bir sorumluluğu vardır. validateOrder() ve calculateTotal() mock'lar kullanılmadan bağımsız olarak test edilebilir. createOrder() veritabanı mantığını ayrı tutar. E-posta ve stok işlemleri sipariş oluşturulmasını engellemez ve hatalar ayrı olarak ele alınır.

Sonuç

API’leri kademeli değişikliklerle geliştirin: yeni alanlar ekleyin, yeni uç noktalar ekleyin, isteğe bağlı parametreler ekleyin. Geriye dönük uyumsuzluklar kaçınılmaz olduğunda, API sürümlemeyi kullanarak eski ve yeni sürümleri eşzamanlı olarak çalıştırın. Eski alanları kaldırmadan önce, net zaman çizelgeleri ve geçiş kılavuzları ile bu alanları kullanımdan kaldırılacağını bildirin.

Sık Sorulan Sorular

Sorularınız mı var?

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

İşlev içindeki farklı sorumlulukları belirleyin. Doğrulama işlemlerini ayrı işlevlere ayırın. Hesaplamaları saf işlevlere aktarın. G/Ç işlemlerini (veritabanı, API çağrıları) kendi işlevlerine taşıyın. Ayrılan her işlevin açık, tek bir amacı olmalı ve açıklayıcı bir ada sahip olmalıdır.

Küçük işlevler ek yük oluşturup performansı düşürmez mi?

Modern derleyiciler ve yorumlayıcılar, küçük işlevleri satır içi olarak çalıştırarak çağrı yükünü ortadan kaldırır. Performans üzerindeki etkisi, bakım kolaylığı açısından sağlanan faydalara kıyasla önemsiz düzeydedir. Optimizasyon yapmadan önce profil analizi gerçekleştirin. Okunabilir kod, gerçek darboğazları tespit ettiğinizde daha sonra optimize edilmesi daha kolaydır.

Peki ya çok sayıda ardışık adımdan oluşan fonksiyonlar ne olacak?

Sıralı adımlar, daha küçük işlevlere bölünebilen bir iş akışını ortaya koyar. Her adım için yardımcı işlevler oluşturun ve bunları bir koordinatör işlevinden sırayla çağırın. Bu, iş akışını anlaşılır hale getirir ve her adımın bağımsız olarak test edilebilmesini sağlar.

Çıkarma işleminden sonra çok sayıda parametre gerektiren işlevleri nasıl ele almalıyım?

Uzun parametre listeleri yerine, ilgili parametreleri içeren nesneleri aktarın. Ya da ayrıştırılan işlevlerin, paylaşılan durumu barındıran bir sınıftaki yöntemler olup olmayacağını değerlendirin. Bir işlevin 6 veya daha fazla parametreye ihtiyacı varsa, bu durum yetersiz soyutlama veya eksik veri yapılarına işaret ediyor olabilir.

Fonksiyonlar sadece bir kez çağrılsa bile bunları ayrı bir dosyaya çıkarmalı mıyım?

Evet, ayırma işlemi okunabilirliği artırıyorsa. Doğru bir şekilde adlandırılmış bir ayrılmış işlev, bir kod bloğunun ne işe yaradığını yorumlardan daha iyi belgeler. Tek seferlik ayırma işlemi, karmaşık mantığı netleştirdiğinde veya üst işlevdeki iç içe geçme düzeylerini azalttığında faydalıdır.

Ş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.