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

