Java 프로젝트에서 사용되지 않는 코드 / 죽은 코드를 찾는 방법


대형 자바 프로젝트에서 사용되지 않는 코드 / 죽은 코드를 찾으려면 어떤 툴을 사용합니까? 우리 제품은 몇 년 동안 개발되어 왔으며 더 이상 사용되지 않는 코드를 수동으로 감지하는 것이 매우 어려워졌습니다. 그러나 우리는 사용하지 않는 코드를 최대한 삭제하려고 노력합니다.

일반적인 전략 / 기법 (특정 도구 제외)에 대한 제안도 환영합니다.

편집 : 코드 커버리지 도구 (Clover, IntelliJ)를 이미 사용하고 있지만 이것들은 거의 도움이되지 않습니다. 데드 코드는 여전히 단위 테스트를 가지고 있으며 다루는대로 표시됩니다. 이상적인 도구는 코드에 따라 다른 코드가 거의없는 코드 클러스터를 식별하여 수동 검사를 문서화 할 수 있습니다.


Answers



실행중인 시스템에 코드 사용 로그를 기록한 다음 몇 달 또는 몇 년 동안 사용되지 않는 코드를 검사하기 시작합니다.

예를 들어, 사용하지 않는 클래스에 관심이있는 경우 모든 클래스가 인스턴스 생성시 기록되도록 계측 될 수 있습니다. 그런 다음 작은 스크립트가 이러한 로그를 전체 클래스 목록과 비교하여 사용되지 않는 클래스를 찾을 수 있습니다.

물론, 메서드 수준으로 가면 성능을 염두에 두어야합니다. 예를 들어, 메소드는 처음 사용 만 기록 할 수 있습니다. Java에서이 작업이 가장 좋은 방법을 모릅니다. 스몰 토크 (Smalltalk)에서이 작업을 수행했습니다. 스몰 토크는 동적 언어이므로 런타임에 코드를 수정할 수 있습니다. 로깅 호출로 모든 메소드를 인스트루먼트하고 메소드가 처음으로 로깅 된 후 로깅 코드를 제거하므로 시간이 지나면 성능상의 불이익이 발생하지 않습니다. 어쩌면 Java에서 정적 부울 플래그를 사용하여 유사한 작업을 수행 할 수 있습니다.




합리적으로 잘 작동하는 Eclipse 플러그인은 Unused Code Detector 입니다.

그것은 전체 프로젝트 또는 특정 파일을 처리하고 다양한 미사용 / 데드 코드 (dead code) 방법을 보여줄뿐 아니라 가시성 변경 (예 : 보호되거나 비공개가 될 수있는 공개 방법)을 제안합니다.




CodePro 는 최근 Eclipse 프로젝트와 함께 Google에서 출시했습니다. 그것은 무료이며 매우 효과적입니다. 플러그인에는 하나 또는 다수의 엔트리 포인트가있는 ' Find Dead Code '기능이 있습니다. 꽤 잘 작동합니다.




하나의 클래스에서 이클립스에서하는 것으로 알려진 한 가지 점은 모든 메소드를 비공개로 변경 한 다음 내가받는 불만 사항을 확인하는 것입니다. 사용되는 메소드의 경우 오류가 발생하여 최대한 낮은 액세스 수준으로 되돌립니다. 사용되지 않는 메소드의 경우, 사용되지 않는 메소드에 대한 경고가 표시되고, 메소드를 삭제할 수 있습니다. 그리고 보너스로, 당신은 종종 개인적으로 할 수 있고해야만하는 공개 방법을 발견합니다.

그러나 그것은 매우 수동적입니다.




나는 ProGuard 가 여기서 언급되지 않았다는 것에 놀라움을 금치 못했다. 이 제품은 가장 성숙한 제품 중 하나입니다.

ProGuard 는 무료 자바 클래스 파일 축소 기, 옵티 마이저, obfuscator 및 사전 검증 도구입니다. 사용되지 않는 클래스, 필드, 메소드 및 속성을 감지하고 제거합니다. 바이트 코드를 최적화하고 사용되지 않는 명령어를 제거합니다. 짧은 의미없는 이름을 사용하여 나머지 클래스, 필드 및 메서드의 이름을 바꿉니다. 마지막으로, Java 6 또는 Java Micro Edition 용 처리 코드를 사전 검증합니다.

ProGuard의 일부 용도는 다음과 같습니다.

  • 더 작은 코드 보관소, 더 작은 전송률의 네트워크, 더 빠른 로딩 및 더 작은 메모리 풋 프린트를위한보다 작은 코드 생성.
  • 프로그램과 라이브러리를 리버스 엔지니어링하는 것을 어렵게 만듭니다.
  • 데드 코드를 나열하여 소스 코드에서 제거 할 수 있습니다.
  • 빠른 클래스 로딩을 최대한 활용하기 위해 Java 6 이상의 기존 클래스 파일을 대상 지정 및 사전 검증합니다.



테스트 커버리지 도구를 사용하여 코드베이스를 계측 한 다음 테스트가 아닌 응용 프로그램 자체를 실행하십시오.

EmmaEclemma 는 주어진 코드 실행에 대해 어떤 클래스가 실행되는지에 대한 좋은 보고서를 제공 할 것입니다.




리팩터링을위한 코드베이스의 타겟이 풍부한 환경에서 펑크를 식별하는 데 도움이되는 버그 찾기 를 사용하기 시작했습니다. 또한 구조 101 에서 코드베이스의 아키텍처에서 너무 복잡하기 때문에 실제 늪이 어디에 있는지 알 수 있다고 생각합니다.




이론 상으로는 결정적으로 사용되지 않는 코드를 찾을 수 없습니다. Theres 수학적 증거 이것 (글쎄,이 더 일반적인 정리의 특별한 경우)입니다. 호기심이 있다면, 정지 문제를 찾아보십시오.

이것은 자바 코드로 여러모로 나타날 수 있습니다 :

  • 사용자 입력, 설정 파일, 데이터베이스 항목 등을 기반으로 클래스로드
  • 외부 코드로드 중.
  • 타사 라이브러리에 객체 트리 전달
  • 기타

즉, IDEA IntelliJ를 선택 IDE로 사용하고 모듈, 사용되지 않는 메소드, 사용되지 않은 멤버, 사용되지 않는 클래스 등의 findign 종속성을위한 광범위한 분석 도구를 사용합니다. 너무 지능적인 방법은 호출되지 않는 개인 메소드와 같습니다. 사용되지 않은 태그가 있지만 공개 방법은보다 광범위한 분석이 필요합니다.




Structure101 슬라이스 퍼스펙티브 는 "메인"클러스터와의 종속 관계가없는 클래스 나 패키지의 "orphans"또는 "orphan 그룹 "의 목록 (및 종속성 그래프)을 제공합니다.




IntelliJ에는 사용되지 않는 코드를 탐지하는 코드 분석 도구가 있습니다. 가능한 한 많은 필드 / 메소드 / 클래스를 비공개로 만들어야하며, 사용되지 않는 메소드 / 필드 / 클래스가 더 많이 표시됩니다.

또한 코드 볼륨을 줄이는 방법으로 중복 코드를 찾으려고합니다.

내 마지막 제안은 오픈 소스 코드를 찾아서 사용하면 코드를 더 간단하게 만들려고합니다.




Eclipse에서 [Windows]> [환경 설정]> [Java]> [컴파일러]> [오류 / 경고]
그들 모두를 오류로 바꾼다. 모든 오류를 수정하십시오. 이것은 가장 간단한 방법입니다. 이 기능을 사용하면 코드 작성시 코드를 정리할 수 있습니다.

스크린 샷 Eclipse 코드 :




코드를 프로파일 링하고 코드 적용 데이터를 제공하는 도구가 있습니다. 이를 통해 코드가 얼마나 많이 호출되는지 볼 수 있습니다. 당신은 얼마나 많은 고아 코드를 발견 할 수있는 도구를 얻을 수 있습니다.







EMMA와 같은 사용자 서비스 제공 도구. 하지만 그것은 정적 도구가 아닙니다 (즉, 회귀 테스트를 통해 실제로 응용 프로그램을 실행해야합니다. 가능한 모든 오류 사례를 통과해야합니다.)

그래도 EMMA는 매우 유용합니다.




Emma, ​​Cobertura 및 Clover와 같은 코드 커버리지 도구는 코드를 구성하고 테스트 스위트를 실행하여 코드의 어느 부분이 호출되는지 기록합니다. 이는 매우 유용하며 개발 프로세스의 필수 요소입니다. 테스트 스위트가 코드를 얼마나 잘 처리하는지 파악하는 데 도움이 될 것입니다.

그러나 이것은 실제 죽은 코드를 식별하는 것과 동일하지 않습니다. 테스트에 의해 커버 된 (또는 커버되지 않는) 코드만을 식별합니다. 이렇게하면 실제 시나리오에서 실제로 사용되지 않는 코드에 대한 테스트에 액세스하는 경우 거짓 긍정 (테스트에서 모든 시나리오를 포괄하지 못하는 경우) 및 위음성 (false negative)이 발생할 수 있습니다.

죽은 코드를 확인하는 가장 좋은 방법은 실제 실행 환경에서 코드를 도구로 사용하고 장시간 동안 코드 범위를 분석하는 것입니다.

로드 균형 조정 된 중복 환경에서 러닝하는 경우 (그렇지 않은 경우), 응용 프로그램의 인스턴스 하나만 계측하고 부하 분산 장치를 구성하여 임의의 작은 부분을 사용자가 계측 된 인스턴스에서 실행됩니다. 오랜 기간에 걸쳐 이러한 작업을 수행하는 경우 (계절별 변화와 같은 실제 사용 시나리오를 모두 포함했는지 확인하기 위해) 코드의 실제 영역에서 액세스되는 영역과 액세스 할 수있는 부분을 정확하게 볼 수 있어야합니다 실제로는 절대 액세스되지 않으므로 죽은 코드입니다.

필자는 개인적으로 이런 일을 본적이 없으며 테스트 도구를 통해 호출되지 않는 코드를 도구로 사용하고 분석하는 데 앞서 언급 한 도구를 어떻게 사용할 수 있는지 알지 못합니다.




  • FindBugs는 이런 종류의 일에 탁월합니다.
  • PMD (Project Mess Detector)는 사용할 수있는 또 다른 도구입니다.

그러나 둘 다 작업 공간에서 사용되지 않는 공용 정적 메서드 를 찾을 수 없습니다. 그런 도구를 아는 사람이라면 알려 주시기 바랍니다.







Eclipse는 도달 할 수없는 코드를 보여 주거나 강조 표시 할 수 있습니다. JUnit은 코드 커버리지를 보여줄 수 있지만 테스트가 필요하며 관련 테스트가 누락되었거나 코드가 실제로 사용되지 않는지를 결정해야합니다.




악기 코드와 사용 된 코드가 강조 표시되어 사용되지 않는 클로버 적용 도구를 찾았습니다. Google CodePro 애널리틱스와 달리 웹 애플리케이션에서도 작동합니다 (내 경험에 따라 Google CodePro에 대해 올바르지 않을 수 있음).

유일한 단점은 Java 인터페이스를 고려하지 않는다는 것입니다.




Java 프로젝트 - Dead Code Detector (DCD)가 있습니다. 소스 코드의 경우 잘 작동하지 않지만 .jar 파일의 경우에는 정말 좋습니다. 또한 클래스별로 필터링 할 수도 있습니다.




Doxygen을 사용하여 결코 호출되지 않는 메소드를 찾기 위해 메소드 호출 맵을 개발합니다. 그래프에는 호출자가없는 메소드 클러스터의 섬이 있습니다. 라이브러리의 경우 기본 입력 지점부터 항상 시작해야하기 때문에이 기능은 작동하지 않습니다.