2013-04-29 6 views
3

아래와 같은 대규모 리팩토링 프로젝트를 처리 할 수있는 훌륭한 Java 리팩토링 도구가 있습니까? 분명히 나는 ​​가능하다면 무료로 선호한다.복잡한 리팩토링

나는 레거시 프로젝트로 작업하고 있는데, 대부분은 자바 초기에 만들어졌다. 뭔가에

public interface IFrom { 
    public static final String COMMAND1 = "Command1"; 
    public static final String COMMAND2 = "Command2"; 
} 

public class From { 
    public void doSomething(String command) { 
    if (command.equals(IFrom.COMMAND1)) { 
     doSomething1(); 
    } else if (command.equals(IFrom.COMMAND2)) { 
     doSomething2(); 
    } 
    } 

    private void doSomething1() { 
    System.out.println("Something-1"); 
    } 

    private void doSomething2() { 
    System.out.println("Something-2"); 
    } 
} 

훨씬 더 관리 등입니다 : 같은 오래된 스타일의 명령 처리 패턴을 사용하는 클래스의 많은, 아마도 수백이 있습니다 난 단지입니다하지 않는 것이 추가 할 수 있습니다

interface DoSomething { 
    public void doSomething(); 
} 

enum ToCommands implements DoSomething { 
    Command1 { 
    @Override 
    public void doSomething() { 
     System.out.println("Something-1"); 
    } 
    }, 
    Command2 { 
    @Override 
    public void doSomething() { 
     System.out.println("Something-2"); 
    } 
    }; 
} 

public class To { 
    public void doSomething(String command) { 
    ToCommands.valueOf(command).doSomething(); 
    } 
} 

가 이 패턴을 따르는 수백 개의 클래스가 있지만 그 중 일부는 수백 개의 명령을 구현합니다.

답변

2

대규모 리팩터링은 일반적으로 클래식 리팩토링 작업의 구성으로 쉽게 표현되지 않는 코드 변경과 같은 사용자 지정 변환을 포함합니다. 그렇다면 대화 형 도구를 사용하여이 작업을 수행하는 것이 어렵습니다. 본질적으로 수백 가지 변경을 통해 마우스를 움직이면 은 반복 가능한 프로세스로 신뢰할 수 없습니다.

마지막으로 필요한 동작 체인을 파악하는 것은 어렵습니다. 당신은 이것을 손으로하고 그것을 잘못하고 싶지 않습니다. 생산 응용 프로그램을 시도하기 전에 기계적으로 변경 사항을 적용하고 여러 번의 시험을 통해 결과를 검증 할 수있는 능력이 필요합니다.

프로그래밍 가능한 리팩토링 도구를 사용하고 싶을 가능성이 가장 큽니다. 대규모 변경의 경우 아마도 program transformation tools의 사용을 고려하고 싶을 것입니다. 이러한 도구를 사용하면 패턴 지향 재 작성 규칙으로 프로그램 변환을 작성할 수 있습니다. 예를 들어 "이 코드 인 경우 코드"으로 바꿀 수 있습니다. 일반적으로 그러한 재 작성은 패턴 변수도 허용합니다. 이것은 문자열 대체가 아닙니다. 오히려 이들은 프로그램 구조 (예를 들어, 파스 트리)와 매칭되며,보다 정교한 시스템은 기호의 유형 및 정보가 어디서 오는지 (데이터 흐름)에 관한 정보를 포함 할 수있다. 프로그램 구조와 일치하고 심층 의미 분석을 사용할 수 있으므로 신뢰할 수있는 변경이 가능합니다. 프로그램 변환 도구는 지난 20 년 동안 코드 기반을 크게 변경하는 데 사용되었습니다. (일반적으로 복잡한 리팩토링 작업을 처리 할 수있는 특정 프로그램 변환 도구를보고 싶다면 my bio를 참조하십시오.)

"모델 기반"변환에 대해 듣게됩니다.대개 이것은 "코드를 UML 클래스 모델로 변환 한 다음 변형"을 의미합니다. 이 방법은 대개 코드 자체의 세부 사항을 잃어 버리게되므로 코드를 기반으로하는 프로그램 변환 방식이 대규모 변경시 훨씬 성공적입니다.

0

IntelliJ에는 추출 인터페이스/수퍼 클래스 등이 있습니다. 가장 많이 사용되는 제품군입니다. http://www.jetbrains.com/idea/features/refactoring.html에 더 많은 것을보십시오. 상업 라이센스를 사용하고 있지만 리팩토링은 커뮤니티 에디션의 일부이기도합니다.

0

이클립스 MoDisco 프로젝트는 리팩토링을 목표로 (리팩토링에 대한 프로그램을 작성하는 경우, 당신은 eclipse JDT 도구를 시작할 수 있었다. 나는 대규모을 사용하지 않음). Java 프로젝트를 EMF 모델 인스턴스로 변환하는 데 도움이됩니다. 그런 다음 이러한 모델을 조작 할 수 있습니다 (예 : 언급 한 리팩토링 적용). 또한 그 작업을 도와 줄 도구가 있습니다 (예 : ATL). 그런 다음 코드 생성기 (Xpand, Acceleo, JET)를 사용하여 EMF 모델 인스턴스를 다시 Java 소스로 변환 할 수 있습니다.

모든 노력을 기울여야합니다. 그러나 내 경험이 간절히 바빠 질 수 있다면 이클립스 포럼에서 빠른 지원을받을 수 있습니다.

0

인 IntelliJ 및 JetBrains의 생산 다른 유사한 리팩토링 도구 (예를 들어, 비주얼 스튜디오에 ReSharper에서 플러그인) 변화의 이런 종류의 매우 유용 할 수 있습니다 Structural Search And Replace라는 다소 작은 알려진하지만 매우 강력한 기능이 있습니다. 기본적으로 다음과 같이 말할 수 있습니다. "이처럼 구조화 된 코드를 볼 때마다 그 코드를 변경하면됩니다." 이는 실제로 프로그램 구조와 구문 분석 트리를보고 검색 및 대체를 수행한다는 점에서 텍스트 검색 및 바꾸기와 다릅니다. 이러한 변환 목록을 유지하고 원하는대로 호출 할 수 있습니다. 나는 오래된 코드를 변형 할 때 매우 유용하다는 것을 알았다.