Duplikasi kode

Duplikasi kode adalah situasi di mana terdapat potongan kode sumber yang muncul lebih dari sekali, baik dalam satu program maupun di antara program-program yang dimiliki atau dikelola oleh entitas yang sama. Duplikasi kode biasanya dianggap tidak diinginkan karena berbagai alasan. Umumnya, terdapat syarat minimum terhadap jumlah kode yang harus muncul dalam sebuah urutan agar dianggap sebagai duplikasi, bukan sekadar kemiripan yang kebetulan. Urutan kode yang sama ini sering disebut sebagai code clones atau hanya clones, dan proses otomatis untuk menemukan duplikasi dalam kode sumber disebut clone detection.

Dua potongan kode dapat dianggap sebagai duplikasi meskipun tidak identik secara karakter per karakter. Misalnya, kode tersebut mungkin identik hanya setelah penghapusan karakter spasi dan komentar, atau identik secara token-per-token dengan sedikit variasi. Bahkan, kode yang hanya identik secara fungsional juga dapat dianggap sebagai duplikasi.

 Penyebab kemunculan 
Duplikasi kode dapat terjadi karena beberapa alasan, antara lain:

 Pemrograman copy-and -paste dimana pemrogram menyalin dan menempelkan kode, sering kali untuk menghemat waktu atau karena alasan lain, seperti kurangnya pemahaman tentang bahasa pemrograman. Dalam pengaturan akademis, hal ini bahkan dapat dikaitkan dengan plagiarisme.
 Scrounging, yaitu dimana sebuah bagian kode disalin karena sudah terbukti berfungsi. Biasanya, kode yang disalin mengalami modifikasi kecil seperti penggantian nama variabel atau penambahan/penghapusan baris kode.
 Kesalahan independen dimana ketika pengembang secara independen menulis kode untuk fitur yang serupa, kode yang dihasilkan sering kali mirip tetapi tidak identik secara sintaksis.
 Kode yang dihasilkan secara otomatis. Dalam beberapa kasus, duplikasi kode merupakan hasil dari alat otomatis yang menghasilkan kode untuk meningkatkan kecepatan atau kemudahan pengembangan.

 Cara memperbaiki 
Cara paling umum untuk mengatasi duplikasi kode adalah dengan memindahkan kode ke dalam satu unit tersendiri, seperti fungsi atau modul, dan memanggil unit tersebut dari berbagai tempat yang sebelumnya menggunakan kode yang sama. Pendekatan ini juga dapat didukung dengan penggunaan komponen open-source yang ditempatkan di lokasi terpusat.

 Biaya dan manfaat 
Kerugian Duplikasi Kode:

 Kesulitan Pemeliharaan: Kode yang lebih panjang lebih sulit untuk dikelola. Jika terjadi pembaruan pada salah satu salinan kode, kemungkinan salinan lain tidak diperbarui.
 Rentan terhadap Kerusakan: Jika satu salinan kode digunakan untuk tujuan berbeda dan diperbarui, pembaruan tersebut mungkin tidak relevan atau bahkan merusak fungsi lainnya.

Keuntungan Duplikasi Kode:

 Dalam beberapa kasus, duplikasi dapat menjadi solusi terbaik jika bahasa pemrograman yang digunakan memiliki keterbatasan atau abstraksi yang terlalu kompleks.

Pertimbangan Lain:

 Duplikasi kode secara otomatis, seperti yang dihasilkan oleh generator kode, tidak relevan dengan isu-isu ini jika hanya ada satu salinan dalam kode sumber.
 Kerentanan perangkat lunak yang terdapat dalam kode duplikat mungkin terus ada jika pengembang tidak menyadari salinan tersebut.

Refaktorisasi kode duplikat dapat meningkatkan sejumlah metrik perangkat lunak, seperti mengurangi jumlah baris kode, kompleksitas siklomatik, dan coupling. Namun, risiko kerusakan akibat refaktorisasi harus diperhitungkan.

 Deteksi duplikasi kode 
Beberapa algoritma telah dikembangkan untuk mendeteksi duplikasi kode, di antaranya:

 Algoritma Baker
 Pencarian string Rabin–Karp
 Penggunaan abstract syntax trees
 Deteksi klon visual
 Deteksi klon matriks hitung
 Locality-sensitive hashing
 Anti-unification

 Contoh Kode Duplikat 
Berikut adalah contoh kode duplikat untuk menghitung rata-rata elemen dalam sebuah array: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;Kode tersebut dapat disederhanakan menjadi satu fungsi:int calc_average_of_four(int* array) {
    int sum = 0;
    for (int i = 0; i < 4; i++)
        sum += array[i];
    return sum / 4;
}Penggunaan fungsi ini menghasilkan kode sumber yang lebih bersih dan bebas dari duplikasi:extern int array1[];
extern int array2[];

int average1 = calc_average_of_four(array1);
int average2 = calc_average_of_four(array2);Duplikasi kode merupakan masalah umum dalam pengembangan perangkat lunak yang dapat berdampak pada pemeliharaan, efisiensi, dan keandalan perangkat lunak. Meskipun sering kali dihindari, duplikasi dapat menjadi solusi terbaik dalam kondisi tertentu. Oleh karena itu, pemahaman mendalam tentang konteks dan alat bantu deteksi duplikasi menjadi penting dalam pengelolaan kode sumber.

 Lihat pula 

 Deduplikasi data
 Redundansi data
 Don't repeat yourself (DRY)
 Rule of three (computer programming)

 Referensi 

Kategori:Kode sumber
Kategori:Metrik perangkat lunak