Ben büyük bir C # uygulaması refactor ve asla kullanılmayan fonksiyonlar bir sürü bulundu. Kullanılmayan tüm kodları nasıl kontrol edebilirim, böylece kullanılmayan tüm fonksiyonları kaldırabilirim?
Ben büyük bir C # uygulaması refactor ve asla kullanılmayan fonksiyonlar bir sürü bulundu. Kullanılmayan tüm kodları nasıl kontrol edebilirim, böylece kullanılmayan tüm fonksiyonları kaldırabilirim?
Yanıtlar:
Evet, ReSharper bunu yapıyor. Çözümünüzü sağ tıklayın ve "Kod Sorunlarını Bul" u seçin. Sonuçlardan biri "Kullanılmayan Semboller" dir. Bu size kullanılmayan sınıfları, yöntemleri vb. Gösterecektir.
Bu harika bir soru, ama burada tehlikeli sularda arıtıldığınıza dikkat edin. Kodu silerken sık sık derlediğinizden ve test ettiğinizden emin olmanız gerekir.
Akla gelen harika bir araç:
NDepend - bu araç sadece şaşırtıcı. Bakmak biraz zaman alır ve ilk 10 dakikadan sonra çoğu geliştiricinin sadece "Vidalayın!" ve uygulamayı silin. NDepend için iyi bir fikir edindiğinizde, uygulamalarınızın nasıl birleştirildiğine dair harika bir fikir verir. Bir göz atın: http://www.ndepend.com/ . En önemlisi, bu araç doğrudan arayan olmayan yöntemleri görüntülemenize izin verecektir. Aynı zamanda montajdaki (hatta montajlar arasındaki) herhangi bir yöntem için ters, tam bir çağrı ağacı gösterecektir.
Hangi aracı seçerseniz seçin, hafife almak bir görev değildir. Özellikle bir kitaplık derlemelerinde genel yöntemlerle uğraşıyorsanız, uygulamanın ne zaman başvurduğunu asla bilemeyeceğinizden.
Jeff'in işaret ettiği gibi, NDepend aracı kullanılmayan yöntemleri, alanları ve türleri bulmaya yardımcı olabilir.
Biraz ayrıntılı olarak, NDepend LINQ Sorgusu (CQLinq) üzerine Kod Kuralı yazmayı önerir . Yaklaşık 200 varsayılan kod kuralı önerildi, bunlardan 3 tanesi kullanılmamış / ölü kod algılamaya adanmış
Temel olarak, kullanılmayan yöntemi tespit etmek için böyle bir kural örneğin:
// <Name>Dead Methods</Name>
warnif count > 0
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m
Ancak bu kural naiftir ve önemsiz yanlış pozitifler getirecektir. Bir yöntemin asla çağrılmadığı, ancak kullanılmadığı birçok durum vardır (giriş noktası, sınıf oluşturucu, finalizer ...) bu yüzden 3 varsayılan kural daha ayrıntılıdır:
NDepend, Visual Studio 2017,2015, 2013, 2012, 2010'a entegre edilmiştir, bu nedenle bu kurallar doğrudan IDE içinde kontrol edilebilir / göz atılabilir / düzenlenebilir . Araç ayrıca CI sürecinize entegre edilebilir ve ihlal edilen kuralları ve suçlu kod öğelerini gösterecek raporlar oluşturabilir. NDepend'in ayrıca bir VS Team Services uzantısı var .
Yukarıdaki bu 3 bağlantıyı bu kuralların kaynak koduna doğru tıklarsanız, tür ve yöntemlerle ilgili olanların biraz karmaşık olduğunu görürsünüz. Bunun nedeni, yalnızca kullanılmayan türleri ve yöntemleri değil, aynı zamanda yalnızca kullanılmayan ölü türler ve yöntemler (özyinelemeli) tarafından kullanılan türleri ve yöntemleri de tespit etmeleridir .
Bu statik analizdir , bu nedenle kural adlarında Potansiyel Olarak önekidir . Bir kod öğesi yalnızca yansıma yoluyla kullanılırsa , bu kurallar öğeyi kullanılmayan olarak kabul edebilir ve bu durum böyle değildir.
Bu 3 kuralı kullanmaya ek olarak, kod kapsamının testlerle ölçülmesini ve tam kapsam için çaba gösterilmesini tavsiye ederim. Genellikle, testlerin kapsamına giremeyen kodun , aslında güvenle atılabilen kullanılmayan / ölü kod olduğunu görürsünüz . Bu, özellikle bir kod dalına erişilip erişilemediğinin net olmadığı karmaşık algoritmalarda kullanışlıdır.
Feragatname: NDepend için çalışıyorum.
Ayrıca IOC aka Unity kullanmanın bu değerlendirmeleri yanıltıcı hale getirebileceğinden de bahsedeceğim. Hata yapmış olabilirim, ancak Birlik aracılığıyla başlatılan birkaç çok önemli sınıfın, ReSharper'ın söyleyebildiği kadar hiçbir somutlaştırması yok gibi görünüyor. ReSharper önerilerini takip ettim ben ıslatılacağız!
Gerçek şu ki, araç size asla% 100 kesin bir cevap veremez, ancak kapsama aracı size para için oldukça iyi bir çalışma sağlayabilir.
Kapsamlı birim test paketiyle sayıyorsanız, test çalıştırması sırasında tam olarak hangi kod satırlarının yürütülmediğini görmek için test kapsamı aracını kullanabilirsiniz. Kodu yine de manuel olarak analiz etmeniz gerekecektir: ya da ölü kodu düşündüğünüzü ortadan kaldırın ya da test kapsamını geliştirmek için test yazın.
Böyle bir araç NCover , Sourceforge'da açık kaynak öncülü . Başka bir alternatif PartCover .
Stackoverflow'daki bu cevaba göz atın .
FXCop bir kod analizörüdür ... Kullanılmayan kodu bulmaktan çok daha fazlasını yapar. Bir süre FXCop kullandım ve önerilerinde o kadar kayboldum ki kaldırdım.
Bence NDepend daha muhtemel bir aday gibi görünüyor.