2014-11-03 4 views
2

의존 코드베이스에 자동으로 적용 할 수있는 방식으로 Java 리팩터링을 기록하거나 설명하는 방법이 있습니까?사실 후 종속 코드의 자동 리팩토링

우리 회사는 플랫폼에 따라 플랫폼과 추가 기능이라는 두 개의 별도 Java 코드 기반으로 작동합니다. 플랫폼과 애드온은 서로 다른 릴리스 주기로 작업하는 여러 팀이 개발합니다. 플랫폼이 출시 된 후 추가 기능이 업데이트됩니다. 플랫폼 팀은 추가 기능 코드를 보지 않기 때문에 플랫폼에 적용된 리팩토링은 자동으로 추가 기능에 적용되지 않습니다. 부가 기능 팀은 이전에 릴리스 된 플랫폼 코드를 읽기 전용 모드로 사용하며 현재 플랫폼 리팩토링을 수동으로 다시 적용해야합니다 (예 : 클래스 및 메소드 이름 변경).

추가 기능 팀이 플랫폼 업데이트 후 컴파일 오류에서 컴파일 오류로 이동하지 않아도 자동으로 추가 기능에 플랫폼 리팩터링을 적용 할 수 있는지 궁금합니다.

현재 이클립스는 두 팀 모두 IDE로 사용되지만 IntelliJ Idea로 사용법이 옮겨 가고 있습니다.

+0

팀간에 코드를 어떻게 공유하고 있습니까? – andy

+0

Eclipse에서 기능에 대한 설명서를 살펴보십시오. Refactor -> Create Script, Refactor -> Apply Script –

+0

@andy 우리는 별도의 소스 저장소가 있습니다. 애드온은 컴파일 된 플랫폼 jar 파일을 사용하여 빌드됩니다. 일부 애드온 개발자는 때때로 플랫폼 변경 사항을 테스트하고 제안하기 위해 플랫폼 및 애드온을 IDE 작업 공간에 포함시킵니다. 그러나 플랫폼 개발자는 IDE 작업 공간에 애드온 소스를 포함시키지 않습니다. –

답변

0

예, 있습니다. 원하는 것은 Program Transformation System (PTS)입니다.

좋은 PTS는 "metaprogram"의 일종으로 소스 코드에 명시적인 변환을 정의 할 수 있습니다. "metaprogram"은 실행하면 원하는 효과를냅니다. 예를 들어, 당신은 모든 데이터베이스의 상호 작용에 로깅 호출을 삽입 (참조, 생체 내 시스템) 변환을 다음 DMS를 사용할 수 있습니다 : 당신이주의 깊게 같은 metaprogram을 정의하면

default domain Java~v7; 

    rule insert_db_log_call(i: identifier, m: modifiers, b: body, p: parameters): method->method = 
    " \m \i(\p) { \b } " -> " \m \i(\p) { log(\tostring\(\i\)); { \b } } " 
    if is_db_method_call(i). 

, 그것은 처음에 제대로 작동 코드베이스의 경우, 두 번째베이스에서 동일한 효과를 가져야합니다. 실제로하고 싶은 것을 표현하는 데 약간의 노력이 필요할 수 있습니다. 모든 "리팩토링"이 "a에서 b로 이름 바꾸기"로 쉽게 기술되는 것은 아닙니다.

주어진 예제는 매우 간단합니다. 매우 복잡한 효과를 얻기 위해 훨씬 더 복잡한 메타 프로그램을 작성할 수 있습니다.