Yinelenen kod nasıl kaldırılır (genel olarak)?


10

Bir OO dilinde (örneğin, Java ile sınırlı olmamakla birlikte), yinelenen kodu, oluşumunun kapsamına bağlı olarak nasıl düzeltirsiniz? İle başlayacağım (örneğin)

  • aynı sınıfta (kapsam) ayıklama yöntemi yeniden düzenleme (düzeltme) gerçekleştirmek
  • aynı hiyerarşinin (kapsam) sınıflarında Ayıklama Yöntemi ve Yukarı Çekme (düzeltme)
  • ...

aynı sınıfta KURU prensibi uygulamak için bir örneğe göz atın (tekrar etmeyin): geekswithblogs.net/chrisfalter/archive/2008/03/07/…
NoChance

SO'daki orijinal soru ( stackoverflow.com/questions/7380946/… ) kapatıldı. Bu yüzden buraya taşıdım.
Peter Kofler

Yanıtlar:


8

Kısa bir süre önce paylaşmak istediğim Bob Amca'nın "Temizlik Kodu" nda soruma iyi bir cevap buldum. Üç tür kopyalamayı ayırt eder

Aynı kod parçaları tek bir yöntemle değiştirilmelidir. Yani düzeltme yöntemi çıkarmak ve ortak davranışa delege olacaktır.

  • aynı yöntemde, Yerel Değişkeni Çıkarın ve yeniden kullanın.
  • aynı sınıfta Extract Method yeniden düzenleme gerçekleştirin.
  • aynı hiyerarşi sınıfları ayıklayın ve yukarı çekin. Yöntemlere yer bulmak için bir hiyerarşi oluşturulabilir.
  • ayrı hiyerarşiler sınıflarında yeni nesnelere temsilci seçme.
  • Yöntemler herhangi bir kapalı duruma ihtiyaç duymuyorsa, "lib" deseni uygulanabilir (genellikle SthUtilveya olarak adlandırılan statik yöntemler için bir kaptır SthLib).

vakaları switch/caseve if/elseaynı durum söz konusu daima testi .

  • Bunlar polimorfizm ile değiştirilmelidir.

Benzer algoritmaları uygulayan modüller . Bunları bulmak en zordur, çünkü hiçbir klon detektörü bunları bulamaz.

  • Kapsam daha büyük olduğu için tasarım desenleri kullanılır. Şablon Yöntem tasarım deseni bir sınıf hiyerarşisindeki algoritmalar için uygulanabilir.
  • Farklı yerlerde kullanılan herhangi bir algoritma için strateji tasarım deseni uygulanabilir.

Ayrıca kütüphanelerin farklı sürümleriyle uğraşırken Oded tarafından belirtilen geçerli bir nokta

  • tek bir sürümde birleştirin. Cephe tasarım deseni burada yardımcı olabilir.

Sonunda sorumu cevaplamak için en iyi cümle uyarıcıdır:

OO dillerinde kullanılan kod yeniden kullanım yöntemi nesnelerdir.


5

Genel olarak - yinelenen kodu tek bir yerde birleştirin ve orijinal çoğaltma sitesinin birleştirilmiş yeri aradığından emin olun.

Örneklerinizde, bu bir sınıf içinde bu ayıklanan yöntem ve bir sınıf içinde temel sınıf içindeki pull-up yöntemi olacaktır.

Kopyala-yapıştırma kodunda bu, kopyaları kaldırmak ve herhangi bir kullanıcının artık tek bir kopyayı kullanmasını sağlamaktır (bunun ne düzeyde olursa olsun).

Farklı kitaplık sürümleriyle uğraşırken, tek bir sürümde birleştirin (mümkünse).


Temel sınıftaysa "aşağı açılan" yöntem olmaz mı? Temel sınıfları her zaman türetilmiş sınıflar altında fiziksel olarak hayal ediyorum.
Dave Nay

Yeniden Düzenleme kitabından alınan uygun ad "yukarı çek" tir.
Peter Kofler

1

Sanırım bu açık uçlu bir soru ama aynı zamanda kodun durumuna da bağlı. Bağlamına bağlı olarak, yinelenen kodu biraz tolere edebilirsiniz. Üçüncüsü bu konuda iyidir.

Üç Kural İlk kez bir şey yaptığınızda, sadece yaparsınız. İkinci kez benzer bir şey yaptığınızda, çoğaltmayı beklersiniz, ancak yinelenen şeyi yine de yaparsınız. Üçüncü kez benzer bir şey yaptığınızda, refactor.

Bu hemen hemen tartışılabilir olsa da , bu yazı aynı zamanda yinelenen kodu tolere edeceğiniz vakaları da göz önünde bulundurur.


1
"Üçün kuralı" hakkında +1. Her zaman ne kadar geniş uygulanabilir olduğuna hayran kaldım.
andy mango

1
Bu nasıl soruya cevap vermiyor .
Jan Doggen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.