Kullanılmayan kodu bul [kapalı]


208

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?




Bunun konu dışı olarak etiketlendiğine şaşırdım, soru ve cevapları soru yazıldıktan 11 yıl sonra yararlı buldum. sağlanan konu dışı bağlantı "... programcılar tarafından yaygın olarak kullanılan yazılım araçlarının; ve ..." kesinlikle SO!
shelbypereira

Yanıtlar:


218

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.


20
bu harika. yeterli insan bunu bilmiyor. Her şeyin görünmesi için Çözüm Geniş Analizi'ni de açmanız gerekir.
mcintyre321

16
Yeniden paylaşma harika bir araçtır, ancak bu görev için güvenilir olmadığını gördüm. Tüm referansları kaldırdığım genel bir yöntemim var. Yöntemi sağ tıklatıp Kullanımları Göster'i seçersem, hiçbiri yoktur, ancak Resharper'ın kod sorunları kullanılmayan olarak listelenmez.
user890155

9
Bağımlılık enjeksiyonu kullanıyoruz. Sonuç olarak, her şey yeniden şekillendirmek için kullanılmış gibi görünüyor çünkü kullanılmayan türler bile hala birlik ile kaydediliyor.
Montgomery 'monty' Jones

11
@ user890155 Bunun nedeni, yöntem herkese açık olduğundan, kitaplığın geçerli çözümde olmayan başka bir uygulama tarafından tüketilebilmesidir. Sadece iç ve özel yöntemleri kullanılmayan kod sorunları olarak işaretleyeceğine inanıyorum.
Lukazoid

3
@elggarc Bağımlılık enjeksiyonu ile ilgili olarak, burada belirtilen Ajan Mulder eklentisine göz atın: blogs.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins Proje ana sayfası: hmemcpy.github.com/AgentMulder Ajan Mulder - destek Autofac, Windsor Kalesi, Birlik gibi Bağımlılık Enjeksiyon çerçeveleri. ReSharper bu kapsayıcılar hakkında bilgi sahibi olmadığından, sınıflar sıklıkla kullanılmamış olarak işaretlenebilir veya somutlaştırılamaz. Ajan Mulder, ReSharper'a bu sınıfların ne zaman kullanıldığını söyler ve her sınıftan kayıt noktasına navigasyon sağlar.
Grzegorz Smulko

29

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.


4
Uygulamanız asp.net ise, başka bir uyarı da, NDepend ile sitenizi önceden derlemeniz gerekir, böylece kod davranışlarını analiz edebilirsiniz ve NDepend, aspx sayfalarından gelen çağrıları kapsamaz / bilemez (yani ObjectDataSources ve gibi)
Jaime

16

Resharper, diğerleri için belirtildiği gibi bunun için iyidir. Ancak dikkatli olun, bu araçlar size yansıma tarafından kullanılan kodu bulamaz, örneğin bazı kodların yansıma tarafından KULLANILMADIĞINI bilemez.


15

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

N Kullanılmayan yöntemleri (ölü yöntemler) bulmak için kurala güvenin

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.


6

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!


4

ReSharper kullanılmayan kodu bulmak için harika bir iş çıkarır .

VS IDE'de, tanımı sağ tıklayıp 'Tüm Referansları Bul'u seçebilirsiniz, ancak bu yalnızca çözüm düzeyinde çalışır.


1

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 .


1

AXTools CODESMART rastladım .. Bir kez deneyin. İncelemeler bölümünde kod çözümleyiciyi kullanın.Diğer konularla birlikte ölü yerel ve global işlevleri listeleyecektir.


0

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.

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.