Bagaimana cara menghapus kode duplikat (secara umum)?

10

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)
  • ...
Peter Kofler
sumber
lihat contoh untuk menerapkan prinsip KERING (Jangan ulangi diri sendiri) dengan kelas yang sama di ini: geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance
Pertanyaan awal di SO ( stackoverflow.com/questions/7380946/… ) ditutup. Jadi saya memindahkannya ke sini.
Peter Kofler

Jawaban:

8

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.

  • dalam metode yang sama, lakukan Ekstrak Variabel Lokal dan gunakan kembali.
  • di kelas yang sama melakukan refactoring Metode Ekstrak.
  • di kelas dengan metode Ekstrak hierarki yang sama dan Tarik ke Atas. Hierarki dapat dibuat untuk menemukan tempat untuk metode.
  • di kelas hierarki terpisah gunakan delegasi ke objek baru.
  • Jika metode tidak memerlukan keadaan penutup, maka pola "lib" mungkin diterapkan (itu adalah wadah untuk metode statis, biasanya disebut SthUtilatau SthLib).

kasus switch/casedan if/elseitu selalu menguji untuk set kondisi yang sama .

  • Ini harus diganti dengan polimorfisme.

Modul yang menerapkan algoritma serupa . Ini paling sulit ditemukan, karena tidak ada detektor klon yang dapat menemukannya.

  • Karena ruang lingkupnya desain patters lebih besar digunakan. Pola desain Metode Templat dapat diterapkan untuk algoritma di dalam hierarki kelas.
  • Pola desain strategi dapat diterapkan untuk algoritma apa pun yang digunakan di tempat yang berbeda.

Juga poin yang valid disebutkan oleh Oded, ketika berhadapan dengan berbagai versi perpustakaan

  • berkonsolidasi pada satu versi. Pola desain fasad mungkin membantu di sini.

Pada akhirnya satu kalimat terbaik untuk menjawab pertanyaan saya adalah dengan rangsangan:

metode penggunaan kembali kode yang digunakan dalam bahasa OO adalah objek.

Peter Kofler
sumber
5

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).

Oded
sumber
Bukankah itu metode "pull-down" jika itu di kelas dasar? Saya selalu membayangkan kelas dasar secara fisik di bawah kelas turunan.
Dave Nay
Nama yang tepat dari buku Refactoring adalah "pull up".
Peter Kofler
1

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.

Will Hughes
sumber
1
+1 tentang "aturan tiga". Saya selalu kagum pada seberapa luas itu berlaku.
andy mangga
1
Ini tidak menjawab pertanyaan bagaimana .
Jan Doggen