Aikido

Kod tekrarlamasını ortadan kaldırma: teknik borcun azaltılması

Mantık hatası

Kural
Ortadan kaldır bariz dosya içi yinelemeleri ortadan kaldırın.
Yinelenen kod bloklar artırır bakım
yükünü ve bu risk tutarsızlık tutarsız güncelleme
Desteklenen diller: 45+

Giriş

Tek bir dosya içinde kopyalanıp yapıştırılan kod, zamanla daha da ağırlaşan bakım kabuslarına yol açar. Aynı mantık birden fazla yerde göründüğünde, hata düzeltmeleri ve özellik güncellemeleri her bir örneğe ayrı ayrı uygulanmalıdır. Geliştiriciler kaçınılmaz olarak yinelenen kodlardan birini gözden kaçırır; bu da, hangi kod yolunun yürütüldüğüne bağlı olarak aynı işlemin farklı sonuçlar vermesine yol açan tutarsız davranışlara neden olur. Yinelenen mantık ilk bakışta aynı göründüğü ve farklılıklar ancak dikkatli bir karşılaştırma sonrasında ortaya çıktığı için, bu tutarsızlığın hata ayıklaması zordur.

Neden önemli?

Hata yayılması: Yinelenen kodda bir hata bulunduğunda, bu hatayı tek bir yerde düzeltmek, her yerde düzeltilmesini sağlamaz. Geliştiriciler, başka yerlerde de kopyalarının olduğunu fark etmeden ilk örneği düzeltir ve bu da hatanın farklı koşullarda devam etmesine neden olur.

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

Kod örnekleri

❌ Uygun değil:

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ı iki kez yazılmış. Vergi oranı değişirse veya doğrulama sürecinde iyileştirme gerekirse, her iki yöntem de güncellenmelidir. Bir geliştirici, vergi hesaplamasını bir yöntemde güncelleyebilir ancak diğerini unutabilir; bu da fiyatlandırmada tutarsızlığa yol açar.

✅ Uygunluk:

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

Bunun önemi: Doğrulama, hesaplama ve vergi mantığı tek bir yöntemde merkezileştirilmiştir. Vergi oranını değiştirmek, dosyada yinelenen kısımları tek tek aramak yerine tek bir yöntemi değiştirmek anlamına gelir. Her yardımcı yöntem bağımsız olarak test edilebilir ve her iki sipariş türü de yapılan iyileştirmeleri veya hata düzeltmelerini otomatik olarak devralır.

Sonuç

Aynı dosya içindeki tekrarlanan kodlar genellikle düzeltmesi en kolay olanlardır ve anında fayda sağlar. Bu kalıbı fark eder etmez, tekrarlanan mantığı yardımcı işlevlere veya yöntemlere ayırın. “Üç kuralı”, bir kod üç kez tekrarlandığında yeniden düzenleme zamanının geldiğini belirtir. Tekrarlanan kodun dosyanın tamamına yayılmasını beklemeyin, sorunu hemen çözün.

Sık Sorulan Sorular

Sorularınız mı var?

Yeniden yapılandırma öncesinde ne kadar tekrarlama kabul edilebilir?

“Üç kuralı” iyi bir kılavuzdur: Benzer bir kod üç kez tekrarlandığında, onu ayrı bir şubeye ayırın. Ancak sağduyulu davranın. İki adet karmaşık, tekrarlanan blok hemen ayrı bir şubeye ayrılmayı gerektirebilirken, üç adet basit değişken bildirimi için bu gerekmeyebilir. Değişiklik olasılığını ve tutarsızlığın maliyetini göz önünde bulundurun. Güvenlik açısından kritik mantık veya karmaşık iş kuralları derhal ayrı bir şubeye ayrılmalıdır.

Ya kopyalanan kodda küçük farklılıklar varsa?

Farklılıkları parametreleştirin. İki kod bloğu yalnızca değişken değerleri açısından farklılık gösteriyorsa, bunları ortak bir fonksiyona parametre olarak aktarın. Mantık akışı biraz farklıysa, strateji kalıbını veya mantıklı varsayılan değerlere sahip isteğe bağlı parametreleri kullanın. Bazen, niyeti belirsizleştiren karmaşık bir soyutlamadan ziyade, belirgin farklılıklar içeren tekrarlama daha iyidir; bu nedenle DRY ilkeleri ile okunabilirlik arasında bir denge kurun.

Kod daha uzun olsa bile yinelenen kısımları ayırmalı mıyım?

Genellikle evet. Açıklayıcı bir isme sahip bir işlev, toplam satır sayısı artsa bile, satır içi tekrarlanan koddan daha iyi bir şekilde amacını ortaya koyar. Tek noktadan bakımın sağladığı faydalar, kodun kısalığı konusundaki endişelerden daha ağır basar. Ancak, işlevin ayrıştırılması sonucunda kodun okunması için birden fazla işlev çağrısı arasında geçiş yapmak zorunda kalınacak kadar aşırı dolaylılık ortaya çıkarsa, bu soyutlamanın uygun olup olmadığını yeniden değerlendirin.

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

Tekrarlanan if koşulları, aynı döngüler veya benzer işlev yapıları gibi kopyala-yapıştır kalıplarını arayın. Birçok IDE, yapısal tekrarlara vurgu yapar. Kod incelemesi sırasında bir dosyayı okurken tanıdık bir kod görürseniz, bunu arayın. Dosya içi tekrarlar için manuel inceleme genellikle en hızlı yöntemdir. Yeniden düzenleme yaparken, dosyada birbirine yakın yerlerde görünen en bariz tekrarlarla başlayın.

Peki ya yinelenen hata işleme kodları ne olacak?

Hata işlemeyi yeniden kullanılabilir işlevlere ayırın veya dekoratörler/ara yazılım kalıplarını kullanın. Birden fazla işlev, aynı hata günlüğü kaydı ve dönüştürme işlemlerine sahip aynı try-catch yapısını paylaşıyorsa, bu ortadan kaldırılması gereken bir tekrarlamadır. İşlemleri tutarlı günlüğü kaydı, yeniden deneme veya yedekleme davranışlarıyla saran hata işleme yardımcı programları oluşturun; ardından hata işleme mantığını tekrarlamak yerine bu yardımcı programları kullanın.

Aktif olarak üzerinde değişiklik yapmadığım eski koddaki tekrarlanan kısımları yeniden düzenlemeye değer mi?`

"İzci kuralını" uygulayın: Kodu bulduğunuzdan daha temiz bir şekilde bırakın, ancak el sürmediğiniz kodu yeniden yapılandırmayın. Bir işlevi değiştirirken aynı dosya içinde tekrarlama fark ederseniz, bunu yaptığınız değişikliğin bir parçası olarak düzeltin. Teknik borç, yeni özelliklerin önünü tıkamadıkça, eski kodlar için büyük ölçekli yeniden yapılandırma çekim talepleri (PR’ler) oluşturmayın. Normal geliştirme sürecinde kademeli iyileştirmeler yapmak daha sürdürülebilirdir.

En başından itibaren yinelenmeyi nasıl önleyebilirim?

Kodu kopyalayıp yapıştırmadan önce, bunun yerine bir fonksiyon oluşturmanız gerekip gerekmediğini düşünün. Kod incelemesi sırasında, tekrarlanan kalıpları işaretleyin ve bunların fonksiyon haline getirilmesini talep edin. İki defadan fazla tekrarlanan işlemler için yardımcı fonksiyonların kullanılmasını zorunlu kılmak gibi, tekrarlamayı önleyen ekip kuralları belirleyin. Özellikle tekrarlamaları tespit etmeye yönelik kod inceleme kontrol listelerini 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.