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 c''opy-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 *s*ebuah 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 ''[[Sumber terbuka|open-source]]'' yang ditempatkan di lokasi terpusat.

== Biaya dan manfaat ==
**Kerugian Duplikasi Kode:**

* <u>Kesulitan Pemeliharaan</u>: Kode yang lebih panjang lebih sulit untuk dikelola. Jika terjadi pembaruan pada salah satu salinan kode, kemungkinan salinan lain tidak diperbarui.
* <u>Rentan terhadap Kerusakan</u>: 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:
```c
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:
```c
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:
```c
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