Yinelenen kod - Duplicate code

Yinelenen kod , bir program içinde veya aynı varlığın sahip olduğu veya bakımı yapılan farklı programlar arasında birden fazla kez meydana gelen bir dizi kaynak kodu için kullanılan bir bilgisayar programlama terimidir . Yinelenen kod, birkaç nedenden ötürü genellikle istenmeyen olarak kabul edilir . Tesadüfen benzer olmaktan ziyade yinelenmiş olarak kabul edilmesi için bir sırada görünmesi gereken kod miktarına genellikle minimum bir gereksinim uygulanır. Yinelenen kod dizileri bazen kod klonları veya yalnızca klonlar olarak bilinir, kaynak kodda yinelemeleri bulmanın otomatik sürecine klon algılama denir.

İki kod dizisi, örneğin karakter için karakter özdeş olmadan birbirinin kopyası olabilir, örneğin yalnızca beyaz boşluk karakterleri ve yorumlar göz ardı edildiğinde karakter için özdeş olarak veya simge için simge özdeş veya simge olarak -for-token ara sıra değişiklik ile özdeş. Yalnızca işlevsel olarak özdeş olan kod dizileri bile yinelenen kod olarak kabul edilebilir.

Ortaya çıkış

Yinelenen kodun yaratılabileceği yollardan bazıları şunlardır:

  • scrounging, burada kodun bir bölümünün "çalıştığı için" kopyalandığı. Çoğu durumda bu işlem, klonlanan kodda, değişkenleri yeniden adlandırma veya kod ekleme / silme gibi küçük değişiklikleri içerir. Dil, neredeyse her zaman bir kişinin kodun bir kopyasını farklı yerlerden çağırmasına izin verir, böylece birden çok amaca hizmet edebilir, ancak bunun yerine programcı başka bir kopya oluşturur, belki de

Ayrıca, bir programın başka bir bölümündekine çok benzer bir işlevsellik gerekli olabilir ve bir geliştirici, başka bir yerde var olana çok benzeyen kodu bağımsız olarak yazar. Araştırmalar, bu tür bağımsız olarak yeniden yazılan kodun tipik olarak sözdizimsel olarak benzer olmadığını göstermektedir.

Hız veya geliştirme kolaylığını artırmak için yinelenen koda sahip olmanın istenebileceği otomatik olarak oluşturulan kod, çoğaltmanın başka bir nedenidir. Gerçek oluşturucunun kaynak kodunda kopyalar içermeyeceğini, yalnızca ürettiği çıktıyı içereceğini unutmayın.

Sabitleme

Yinelenen kod, genellikle kodu kendi birimine (işlev veya modül) taşıyarak ve bu birimi orijinal olarak kullanıldığı tüm yerlerden çağırarak sabitlenir. Bileşenlerin merkezi konumlarda olduğu daha açık kaynaklı bir geliştirme stili kullanmak da çoğaltmaya yardımcı olabilir.

Maliyetler ve faydalar

Yinelenen işlevselliği içeren kodun desteklenmesi daha zordur,

  • sadece daha uzun olduğu için ve
  • çünkü güncellenmesi gerekiyorsa, kodun bir kopyasının aynı kodun diğer örneklerinin varlığını daha fazla kontrol etmeden güncellenme tehlikesi vardır.

Öte yandan, kodun bir kopyası farklı amaçlar için kullanılıyorsa ve uygun şekilde belgelenmemişse, bir amaç için güncellenme tehlikesi vardır, ancak bu güncelleme gerekli olmayacak veya diğerine uygun olmayacaktır. amaçlar.

Kaynak kodda işlevselliğin yalnızca bir kopyası varsa, bu hususlar otomatik olarak oluşturulan kod için geçerli değildir.

Geçmişte, bellek alanı daha sınırlı olduğunda, yinelenen kod daha fazla yer kaplamak gibi ek bir dezavantaja sahipti, ancak günümüzde bu bir sorun olma olasılığı düşüktür.

Yazılım güvenlik açığı içeren kod kopyalandığında, geliştirici bu tür kopyalardan haberdar değilse, güvenlik açığı kopyalanan kodda var olmaya devam edebilir. Üstlenmeden yinelenen kod gibi birçok yazılım ölçümleri, artırabilir kod satırları , cyclomatic karmaşıklık ve bağlantı . Bu, daha kısa derleme sürelerine, daha düşük bilişsel yüke , daha az insan hatasına ve daha az unutulan veya gözden kaçan kod parçalarına yol açabilir . Ancak, tüm kod çoğaltmaları yeniden düzenlenemez. Programlama dili yetersiz veya aşırı karmaşık soyutlamalar sağlıyorsa, özellikle eşzamanlı düzenleme gibi kullanıcı arayüzü teknikleriyle destekleniyorsa klonlar en etkili çözüm olabilir . Ayrıca, yeniden düzenleme sırasında kodu kırma riskleri, herhangi bir bakım avantajından daha ağır basabilir. Wagner, Abdulkhaleq ve Kaya tarafından yapılan bir araştırma, yinelenenleri eşzamanlı tutmak için ek çalışma yapılması gerektiği sonucuna varmıştır, ancak ilgili programcılar yinelenen kodun farkındaysa, yinelenmemiş kodda olduğundan çok daha fazla hatanın neden olmadığı sonucuna varmıştır.

Yinelenen kodu algılama

Yinelenen kodu tespit etmek için bir dizi farklı algoritma önerilmiştir. Örneğin:

İşlevsel olarak yinelenen kod örneği

Aşağıdaki düşünün kod parçacığını hesaplamak için ortalama bir bölgesinin dizisi arasında bir tamsayı

extern int array_a[];
extern int array_b[];
 
int sum_a = 0;

for (int i = 0; i < 4; i++)
   sum_a += array_a[i];

int average_a = sum_a / 4;
 
int sum_b = 0;

for (int i = 0; i < 4; i++)
   sum_b += array_b[i];

int average_b = sum_b / 4;

İki döngü, tek işlev olarak yeniden yazılabilir:

int calc_average_of_four(int* array) {
   int sum = 0;
   for (int i = 0; i < 4; i++)
       sum += array[i];

   return sum / 4;
}

veya genellikle tercihen dizideki elemanların sayısını parametrelendirerek.

Yukarıdaki işlevi kullanmak döngü çoğaltması olmayan kaynak kodu verecektir:

extern int array1[];
extern int array2[];

int average1 = calc_average_of_four(array1);
int average2 = calc_average_of_four(array2);

Bu önemsiz durumda, derleyicinin her iki çağrıyı da işleve satır içi yapmayı seçebileceğine dikkat edin, böylece elde edilen makine kodu yukarıdaki hem yinelenen hem de yinelenmeyen örnekler için aynı olur. İşlev satır içi değilse , işlev çağrılarının ek yükünün çalıştırılması muhtemelen daha uzun sürecektir (çoğu yüksek performanslı dil için 10 işlemci yönergesi sırasıyla). Teorik olarak, koşmak için bu ek süre önemli olabilir.

Yöntemle değiştirilen kod aracılığıyla yinelenen kod düzeltme örneği

Ayrıca bakınız

Referanslar

Dış bağlantılar