ค้นหารหัสที่ไม่ได้ใช้ [ปิด]


208

ฉันต้องปรับแอปพลิเคชัน C # ให้ใหญ่อีกครั้งและฉันพบว่ามีฟังก์ชั่นมากมายที่ไม่เคยใช้ ฉันจะตรวจสอบโค้ดที่ไม่ได้ใช้งานได้อย่างไรเพื่อให้สามารถลบฟังก์ชั่นที่ไม่ได้ใช้ทั้งหมดได้?




ฉันแปลกใจว่านี่เป็นหัวข้อปิดฉันพบคำถามและคำตอบที่มีประโยชน์ 11 ปีหลังจากเขียนคำถาม ลิงก์นอกหัวข้อที่ให้ไว้บอกว่า "... เครื่องมือซอฟต์แวร์ที่ใช้กันทั่วไปโดยโปรแกรมเมอร์และเป็น ... " มีความเกี่ยวข้องกับ SO!
shelbypereira

คำตอบ:


218

ใช่ ReSharper ทำเช่นนี้ คลิกขวาที่โซลูชันและการเลือก "ค้นหาปัญหาเกี่ยวกับรหัส" หนึ่งในผลลัพธ์คือ "สัญลักษณ์ที่ไม่ได้ใช้" สิ่งนี้จะแสดงชั้นเรียนวิธีการและอื่น ๆ ที่ไม่ได้ใช้


20
มันเยี่ยมมาก มีคนไม่พอรู้เรื่องนี้ คุณต้องเปิด Solution Wide Analysis เพื่อให้ทุกอย่างปรากฏขึ้น
mcintyre321

16
Resharper เป็นเครื่องมือที่ยอดเยี่ยม แต่ฉันพบว่ามันไม่น่าเชื่อถือสำหรับงานนี้ ฉันมีวิธีการสาธารณะที่ฉันได้ลบการอ้างอิงทั้งหมด หากฉันคลิกขวาที่วิธีการและเลือกแสดงการใช้งานจะไม่มีเลย แต่ปัญหาของรหัส Resharper ไม่ได้แสดงว่าไม่ได้ใช้งาน
user890155

9
เรากำลังใช้การฉีดพึ่งพา เป็นผลให้ทุกอย่างดูเหมือนเคยชิน resharper เพราะแม้ประเภทที่ไม่ได้ใช้ยังคงมีการลงทะเบียนกับความสามัคคี
'monty' Jones ของมอนต์โกเมอรี่

11
@ user890155 นั่นอาจเป็นเพราะวิธีนี้เป็นแบบสาธารณะอาจมีการใช้งานไลบรารีโดยแอปพลิเคชันอื่นที่ไม่ได้อยู่ในโซลูชันปัจจุบัน ฉันเชื่อว่ามันจะตั้งค่าสถานะเฉพาะวิธีภายในและส่วนตัวว่าเป็นปัญหารหัสหากไม่ได้ใช้
Lukazoid

3
@elggarc เกี่ยวกับการฉีดพึ่งพาดูที่ปลั๊กอิน Agent Mulder ที่กล่าวถึงที่นี่: blogs.jetbrains.com/dotnet/2012/08/resharper-70-plug-ins หน้าแรกของโครงการ: hmemcpy.github.com/AgentMulder Agent Mulder - การสนับสนุนสำหรับ กรอบการพึ่งพาการฉีดเช่น Autofac, Castle Windsor, Unity เนื่องจาก ReSharper ไม่ทราบเกี่ยวกับคอนเทนเนอร์เหล่านี้คลาสสามารถถูกทำเครื่องหมายว่าไม่ได้ใช้บ่อยครั้งหรือไม่ได้สร้างอินสแตนซ์ Agent Mulder บอก ReSharper เมื่อมีการใช้คลาสเหล่านี้และให้การนำทางไปยังจุดลงทะเบียนจากแต่ละชั้นเรียน
Grzegorz Smulko

29

มันเป็นคำถามที่ดี แต่ต้องเตือนว่าคุณกำลังเดินอยู่ในน่านน้ำอันตรายที่นี่ เมื่อคุณลบรหัสคุณจะต้องแน่ใจว่าคุณรวบรวมและทดสอบบ่อยครั้ง

เครื่องมือยอดเยี่ยมที่นึกถึง:

NDepend - เครื่องมือนี้น่าทึ่งมาก ใช้เวลาสักครู่ในการติดตามและหลังจาก 10 นาทีแรกฉันคิดว่านักพัฒนาส่วนใหญ่เพียงแค่พูดว่า "ขันมัน!" และลบแอป เมื่อคุณได้รับความรู้สึกที่ดีสำหรับ NDepend มันจะช่วยให้คุณมีความเข้าใจอย่างถ่องแท้ว่าแอพของคุณเชื่อมโยงกันอย่างไร ตรวจสอบว่า: http://www.ndepend.com/ สิ่งสำคัญที่สุดคือเครื่องมือนี้จะช่วยให้คุณดูวิธีการที่ไม่มีผู้โทรเข้าโดยตรง มันจะแสดงให้คุณเห็นผกผันต้นไม้เรียกที่สมบูรณ์สำหรับวิธีการใด ๆ ในการชุมนุม (หรือแม้กระทั่งระหว่างการชุมนุม)

ไม่ว่าคุณจะเลือกเครื่องมืออะไรมันไม่ใช่งานที่ต้องทำเบา ๆ โดยเฉพาะอย่างยิ่งถ้าคุณกำลังจัดการกับวิธีการสาธารณะในการประกอบประเภทห้องสมุดตามที่คุณอาจไม่เคยรู้เมื่อแอพอ้างอิงพวกเขา


4
ข้อควรระวังอีกคำหนึ่งหากแอปของคุณคือ asp.net ด้วย NDepend คุณจะต้องคอมไพล์ไซต์ของคุณล่วงหน้าเพื่อให้คุณสามารถวิเคราะห์โค้ดที่ล้าสมัยและ NDepend ไม่สามารถครอบคลุม / ทราบเกี่ยวกับการโทรจากหน้า aspx (เช่นการเรียกวิธีใน ObjectDataSources และ เช่น)
Jaime

16

Resharper ดีสำหรับคนอื่นเช่นนี้ ระวังแม้ว่าเครื่องมือเหล่านี้จะไม่พบรหัสของคุณที่ใช้โดยการสะท้อนเช่นไม่ทราบว่ารหัสบางอย่างไม่ได้ถูกใช้โดยการสะท้อนกลับ


15

ดังที่เจฟฟ์ชี้เครื่องมือNDependสามารถช่วยในการค้นหาเมธอดฟิลด์และชนิดที่ไม่ได้ใช้

ที่ซับซ้อนบิต NDepend เสนอที่จะเขียนกฎรหัสมากกว่า LINQ แบบสอบถาม (CQLinq) มีการเสนอกฎรหัสเริ่มต้นประมาณ200 รายการโดยมี 3 ข้อสำหรับการตรวจจับโค้ดที่ไม่ได้ใช้ / ไม่ใช้

โดยทั่วไปกฎดังกล่าวเพื่อตรวจหาวิธีที่ไม่ได้ใช้ตัวอย่างเช่น:

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

กฎที่อ้างถึงเพื่อค้นหาวิธีที่ไม่ได้ใช้ (วิธีการตาย)

แต่กฎนี้ไร้เดียงสาและจะคืนผลบวกเท็จเล็กน้อย มีหลายสถานการณ์ที่ไม่เคยเรียกใช้เมธอด แต่มันไม่ได้ใช้ (จุดเริ่มต้น, ตัวสร้างคลาส, ผู้เข้ารอบสุดท้าย ... ) นี่คือเหตุผลที่กฎเริ่มต้น 3 ข้อมีเนื้อหาเพิ่มเติม:

NDepend บูรณาการใน Visual Studio 2017,2015, 2013, 2012, 2010 จึงกฎเหล่านี้สามารถตรวจสอบ / ที่ browsed / แก้ไขขวาภายในของ IDE เครื่องมือนี้ยังสามารถรวมเข้ากับกระบวนการ CI ของคุณและสามารถสร้างรายงานที่จะแสดงกฎที่ละเมิดกฎและองค์ประกอบรหัสผู้ร้าย NDepend นอกจากนี้ยังมีการขยาย VS ทีมบริการ

หากคุณคลิกที่ลิงค์ทั้ง 3 ด้านบนไปยังซอร์สโค้ดของกฎเหล่านี้คุณจะเห็นว่ารายการที่เกี่ยวข้องกับประเภทและวิธีการนั้นซับซ้อนเล็กน้อย นี้เป็นเพราะพวกเขาไม่เพียง แต่ตรวจสอบประเภทที่ไม่ได้ใช้และวิธีการ แต่ยังชนิดและวิธีการที่ใช้เฉพาะตามประเภทที่ไม่ได้ใช้ตายและวิธีการ (recursive)

นี่คือการวิเคราะห์แบบคงที่ดังนั้นคำนำหน้าอาจเกิดขึ้นในชื่อกฎ ถ้าองค์ประกอบรหัสจะใช้เพียงผ่านการสะท้อนกฎเหล่านี้อาจจะพิจารณาว่ามันเป็นไม่ได้ใช้ซึ่งเป็นกรณีที่ไม่

นอกเหนือจากการใช้กฎ 3 ข้อนี้แล้วฉันขอแนะนำให้ทำการวัดความครอบคลุมโค้ดโดยการทดสอบและพยายามให้มีการครอบคลุมอย่างเต็มที่ บ่อยครั้งที่คุณจะเห็นรหัสที่ไม่สามารถครอบคลุมได้จากการทดสอบจริง ๆแล้วเป็นรหัสที่ไม่ได้ใช้ / ตายซึ่งสามารถยกเลิกได้อย่างปลอดภัย สิ่งนี้มีประโยชน์อย่างยิ่งในอัลกอริธึมที่ซับซ้อนซึ่งไม่ชัดเจนว่าสามารถเข้าถึงรหัสสาขาได้หรือไม่

ข้อจำกัดความรับผิดชอบ: ฉันทำงานเพื่อ NDepend


6

ฉันยังจะพูดถึงว่าการใช้ IOC หรือที่เรียกว่า Unity อาจทำให้การประเมินเหล่านี้ทำให้เข้าใจผิด ฉันอาจมีข้อผิดพลาด แต่คลาสที่สำคัญมากหลายอย่างที่สร้างอินสแตนซ์ผ่าน Unity ดูเหมือนจะไม่มีอินสแตนซ์เท่าที่ ReSharper สามารถบอกได้ ถ้าฉันทำตามคำแนะนำ ReSharper ฉันจะถูก hosed!


4

ReSharperทำงานได้ดีในการค้นหารหัสที่ไม่ได้ใช้

ใน VS IDE คุณสามารถคลิกขวาที่คำนิยามและเลือก 'ค้นหาการอ้างอิงทั้งหมด' แม้ว่าจะใช้ได้เฉพาะในระดับโซลูชันเท่านั้น


1

ความจริงก็คือเครื่องมือไม่สามารถให้คำตอบที่แน่นอนได้ 100% แต่เครื่องมือครอบคลุมสามารถให้เงินกับคุณได้

หากคุณนับด้วยชุดทดสอบหน่วยที่ครอบคลุมกว่าที่คุณสามารถใช้เครื่องมือครอบคลุมการทดสอบเพื่อดูว่าบรรทัดของรหัสไม่ได้ดำเนินการในระหว่างการทดสอบการทำงาน คุณยังจะต้องวิเคราะห์รหัสด้วยตนเอง: กำจัดสิ่งที่คุณพิจารณาว่าเป็นรหัสตายตัวหรือเขียนการทดสอบเพื่อปรับปรุงการครอบคลุมการทดสอบ

หนึ่งเครื่องมือดังกล่าวเป็นNCoverกับสารตั้งต้นที่มาเปิดในSourceforge ทางเลือกหนึ่งคือPartCover

ลองดูคำตอบนี้ใน stackoverflow


1

ฉันเจอ AXTools CODESMART แล้วลองอีกครั้ง ใช้ตัววิเคราะห์รหัสในส่วนความคิดเห็นมันจะแสดงรายการฟังก์ชั่นในประเทศและทั่วโลกที่ตายแล้วพร้อมกับปัญหาอื่น ๆ


0

FXCop เป็นเครื่องมือวิเคราะห์รหัส ... มันทำได้มากกว่าการค้นหารหัสที่ไม่ได้ใช้ ฉันใช้ FXCop อยู่พักหนึ่งแล้วก็หายไปตามคำแนะนำที่ฉันถอนการติดตั้ง

ฉันคิดว่า NDepend ดูเหมือนว่าจะมีผู้สมัครมากกว่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.