DRY ilgisiz, ancak neredeyse aynı kod


34

Neredeyse aynı olan bazı kodlar var, ancak ana değişkende bunlar arasında kalıtım olmadan tamamen farklı türler kullanılıyor. Özellikle, C # ve VB.NET için Roslyn ile aşağıdaki türlerde bir analizör yazıyorum:

Microsoft.CodeAnalysis.CSharp.Syntax.AttributeSyntax Microsoft.CodeAnalysis.VisualBasic.Syntax.AttributeSyntax

Kodun aynı şeyi yaptığını merak ediyorum, mümkün olduğunca DRY'yi tutmalı, mümkün olduğunca az ayırmalı (ancak tür dışında aynı) yöntemlerini ayırmalı mıyım, yoksa iki yöntemi olduğundan tamamen ayırmalı mıyım? ilişkili değil ve gelecekteki değişiklikler bir sürümü değişmeye zorlayabilir, ancak diğerini değiştiremez (bu pek mümkün olmasa da)?

Düzenleme: Bir yıl ya da öylesine, aynı soruyu çarptım ve Roslyn ekibi çözmeme yardım etti: Jenerik TAttributeSyntaxolan ve işin çoğunu yapan bir parametresi olan bir temel sınıf yazın . Daha sonra, türetilmiş sınıfları, belirli bir tip gerektiren asgari miktarda veri ile yazın.


Var olan sınıfları saran ancak kavramsal olarak orada olması gereken mirasa sahip olan kendi AttributeSyntax arayüzünüzü oluşturmak işe yarar mı?
Winston Ewert

7
Bu açıksa üzgünüm, ancak jenerikler var, bu yüzden aynı ama tip için olan kod için kendini tekrarlamana gerek yok. Kastettiğin bu değilse, lütfen dikkate almayın.
Davislor

@Lorehead Genelde bunu yapardım, ama bu, üzerinde kontrolüm olmayan bir iç yöntemden bir taşıma yükü olarak düğümü içeren bir türden geçirilen tek bir yöntemdir.
Hosch250

@WinstonEwert Buna göz atacağım. Yine de, tüm C # / VB.NET tipleri için bunu yapmak istediğimden emin değilim.
Hosch250

1
Yeniden düzenleme, birçok uzlaşmaya ve hatta bazen paradokslara yol açar. Örneğin, gevşek bağlantıya karşılık DRY veya kısa fonksiyonlar, ancak bunların çoğu, uzun fonksiyonlara ve bunlardan birkaçı. Sonunda, zor bir canavar: Hedefiniz okunabilirlik ve bakımdır. İlk kez kodunuzu gören bir avatar olarak düşünmeniz gerekir. Ve bazen sadece neyin daha iyi olduğunu görmeye çalışırsın . Mükemmel yeniden düzenleme maalesef mümkün değil.
phresnel

Yanıtlar:


111

DRY'yi yapmazsınız çünkü birileri bir kitapta yapmanın iyi olduğu bir yere yazmıştır, çünkü DRY'yi yaparsınız çünkü aslında maddi faydaları vardır.

Özellikle bu sorudan:

Kendinizi tekrarlarsanız, bakım sorunları oluşturabilirsiniz. DoStuff1-3 modelinde hepsi benzer şekilde yapılandırılmış bir koda sahipse ve bir sorunu çözdüyseniz, sorunu başka yerlerde çözmeyi kolayca unutabilirsiniz. Ayrıca, ele almak için yeni bir vaka eklemek zorunda kalırsanız, her yere kopya yapıştırmak yerine farklı parametreleri tek bir işleve geçirebilirsiniz.

Bununla birlikte, DRY akıllı programcılar tarafından sıklıkla aşırı bir duruma getirilir. Bazen kendini tekrar etmemek için soyutlamalar yapmalısın, bu yüzden takım arkadaşlarının onları takip edemeyeceği kadar geniş. Bazen iki şeyin yapısı sadece belli belirsiz fakat yeterince farklıdır. DoStuff1-4, kendilerini tekrar etmemek için yeniden yapılandırmanın, doğal olmayan kodlar yazmanıza veya ekibinizin size göz kamaştırmasına neden olacak akıllı kodlama backflipslerine maruz kalmanıza neden olacak kadar farklıysa, o zaman kendinizi tekrarlamanız uygun olabilir. Doğal olmayan yollardan kendimi birkaç kez tekrarlamamak için geriye doğru eğildim ve son üründen pişman oldum.

Bu yüzden, temel olarak, "ahbap, bu kod oldukça benzer, belki de kendimi tekrar etmemeyi reddetmeliyim" diye düşünmeyin. "Bu kod tabanını yeniden kullanmak için ortak öğeleri yeniden kullanmak için yeniden yapılanmanın, kodu daha sürdürülebilir veya daha az bakım gerektirebilir hale getirdiğini mi düşünüyorsunuz?" Ardından, daha bakım yapılabilir kılanı seçin.


Bu varlık verilen dedi SRP bunun için kodunuzu analiz etmek mantıklı olabilir ve sadece genel olarak küçük ve esnek sınıfları çalışırken Bu nedenle , genel türlerini kullanmak davranış bitlerini parçalayın içine (onlar türü dışında özdeş başka olduğunu söyledi) küçük sınıflar Sonra, bu sınıfların bazılarının tamamen özdeş olduğunu (sadece özdeş değil) öğreneceksiniz ve sonra eklemek istediğiniz bir araç seti oluşturabilirsiniz Microsoft.CodeAnalysis.CPlusPlus.Syntax.AttributeSyntax.


32
TL; DR - DRY, sona ermek için bir araçtır. Sonuna odaklan, araçlara değil. Lego Adamı'nı iki kez yükseltebilseydim, yapardım.

Önemli bir not: eğer yapmak kendinizi tekrar, her zaman yorumunda zaman tekrarlanan kod değişiklikleri ziyaret edilecek olan tüm diğer yerlerde söz. Sadece bir desync olasılığını azaltmakla kalmaz, aynı zamanda tekrarlamanın size neden olduğu bakım ağrılarının bir göstergesi olarak da çalışır.
Xion
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.