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.