Temukan kode yang tidak digunakan [ditutup]

208

Saya harus memperbaiki aplikasi C # yang besar, dan saya menemukan banyak fungsi yang tidak pernah digunakan. Bagaimana saya dapat memeriksa kode yang tidak digunakan, sehingga saya dapat menghapus semua fungsi yang tidak digunakan?

Andre
sumber
Saya terkejut bahwa ini dilabeli sebagai off topic, saya menemukan pertanyaan dan jawaban berguna 11 tahun setelah pertanyaan itu ditulis. tautan di luar topik yang disediakan mengatakan bahwa "... alat perangkat lunak yang biasa digunakan oleh programmer; dan ..." pasti relevan untuk SO !.
shelbypereira

Jawaban:

218

Ya, ReSharper melakukan ini. Klik kanan pada solusi Anda dan pilih "Find Code Issues". Salah satu hasilnya adalah "Simbol Tidak Digunakan". Ini akan menunjukkan kepada Anda kelas, metode, dll., Yang tidak digunakan.

Jarrett Meyer
sumber
20
ini bagus. tidak cukup banyak orang yang tahu tentang ini. Anda harus mengaktifkan Solution Wide Analysis juga untuk menampilkan semuanya.
mcintyre321
16
Resharper adalah alat yang hebat, tetapi saya merasa itu tidak dapat diandalkan untuk tugas ini. Saya memiliki metode publik tempat saya menghapus semua referensi. Jika saya klik kanan metode dan pilih Show Usages, tidak ada, tetapi masalah kode Resharper tidak mencantumkannya sebagai tidak terpakai.
user890155
9
Kami menggunakan injeksi ketergantungan. Akibatnya, semuanya tampak digunakan untuk mengumpulkan kembali karena bahkan jenis yang tidak digunakan masih terdaftar dengan persatuan.
Montgomery 'monty' Jones
11
@ user890155 Itu karena metode ini bersifat publik, perpustakaan dapat dikonsumsi oleh aplikasi lain yang tidak ada dalam solusi saat ini. Saya percaya ini hanya akan menandai metode internal dan pribadi sebagai masalah kode jika tidak digunakan.
Lukazoid
3
@elggarc Mengenai injeksi ketergantungan, lihat plugin Agen Mulder yang disebutkan di sini: blogs.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins Beranda proyek: hmemcpy.github.com/AgentMulder Agent Mulder - dukungan untuk Kerangka kerja Dependency Injection seperti Autofac, Castle Windsor, Unity. Karena ReSharper tidak tahu tentang kontainer ini, kelas sering dapat ditandai sebagai tidak terpakai, atau tidak dipakai. Agen Mulder memberi tahu ReSharper ketika kelas-kelas ini digunakan, dan menyediakan navigasi ke titik pendaftaran dari setiap kelas.
Grzegorz Smulko
29

Ini pertanyaan yang bagus, tetapi berhati-hatilah karena Anda sedang menginjak perairan berbahaya di sini. Saat Anda menghapus kode, Anda harus memastikan bahwa Anda sering mengkompilasi dan menguji.

Satu alat hebat muncul di benak:

NDepend - alat ini luar biasa. Butuh sedikit waktu untuk grok, dan setelah 10 menit pertama saya pikir sebagian besar pengembang hanya mengatakan "Persetan!" dan hapus aplikasinya. Setelah Anda merasakan NDepend, Anda mendapat wawasan yang luar biasa tentang bagaimana aplikasi Anda digabungkan. Lihat itu: http://www.ndepend.com/ . Yang paling penting, alat ini akan memungkinkan Anda untuk melihat metode yang tidak memiliki penelepon langsung. Ini juga akan menunjukkan kepada Anda kebalikan, pohon panggilan lengkap untuk metode apa pun dalam perakitan (atau bahkan antara majelis).

Apa pun alat yang Anda pilih, itu bukan tugas untuk dianggap enteng. Terutama jika Anda berurusan dengan metode publik pada majelis tipe perpustakaan, karena Anda mungkin tidak pernah tahu kapan aplikasi merujuk mereka.

Jeff Schumacher
sumber
4
Kata lain dari kehati-hatian, jika aplikasi Anda adalah asp.net, dengan NDepend Anda perlu mengkompilasi ulang situs Anda sehingga Anda dapat menganalisis kode-belakang dan NDepend tidak dapat membahas / mengetahui tentang panggilan dari halaman aspx (yaitu panggilan metode di ObjectDataSources dan like)
Jaime
16

Resharper baik untuk ini seperti yang lain katakan. Namun berhati-hatilah, alat-alat ini tidak menemukan Anda kode yang digunakan oleh refleksi, misalnya tidak dapat mengetahui apakah beberapa kode TIDAK digunakan oleh refleksi.

mmiika
sumber
15

Seperti yang ditunjukkan Jeff, alat NDepend dapat membantu menemukan metode, bidang, dan tipe yang tidak digunakan.

Untuk menguraikan sedikit, NDepend mengusulkan untuk menulis Code Rule over LINQ Query (CQLinq) . Sekitar 200 aturan kode standar diusulkan, 3 di antaranya didedikasikan untuk deteksi kode yang tidak digunakan / mati

Pada dasarnya aturan untuk mendeteksi metode yang tidak digunakan misalnya terlihat seperti:

// <Name>Dead Methods</Name>
warnif count > 0 
from m in Application.Methods where !m.MethodsCallingMe.Any()
select m

Aturan NDepend untuk menemukan metode yang tidak digunakan (metode mati)

Tetapi aturan ini naif dan akan mengembalikan positif palsu sepele. Ada banyak situasi di mana metode tidak pernah dipanggil namun tidak terpakai (titik masuk, konstruktor kelas, finaliser ...) ini sebabnya 3 aturan standar lebih diuraikan:

NDepend terintegrasi dalam Visual Studio 2017,2015, 2013, 2012, 2010, sehingga aturan ini dapat diperiksa / diramban / diedit tepat di dalam IDE . Alat ini juga dapat diintegrasikan ke dalam proses CI Anda dan dapat membuat laporan yang akan menunjukkan aturan yang dilanggar dan elemen kode pelakunya. NDepend juga memiliki ekstensi VS Team Services .

Jika Anda mengklik 3 tautan di atas menuju kode sumber aturan ini, Anda akan melihat bahwa yang menyangkut jenis dan metode agak rumit. Ini karena mereka mendeteksi tidak hanya tipe dan metode yang tidak digunakan, tetapi juga tipe dan metode yang hanya digunakan oleh tipe dan metode mati yang tidak digunakan (rekursif).

Ini adalah analisis statis , karenanya awalan Berpotensi dalam nama aturan. Jika elemen kode hanya digunakan melalui refleksi, aturan ini mungkin menganggapnya sebagai tidak terpakai yang tidak terjadi.

Selain menggunakan 3 aturan ini, saya akan menyarankan mengukur cakupan kode dengan tes dan berusaha untuk memiliki cakupan penuh. Seringkali, Anda akan melihat bahwa kode yang tidak dapat ditutupi oleh tes, sebenarnya adalah kode yang tidak digunakan / mati yang dapat dibuang dengan aman. Ini sangat berguna dalam algoritma kompleks di mana tidak jelas apakah cabang kode dapat dijangkau atau tidak.

Penafian: Saya bekerja untuk NDepend.

Patrick dari tim NDepend
sumber
6

Saya juga akan menyebutkan bahwa menggunakan IOC alias Unity dapat membuat penilaian ini menyesatkan. Saya mungkin telah keliru tetapi beberapa kelas yang sangat penting yang dipakai melalui Unity tampaknya tidak memiliki instantiasi sejauh ReSharper tahu. Jika saya mengikuti rekomendasi ReSharper, saya akan disemprot!

Allen Marshall
sumber
4

ReSharper melakukan pekerjaan yang baik untuk menemukan kode yang tidak digunakan.

Dalam VS IDE, Anda dapat mengklik kanan pada definisi dan memilih 'Temukan Semua Referensi', meskipun ini hanya berfungsi pada tingkat solusi.

Mitch Wheat
sumber
1

Yang benar adalah bahwa alat tersebut tidak pernah dapat memberi Anda jawaban 100% pasti, tetapi alat cakupan dapat memberi Anda uang yang cukup bagus.

Jika Anda menghitung dengan unit test suite yang komprehensif, daripada Anda dapat menggunakan alat cakupan tes untuk melihat dengan tepat baris kode apa yang tidak dieksekusi selama menjalankan tes. Anda masih perlu menganalisis kode secara manual: menghilangkan kode yang Anda anggap mati atau menulis tes untuk meningkatkan cakupan tes.

Salah satu alat tersebut adalah NCover , dengan prekursor open source di Sourceforge . Alternatif lain adalah PartCover .

Lihat jawaban ini di stackoverflow.

Dan
sumber
1

Saya telah menemukan AXTools CODESMART..Coba sekali itu. Gunakan penganalisa kode di bagian ulasan. Ini akan mencantumkan mati fungsi lokal dan global bersama dengan masalah lain.

ramu
sumber
0

FXCop adalah penganalisa kode ... Itu jauh lebih banyak daripada menemukan kode yang tidak digunakan. Saya menggunakan FXCop untuk sementara waktu, dan sangat hilang dalam rekomendasinya sehingga saya mencopotnya.

Saya pikir NDepend sepertinya kandidat yang lebih mungkin.


sumber