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

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



답변

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


답변

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

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

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

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


답변

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


답변

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에서 일합니다.


답변

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


답변

ReSharper 는 사용하지 않는 코드를 찾는 데 큰 도움이됩니다.

VS IDE에서는 정의를 마우스 오른쪽 단추로 클릭하고 ‘모든 참조 찾기’를 선택할 수 있지만 솔루션 수준에서만 작동합니다.


답변

진실은 도구가 당신에게 100 % 특정 답변을 줄 수는 없지만 적용 범위 도구는 돈을 꽤 잘 운영 할 수 있다는 것입니다.

포괄적 인 단위 테스트 스위트로 계산할 경우 테스트 범위 도구를 사용하여 테스트 실행 중에 실행되지 않은 코드 줄을 정확하게 확인할 수 있습니다. 코드를 수동으로 분석해야합니다. 죽은 코드로 간주되는 것을 제거하거나 테스트 범위를 향상시키기 위해 테스트를 작성하십시오.

이러한 툴 중 하나는 NCover 이며, Sourceforge 에 오픈 소스 전구체가 있습니다. 다른 대안은 PartCover 입니다.

stackoverflow 에서이 답변 을 확인하십시오 .