Dalam bahasa OO (mis. Tetapi tidak terbatas pada Java) bagaimana Anda memperbaiki kode duplikat tergantung pada cakupan kemunculannya? Saya akan mulai dengan (misalnya)
- di kelas yang sama (ruang lingkup) melakukan Refactoring Metode Ekstrak (memperbaiki)
- di kelas-kelas dengan hierarki yang sama (cakupan) melakukan Extract Method dan Pull Up (fix)
- ...
object-oriented
dry
Peter Kofler
sumber
sumber
Jawaban:
Baru-baru ini saya menemukan jawaban yang bagus untuk pertanyaan saya di "Kode Bersih" Paman Bob, yang ingin saya bagikan. Dia membedakan tiga jenis duplikasi
Potongan-potongan kode identik harus diganti dengan metode tunggal. Jadi perbaikannya adalah mengekstraksi metode dan mendelegasikan ke perilaku umum.
SthUtil
atauSthLib
).kasus
switch/case
danif/else
itu selalu menguji untuk set kondisi yang sama .Modul yang menerapkan algoritma serupa . Ini paling sulit ditemukan, karena tidak ada detektor klon yang dapat menemukannya.
Juga poin yang valid disebutkan oleh Oded, ketika berhadapan dengan berbagai versi perpustakaan
Pada akhirnya satu kalimat terbaik untuk menjawab pertanyaan saya adalah dengan rangsangan:
sumber
Secara umum - mengkonsolidasikan kode duplikat ke satu tempat dan memastikan situs duplikasi asli memanggil tempat konsolidasi.
Dalam contoh Anda, dalam kelas ini akan menjadi metode yang diekstraksi dan dalam satu set kelas metode yang ditarik dalam kelas dasar.
Dalam kode salin-tempel, ini akan menghapus duplikat dan memastikan bahwa setiap pengguna sekarang menggunakan salinan tunggal (dalam tingkat apa pun ini).
Saat berhadapan dengan berbagai versi perpustakaan, berkonsolidasi pada satu versi (jika memungkinkan).
sumber
Saya kira ini adalah pertanyaan yang berakhir terbuka tetapi juga tergantung pada keadaan kode juga. Maksud saya Anda bisa mentolerir kode duplikat sedikit tergantung pada konteksnya. Aturan tiga baik untuk hal ini.
Rule Of Three Pertama kali Anda melakukan sesuatu, Anda hanya melakukannya. Kali kedua Anda melakukan hal yang serupa, Anda mengernyit pada duplikasi itu, tetapi Anda tetap melakukan duplikat itu. Ketiga kalinya Anda melakukan hal serupa, Anda refactor.
Meskipun ini cukup banyak diperdebatkan, posting ini juga mempertimbangkan kasus di mana Anda akan mentolerir kode duplikat.
sumber