2010-04-23 2 views
3

기본적으로 자바에서는 일회성 코드 생성, 대규모 리팩토링 등을 많이하고 있습니다.지능형 검색 및 Java 코드 생성, 선호하는 Python 사용?

내 도구 언어는 Python이지만 제공 할 수있는 솔루션을 선택하겠습니다. 여기


이 도구는 내가

search within my project: 
    for each Interface as iName: 
    write class(name=iName+"Impl", implements=iName) 
    search within the body of iName: 
     for each Method as mName: 
     write method(name=mName, body="// TODO implement this...") 

기본적으로 인터페이스에 대한 구현을 생성하는 의사

에, 원하는 무엇 그림 찾고 있어요 간체입니다 나를 위해 나를 허용 할 것이다 :

  • 파싱 파일은 자바 구조 ("인터페이스 검색") 언어 요소와 형태로 문맥 화 단어
  • 검색에 따른
  • ("형 SomeClass의 변수", "doStuff() 메소드 SomeClass 인스턴스에서 호출") (현재 결과의 본문 내에서)
  • 이 쉽게 대체하거나 코드를 생성 할 수 있습니다 (위와 같이 생성 할 수있는 헬퍼 또는 "Foo에 인터페이스 이름 바꾸기"와 같은 함수를 사용하여 검색을 실행). 라인 Blah.Blah() "등)

요점은, 나는이 것들을 쓰는 데 많은 시간을 보내고 싶지 않다는 점입니다. 보통 쓰레기입니다. 그러나 때로는 grep이 제공하는 것보다 조금 더 똑똑한 것을 필요로합니다. 이 단순한 버전을 작성하는 것은 그리 어렵지 않을 것입니다.하지만 이처럼 뭔가를 사용하려고한다면, 나는 그것을 강력하게 기대합니다.

이 작업을 수행하는 데 도움이되는 도구/라이브러리에 대한 제안 사항은 무엇입니까?


편집

  1. 파이썬은 확실히 필요하지 않습니다 몇 가지 설명을 추가 할 수 있습니다; 나는 그것이 무엇이든 취할 것입니다. 나는 선택의 여지가 있음을 암시한다.
  2. IDE 리팩토링과 함께 사용됩니다. 때때로 그것은 단지 내가 원하는 모든 것을하지 않습니다.
  3. (위와 같이) 코드 생성에 사용하는 경우 다른 코드 생성기의 출력을 높이기위한 것입니다. 예 : 우리가 사용하는 라이브러리는 1 톤의 인터페이스를 출력합니다. 우리는 코드베이스에 코드베이스를 메쉬하기 위해 각각의 표준 구현을 만들어야합니다.
+0

@Ipsquiggle : "대규모 리팩토링"을 필요로하는 코드베이스의 크기와 자동화가 어떻게 필요합니까? 나는 Bash + sed/awk 등을 사용하여 Java 소스 코드 (System.out을 적절한 로깅으로 대체)를 구현했습니다. 인터페이스와 관련하여 골격 구현 : 자체적으로 생성 한 IntelliJ IDEA 템플릿을 생성했습니다. 비공개 * "xxxImpl"* 빈/할일 뼈대. 고급 기능의 경우, IntelliJ IDEA가 부분적으로 열리고 "Open API"를 사용하여 모든 .java 파일의 AST에 액세스 할 수 있습니다. 나는 그것이 단순하지 않을까 우려한다. ( – SyntaxT3rr0r

+0

일부 인스턴스는 고도로 자동화되어 있으며 (위의 편집에서 포인트 3 참조) 다른 것들은 기본적으로 System.out을 대체하는 예제에 대한 변형이다.아무도 AST/토큰 화 된 코드로 작업하는 라이브러리 또는 DSL을 고수준으로 작성한 것이 조금 놀랍다. – Ipsquiggle

답변

2

먼저 자바 코드 리팩터링을 위해 특별히 설계된 Python에서 구현 된 도구 나 라이브러리는 알지 못합니다. Google 검색은 나에게 어떤 단서도주지 않았습니다.

둘째로, 나는 파이썬에서 자바를 리펙토링하기위한 훌륭한 도구 또는 라이브러리를 작성하는 것이 큰 작업이 될 것이라고 생각한다. 파이썬에서 Java 컴파일러 프론트 엔드 (lexer/parser, AST 빌더 및 유형 분석기)를 구현 한 다음이를 프로그램 편집기와 통합하는 방법을 찾아야합니다. 성숙한 대안이 이미 존재한다는 점을 감안하면 아무도이 일을하지 않았다는 사실에 놀라지 않습니다.

셋째, 소스 코드를 완전히 분석하지 않고 리팩토링을 수행하면 (예 : 패턴 매칭 사용) 복잡한 리팩토링을 수행 할 수 없으며 구현자가 생각하지 못했던 경우에 실수를 범하기 쉽습니다. 나는

감안할 때 ... 즉, 영업 이익은 현재 운영되는 레벨이다 기대 의기 소침 한 전망, 대안이 무엇인지 :

하나의 대안은 기존의 Java IDE를 중 하나 (예를 들어, 넷빈즈, 이클립스를 사용하는 것입니다 , IDEA 등)을 리팩토링 도구로 사용합니다. OP는 파이썬 코드로 그러한 도구의 기능을 확장 할 수는 없지만 실제로 그렇게 할 필요가 없을 가능성이 있습니다. 이 IDE 중 적어도 하나는 그가 필요로하는 것의 95 %를 차지할 것으로 기대합니다. (현실적이라면) 충분히 좋을 것입니다. 특히 IDE에 리팩토링을 쉽게하는 데 도움이되는 많은 부수적 인 기능이 있다고 생각할 때; 예 : 실행 취소/다시 실행, 증분 컴파일, 지능형 코드 완성, 지능형 검색, 유형 및 호출 계층 구조보기 등이 포함됩니다.

(기존 IDE가 충분하지 않은 경우 @WizardOfOdds - OP 만 호출 할 수 있습니다 !!) 다시 시작하는 것보다 기존 IDE의 리팩터링 기능을 확장하려고 시도하는 것이 좋습니다

실제로 그가하고있는 것에 따라 모델 기반 코드 생성이 또 다른 대안 일 수 있습니다. 예를 들어, 리팩토링이 객체 모델을 자주 만들고 재 작성하기 때문에 발생한다면, 대안은 모델링 언어로 모델을 코딩하고 그 모델에서 코드를 생성하는 것입니다. 이런 종류의 일을 할 때 필자가 선택한 도구는 Eclipse EMF 및 관련 기술입니다. EMF 기술에는 편집기 생성, XML 직렬화, 지속성, 쿼리, 모델 대 모델 변환 등이 포함됩니다. 필자는 EMF를 사용하여 복잡한 관계 및 유효성 검사 요구 사항이있는 50 - 100 개의 서로 다른 클래스로 구성된 개체 모델로 프로젝트를 구현하고 출시했습니다. 업데이트 된 모델에서 다시 생성 할 때 소스 코드 편집을 병합하는 EMF의 지원이 핵심 기능입니다.

+0

파이썬을 매우 부드러운 제약으로 생각해보십시오. 불가능하다면 그렇게 할 수 없습니다. 다른 답변들이 제안한 것처럼, IDE (Eclipse)의 리팩토링 도구가 내가 원하는 것을 보이지 않습니다. (사실이 도구의 가장 최근의 목표는 나쁘게 돌아간 리팩토링을 복구하는 것이 었습니다.) 또한, 모델 중심의 생성은 내 필요에 과도하다고 생각합니다. 이를 위해 내가 원한 많은 시나리오는 구체적으로 일회성입니다. – Ipsquiggle

+0

@Ipsquiggle - 현재 사용자의 요구를 직접 해결하는 도구가 존재하지 않는 것 같습니다. 그것에 대해 뭔가를하고 싶다면 IDE 중 하나의 리팩토링 구성 요소를 수정/향상하는 것이 좋습니다. –

+0

그럴 것 같습니다. 이클립스가 문맥 검색 *을 실제로 수행하는 것처럼 보이지만 사실 이후에 조작을위한 도구는 제공하지 않는다. 적어도 그것은 유망하다. – Ipsquiggle

0

Java로 코딩하는 경우 NetBeans IDE을 사용하는 것이 좋습니다. 그것은 이런 종류의 리팩토링 지원을 내장하고 있습니다. Eclipse도 이런 종류의 것을 지원합니다 (NetBeans를 선호하지만). 두 프로젝트 모두 오픈 소스이기 때문에이 리팩토링을 수행하는 방법을보고 싶다면 소스 코드를 살펴볼 수 있습니다.

+0

@Michael Aaron Safyan : "이런 종류의 리팩토링 지원 내장"*이라고하지만 OP의 질문처럼, "Impl"*을 모든 단일 클래스에 추가 할 수 있다는 것을 실제로 의미합니까? 이미 * Impl *로 끝나지 않은가요? 이클립스와 넷빈즈가 실제로 이것을 내장하고 있습니까? 나는 OP가 수십 개의 수업을 통해 수동으로 그렇게했다고 생각하지 않기 때문에. 나는 그가 수백 개의 KLOC 코드베이스를 가지고 있으며 완전히 자동화 된 방식으로이 작업을 수행하기를 원한다고 생각합니다. – SyntaxT3rr0r

+1

@WizardOfOdds - OP가 단일 작업에서 원하는 refactorings을 * 정확히 * 수행하지 않을 가능성이 있습니다. 그러나 하나 이상의 작업이 작업의 95 %를 수행하며 ... 대화식으로, 정확하게 실행 취소/다시 실행, 증분 재 컴파일 등을 통해 작업을 수행합니다. IDE에 대한 좋은 점이 누락 된 (말하자면) 5 %를 능가 할 가능성이 큽니다. –

+0

@Stephen C : 동의하지 않습니다 ... OP의 질문에서 "대규모 리팩토링"을 언급 한 내용에서 Impl로 끝나지 않는 모든 구체적인 클래스를 수동으로 찾는 * 그런 다음 IDE의 '리펙터 이름'을 * "작업의 95 %"로 호출하십시오. 우리의 견해는 아마 OP가하고 싶어하는 점에서 다르지만 필자는 프로그래밍 방식으로 200 개의 KLOC 코드베이스를 리팩터링했고 IntelliJ IDEA (나는 btw를 좋아한다)는 그런 수준의 자동화를 위해 단순히 잘라 버리지 않을 것이라고 말할 수있다. – SyntaxT3rr0r

0

자바는 요즘과 달리 도구 분야에서 비판의 공평한 분배를 가지고 있습니다.

우리는 선택의 여지가있다. Eclipse, Netbeans, Intellij는 큰 세 가지 IDE입니다.이들 모두는 우수한 수준의 검색과 리팩터링을 제공합니다. 이클립스는 내가 생각하는 넷빈에서 우위를 점하고 있으며, 인텔리는 종종 이클립스보다 앞선다.

FindBugs, CheckTyle 등의 정적 분석 도구를 사용하여 과도하게 긴 메서드와 클래스, 지나치게 복잡한 코드 등의 문제를 찾을 수있다.

파이썬 기술을 실제로 활용하려는 경우 - 자이 썬을 살펴보십시오. 자바로 작성된 파이썬 인터프리터.

+0

@Fortyrunner : IDEA의 리펙토링은 OP가 자동화 된 방식으로 원하는 것을 수행 할 수 있다는 것을 정말로 확신 할 수 없습니다. 그는 자신의 도구 ** 언어가 Python이라고 말했습니다. 왜냐하면 Python은 자바보다 Java가 훨씬 낫기 때문입니다. Python 기술을 "활용"하는 것이 아닙니다. 그는 Java 또는 Python에서 수행 할 수있는 프로그램을 작성하고 싶지 않습니다. 또는 원하는 것은 Java 소스 코드를 사용하는 것입니다. 나는 FindBugs가 그의 질문에 대해서도 상관없는 것을 보지 못했다. – SyntaxT3rr0r

+0

FindBugs는 리팩토링이 필요할 수있는 문제를 찾는 데 도움이됩니다. 그게 부분적으로 우리가 사용하는 것입니다. 모든 리팩토링이 자동화 된 방식으로 수행되거나 수행 될 수있는 것은 아닙니다. 이는 개발자와 디자이너로 추가 할 수있는 추가 비트입니다. 나는 툴링 중 일부를 배우는 것이 그가 생각하는 것보다 더 많은 도움이 될 것이라고 제안했습니다. – Fortyrunner