Bazen kod çoğaltma bir "pun" in sonucudur: İki şey aynı görünüyor, ama değil.
Aşırı soyutlamanın sisteminizin gerçek modülerliğini bozması mümkündür. Modülerlik rejimi altında, "neyin değişmesi muhtemel?" ve "kararlı olan nedir?". Kararlı olan her şey arabirime konulurken, kararsız olan her şey modülün uygulamasında kapsüllenir. Sonra, işler değiştiğinde, yapmanız gereken değişiklik o modüle izole edilir.
Yeniden düzenleme, sabit olduğunu düşündüğünüz şeyin (örneğin, bu API çağrısı her zaman iki argüman alacaktır) değiştirilmesi gerektiğinde gereklidir.
Yani, bu iki yinelenen kod parçaları için sormak istiyorum: biri için gerekli bir değişiklik mutlaka diğerinin de değiştirilmesi gerektiği anlamına mı geliyor?
Bu soruya nasıl cevap verdiğiniz, size iyi bir soyutlamanın ne olabileceği hakkında daha iyi bir fikir verebilir.
Tasarım desenleri de faydalı araçlardır. Belki çoğaltılan kodunuz belirli bir formda geçiş yapıyor ve yineleyici deseni uygulanmalıdır.
Çoğaltılan kodunuzda birden fazla dönüş değeri varsa (ve bu nedenle basit bir ayıklama yöntemi yapamazsınız), belki de döndürülen değerleri tutan bir sınıf oluşturmanız gerekir. Sınıf, iki kod parçası arasında değişen her nokta için soyut bir yöntem çağırabilir. Daha sonra sınıfın iki somut uygulamasını yaparsınız: her parça için bir tane. [Bu, etkili bir şekilde Şablon Yöntemi tasarım modelidir, C ++ 'da şablon kavramı ile karıştırılmamalıdır. Alternatif olarak, baktığınız şey Strateji modeliyle daha iyi çözülebilir.]
Bunu düşünmenin bir başka doğal ve kullanışlı yolu, üst düzey işlevlerdir. Örneğin, lambda yapmak veya kodun soyutlamaya geçmesi için anonim iç sınıflar kullanmak. Genellikle, çoğaltmayı kaldırabilirsiniz, ancak aralarında gerçekten bir ilişki yoksa (biri değişirse, diğeri de değişmelidir), o zaman ona yardım etmemek, modülerliğe zarar verebilirsiniz.