Terkadang duplikasi kode adalah hasil dari "permainan kata": Dua hal terlihat sama, tetapi tidak.
Ada kemungkinan bahwa abstrak yang berlebihan dapat merusak modularitas sebenarnya dari sistem Anda. Di bawah rezim modularitas, Anda harus memutuskan "apa yang mungkin berubah?" dan "apa yang stabil?". Apa pun yang stabil akan dimasukkan ke dalam antarmuka, sementara apa pun yang tidak stabil akan dienkapsulasi dalam implementasi modul. Kemudian, ketika hal-hal berubah, perubahan yang perlu Anda lakukan diisolasi ke modul itu.
Refactoring diperlukan ketika apa yang Anda pikir stabil (mis. Panggilan API ini akan selalu mengambil dua argumen) perlu diubah.
Jadi, untuk dua fragmen kode duplikat ini, saya akan bertanya: Apakah perubahan yang diperlukan untuk satu berarti yang lain harus diubah juga?
Bagaimana Anda menjawab pertanyaan itu mungkin memberi Anda wawasan yang lebih baik tentang abstraksi yang baik.
Pola desain juga merupakan alat yang berguna. Mungkin kode duplikat Anda melakukan traversal dari beberapa bentuk, dan pola iterator harus diterapkan.
Jika kode duplikat Anda memiliki beberapa nilai pengembalian (dan itulah sebabnya Anda tidak bisa melakukan metode ekstrak sederhana), maka mungkin Anda harus membuat kelas yang menyimpan nilai yang dikembalikan. Kelas bisa memanggil metode abstrak untuk setiap titik yang bervariasi antara dua fragmen kode. Anda kemudian akan membuat dua implementasi konkret dari kelas: satu untuk setiap fragmen. [Ini secara efektif pola desain Metode Templat, tidak menjadi bingung dengan konsep templat di C ++. Atau, apa yang Anda lihat mungkin lebih baik diselesaikan dengan pola Strategi.]
Cara alami dan berguna lain untuk memikirkannya adalah dengan fungsi tingkat tinggi. Misalnya, membuat lambdas atau menggunakan kelas dalam anonim agar kode dapat diteruskan ke abstraksi. Secara umum, Anda dapat menghapus duplikasi, tetapi kecuali jika benar-benar ada hubungan di antara mereka [jika ada yang berubah, maka harus yang lain] maka Anda mungkin menyakiti modularitas, tidak membantunya.
Secara pribadi saya mengabaikannya dan melanjutkan. Kemungkinannya adalah, jika suatu kasus aneh itu lebih baik untuk diduplikasi, Anda bisa menghabiskan waktu lama untuk refactoring dan pengembang berikutnya akan melihat dan membatalkan perubahan Anda!
sumber
Tanpa sampel kode, sulit untuk mengatakan mengapa kode Anda tidak memiliki abstraksi yang mudah diidentifikasi. Dengan peringatan itu, berikut adalah beberapa ide:
Kesulitan terbesar dalam latihan ini adalah bahwa fungsi Anda kemungkinan menggabungkan terlalu banyak perilaku yang tidak berhubungan pada tingkat abstraksi tertentu, dan Anda perlu menangani beberapa dari mereka di tingkat yang lebih rendah. Anda menduga dengan benar bahwa kejelasan adalah kunci untuk mempertahankan kode, tetapi memperjelas perilaku kode (kondisi saat ini) sangat berbeda dengan membuat maksud kode menjadi jelas.
Buat bagaimana potongan kode yang lebih kecil abstrak dengan meminta tanda tangan fungsinya mengidentifikasi apa, dan potongan yang lebih besar harus lebih mudah untuk diklasifikasi.
sumber