사용하지 않는 코드 찾기 [닫기]


208

큰 C # 응용 프로그램을 리팩터링해야하는데 결코 사용되지 않은 많은 기능을 발견했습니다. 사용하지 않는 코드를 확인하여 사용하지 않는 모든 기능을 제거하려면 어떻게해야합니까?




이것이 주제가 아닌 것으로 표시되어 놀랐습니다. 질문과 답변은 질문이 작성된 후 11 년 후에 유용하다는 것을 알았습니다. 제공된 주 제외 링크는 "... 프로그래머가 일반적으로 사용하는 소프트웨어 도구이며 ..."는 SO!
shelbypereira

답변:


218

예, ReSharper가이 작업을 수행합니다. 솔루션을 마우스 오른쪽 버튼으로 클릭하고 "코드 문제 찾기"를 선택하십시오. 결과 중 하나는 "사용되지 않은 기호"입니다. 사용하지 않는 클래스, 메소드 등이 표시됩니다.


20
이것은 대단하다. 충분한 사람들이 이것에 대해 알지 못합니다. 모든 것을 표시하려면 솔루션 전체 분석을 설정해야합니다.
mcintyre321

16
Resharper는 훌륭한 도구이지만이 작업에 신뢰할 수없는 것으로 나타났습니다. 모든 참조를 제거한 공개 방법이 있습니다. 메소드를 마우스 오른쪽 단추로 클릭하고 사용법 표시를 선택하면 아무것도 없지만 Resharper의 코드 문제는 사용되지 않은 것으로 나열되지 않습니다.
user890155

9
우리는 의존성 주입을 사용하고 있습니다. 결과적으로, 사용되지 않은 유형조차도 여전히 단일로 등록되어 있기 때문에 모든 것이 다시 선명하게 보입니다.
Montgomery '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와 같은 Dependency Injection 프레임 워크 ReSharper는 이러한 컨테이너에 대해 알지 못하기 때문에 클래스는 자주 사용되지 않거나 인스턴스화되지 않은 것으로 표시 될 수 있습니다. Mulder 요원은 이러한 클래스가 사용될 때 ReSharper에 알리고 각 클래스에서 등록 포인트로 이동합니다.
Grzegorz Smulko

29

좋은 질문이지만 위험한 물에서 밟고 있다는 경고를 받으십시오. 코드를 삭제할 때는 자주 컴파일하고 테스트해야합니다.

하나의 위대한 도구가 떠 오릅니다.

NDepend-이 도구는 놀랍습니다. 시작하는 데 약간의 시간이 걸리며 처음 10 분이 지나면 대부분의 개발자가 "Screw it!"이라고 말합니다. 앱을 삭제하십시오. NDepend에 대한 좋은 느낌을 받으면 앱이 어떻게 결합되는지에 대한 놀라운 통찰력을 제공합니다. 확인하십시오 : http://www.ndepend.com/ . 가장 중요한 것은이 도구를 사용하면 직접 발신자가없는 메서드를 볼 수 있습니다. 또한 어셈블리의 모든 메서드 (또는 어셈블리 간)에 대한 역의 완전한 호출 트리를 보여줍니다.

어떤 도구를 선택하든 가볍게 생각하는 것은 아닙니다. 특히 라이브러리 유형 어셈블리에서 공개 메소드를 처리하는 경우 앱이 언제 참조하는지 알 수 없으므로.


4
주의해야 할 또 다른주의 사항은 앱이 asp.net이고 NDepend를 사용하면 코드 숨김을 분석하고 NDepend가 aspx 페이지의 호출 (예 : ObjectDataSources 및 등)
제이미

16

Resharper는 다른 사람들이 말했듯이 이것에 좋습니다. 그러나 이러한 도구는 리플렉션에 사용되는 코드를 찾지 못합니다. 예를 들어 리플렉션에 사용되지 않는 코드가 있는지 알 수 없습니다.


15

Jeff가 지적한 것처럼 NDepend 도구 는 사용되지 않은 메소드, 필드 및 유형을 찾는 데 도움이 될 수 있습니다.

비트를 정교화하기 위해 NDepend 는 LINQ 쿼리 (CQLinq)를 통한 코드 규칙 작성을 제안합니다 . 약 200 개의 기본 코드 규칙 이 제안되어 있으며 그 중 3 개는 사용하지 않거나 죽은 코드 감지 전용입니다.

기본적으로 사용되지 않는 방법을 감지하는 규칙은 다음과 같습니다.

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

사용하지 않는 메소드를 찾기위한 NDepend 규칙 (죽은 메소드)

그러나이 규칙은 순진하며 사소한 오 탐지를 반환합니다. 메소드가 호출되지는 않지만 사용되지 않는 많은 상황이 있습니다 (엔트리 포인트, 클래스 생성자, finaliser ...) 이것이 3 가지 기본 규칙이 더 정교해진 이유입니다.

NDepend는 Visual Studio 2017,2015, 2013, 2012, 2010에 통합되어 있으므로 IDE 내에서 이러한 규칙을 확인 / 탐색 / 편집 할 수 있습니다 . 이 도구는 CI 프로세스에 통합 될 수 있으며 위반 된 규칙 및 범인 코드 요소를 보여주는 보고서 를 작성할 수 있습니다 . NDepend에는 VS Team Services 확장 기능도 있습니다.

이 규칙의 소스 코드에 대한 위의 3 개 링크를 클릭하면 유형 및 메소드에 관한 링크가 약간 복잡하다는 것을 알 수 있습니다. 이는 사용되지 않는 유형 및 메소드뿐만 아니라 사용되지 않은 데드 유형 및 메소드 사용하는 유형 및 메소드 (재귀) 도 감지하기 때문 입니다.

이것은 정적 분석 이므로 규칙 이름에 잠재적 으로 접두사가 붙습니다 . 코드 요소가 리플렉션을 통해서만 사용되는 경우 이러한 규칙은이를 사용하지 않는 것으로 간주 할 수 있습니다 (이 경우에는 해당되지 않음).

이 세 가지 규칙을 사용하는 것 외에도 테스트를 통해 코드 적용 범위를 측정하고 전체 적용 범위를 확보하기 위해 노력하는 것이 좋습니다. 종종 테스트에서 다루지 못하는 코드는 실제로 버릴 수있는 사용되지 않거나 죽은 코드임을 알 수 있습니다. 이는 코드 분기에 도달 할 수 있는지 확실하지 않은 복잡한 알고리즘에 특히 유용합니다.

면책 조항 : 저는 NDepend에서 일합니다.


6

또한 IOC 일명 Unity를 사용하면 이러한 평가가 잘못 될 수 있습니다. 내가 잘못했을 수도 있지만 Unity를 통해 인스턴스화되는 매우 중요한 몇 가지 클래스는 ReSharper가 알 수있는 한 인스턴스화가없는 것으로 보입니다. ReSharper 권장 사항을 따르면 호스를 사용할 수 있습니다!


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.