Aikido

Kod tekrarı nasıl ortadan kaldırılır: teknik borcu azaltma

Mantık hatası

Kural
Dosya içindeki bariz tekrarı
ortadan kaldırın. Tekrarlanan kod blokları
bakım yükünü ve tutarsız güncellemeler riskini artırır.
Desteklenen diller: 45+

Giriş

Tek bir dosya içinde kopyala-yapıştır yapılmış kod, zamanla biriken bakım kabuslarına yol açar. Aynı mantık birden fazla yerde yer aldığında, hata düzeltmeleri ve özellik güncellemelerinin her bir noktaya uygulanması gerekir. Geliştiriciler kaçınılmaz olarak bu kopyalardan birini gözden kaçırır ve aynı işlemin hangi kod yolunun çalıştığına bağlı olarak farklı sonuçlar ürettiği tutarsız davranışlara neden olur. Bu tutarsızlığın hata ayıklaması zordur, çünkü tekrarlanan mantık ilk bakışta aynı görünür ve farklılıklar ancak dikkatli bir karşılaştırma sonucunda ortaya çıkar.

Neden önemli?

Hata yayılımı: Tekrarlanan kodda bir hata bulunduğunda, bunu tek bir yerde düzeltmek her yerde düzeltildiği anlamına gelmez. Geliştiriciler, kopyaların başka yerlerde de olduğunu fark etmeden yalnızca ilkini düzeltir ve hatanın farklı koşullar altında aktif kalmasına neden olur.

Bakım yükü: Her tekrarlanan blok, bakım maliyetini iki katına çıkarır. Mantığı değiştirmek, her bir kopyanın bulunmasını ve güncellenmesini gerektirir; dosyalar büyüdükçe kopyaları takip etmek daha da zorlaşır.

Kod örnekleri

❌ Kural dışı:

class OrderProcessor {
    async processStandardOrder(order) {
        if (!order.items || order.items.length === 0) {
            throw new Error('Order must have items');
        }
        const total = order.items.reduce((sum, item) => 
            sum + (item.price * item.quantity), 0);
        const tax = total * 0.08;
        const finalAmount = total + tax;
        return { total: finalAmount, tax };
    }
    
    async processExpressOrder(order) {
        if (!order.items || order.items.length === 0) {
            throw new Error('Order must have items');
        }
        const total = order.items.reduce((sum, item) => 
            sum + (item.price * item.quantity), 0);
        const tax = total * 0.08;
        const expressfee = 15.99;
        const finalAmount = total + tax + expressFee;
        return { total: finalAmount, tax, expressFee };
    }
}

Neden yanlış: Doğrulama mantığı ve toplam hesaplaması tekrarlanmıştır. Vergi oranı değişirse veya doğrulamanın geliştirilmesi gerekirse, her iki yöntemin de güncellenmesi gerekir. Bir geliştirici vergi hesaplamasını bir yöntem içinde güncelleyip diğerini unutabilir ve bu da tutarsız fiyatlandırmaya yol açabilir.

✅ Kurallara uygun:

class OrderProcessor {
    validateOrder(order) {
        if (!order.items || order.items.length === 0) {
            throw new Error('Order must have items');
        }
    }
    
    calculateSubtotal(items) {
        return items.reduce((sum, item) => 
            sum + (item.price * item.quantity), 0);
    }
    
    calculateTax(amount) {
        return amount * 0.08;
    }
    
    async processStandardOrder(order) {
        this.validateOrder(order);
        const subtotal = this.calculateSubtotal(order.items);
        const tax = this.calculateTax(subtotal);
        return { total: subtotal + tax, tax };
    }
    
    async processExpressOrder(order) {
        this.validateOrder(order);
        const subtotal = this.calculateSubtotal(order.items);
        const tax = this.calculateTax(subtotal);
        const expressFee = 15.99;
        return { total: subtotal + tax + expressFee, tax, expressFee };
    }
}

Neden önemli: Doğrulama, hesaplama ve vergi mantığı tek birer yöntemde merkezi olarak toplanmıştır. Vergi oranını değiştirmek, dosya içindeki kopyaları aramak yerine tek bir yöntemi değiştirmek anlamına gelir. Her yardımcı (helper) yöntem bağımsız olarak test edilebilir ve her iki sipariş türü de herhangi bir iyileştirmeyi veya hata düzeltmesini otomatik olarak devralır.

Sonuç

Dosya içi tekrar genellikle düzeltilmesi en kolay olanıdır ve anında fayda sağlar. Deseni fark eder etmez tekrarlanan mantığı yardımcı fonksiyonlara veya metotlara ayırın. Üçleme kuralı (rule of three), bir kod üç kez göründüğünde yeniden yapılandırma (refactor) zamanının geldiğini gösterir. Tekrarın tüm dosyaya yayılmasını beklemeyin.

Sık Sorulan Sorular

Sorularınız mı var?

Yeniden yapılandırmadan önce ne kadar tekrar kabul edilebilir?

Üçleme kuralı iyi bir kılavuzdur: benzer kod üç kez göründüğünde onu dışarı çıkarın. Ancak mantığınızı kullanın. Karmaşık iki tekrarlanan blok acil çıkarma gerektirebilirken, basit üç değişken tanımlaması gerektirmeyebilir. Değişiklik olasılığını ve tutarsızlık maliyetini göz önünde bulundurun. Güvenlik açısından kritik mantık veya karmaşık iş kuralları hemen tekilleştirilmelidir.

Tekrarlanan kodun küçük farklılıkları varsa ne olur?

Farklılıkları parametreleştirin. İki kod bloğu yalnızca değişken değerlerinde farklılık gösteriyorsa, bunları paylaşılan bir fonksiyona parametre olarak geçirin. Mantık akışı biraz farklıysa, strategy deseni veya mantıklı varsayılanlara sahip isteğe bağlı parametreler kullanın. Bazen net farklılıkları olan bir tekrar, niyeti gizleyen karmaşık bir soyutlamadan daha iyidir; bu nedenle DRY ilkelerini okunabilirlikle dengeleyin.

Kodu daha uzun hale getirse bile tekrarı ayıklamam gerekir mi?

Genellikle evet. Toplam satır sayısı artsa bile, açıklayıcı bir ada sahip bir fonksiyon, satır içi tekrarlanan koddan genellikle niyeti daha net açıklar. Tek noktadan bakımın faydaları, kısalık endişelerinden daha ağır basar. Bununla birlikte, çıkarma işlemi, kodun okunmasının birden fazla fonksiyon çağrısından geçmeyi gerektirdiği aşırı dolaylılığa yol açarsa, soyutlamanın uygun olup olmadığını yeniden değerlendirin.

Büyük dosyalardaki yinelenen kodları nasıl tespit edebilirim?

Tekrarlanan if koşulları, benzer döngüler veya benzer fonksiyon yapıları gibi kopyala-yapıştır kalıplarını arayın. Birçok IDE, yapısal yinelemeleri vurgular. Kod incelemesi sırasında, bir dosyayı okurken aşina olduğunuz bir kod görürseniz arama yapın. Dosya içi yinelemeler için manuel inceleme genellikle en hızlı yöntemdir. Yeniden yapılandırma (refactoring) yaparken, dosyada birbirine yakın görünen en bariz kopyalarla başlayın.

Yinelenen hata yönetimi (error handling) kodları hakkında ne yapılmalı?

Hata yönetimini yeniden kullanılabilir fonksiyonlara ayırın veya decorator/middleware kalıplarını kullanın. Birden fazla fonksiyon, aynı hata günlüğü (logging) ve dönüştürme mantığına sahip aynı try-catch yapısını paylaşıyorsa, bu ortadan kaldırılması gereken bir yinelemedir. İşlemleri tutarlı günlük kaydı, yeniden deneme (retry) veya yedek davranışlarla sarmalayan hata yönetimi araçları oluşturun, ardından hata yönetimi mantığını tekrarlamak yerine bu araçları kullanın.

Aktif olarak değiştirmediğim eski (legacy) kodlardaki yinelemeleri yeniden yapılandırmaya değer mi?

İzcilik kuralını uygulayın: Kodu bulduğunuzdan daha temiz bırakın, ancak üzerinde çalışmadığınız kodu yeniden yapılandırmayın. Bir fonksiyonu değiştiriyor ve aynı dosyada yineleme fark ederseniz, bunu yaptığınız değişikliğin bir parçası olarak düzeltin. Teknik borç yeni özelliklerin önüne geçmediği sürece eski kodlar için büyük yeniden yapılandırma PR'ları oluşturmayın. Normal geliştirme sırasında kademeli iyileştirme yapmak daha sürdürülebilirdir.

Yinelemeyi baştan nasıl önleyebilirim?

Kodu kopyala-yapıştır yapmadan önce, bunun yerine bir fonksiyon çıkarıp çıkarmamanız gerektiğini düşünün. Kod incelemesi sırasında yinelenen kalıpları işaretleyin ve çıkarılmasını talep edin. İkiden fazla tekrarlanan işlemler için yardımcı fonksiyonlar (helper function) gerektirmek gibi yinelemeyi caydıran ekip kuralları belirleyin. Özellikle yinelemeleri arayan kod inceleme kontrol listeleri kullanın. Önlemek, düzeltmekten daha kolaydı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.