2010-02-23 4 views
10

아마도 동적 언어 (Ruby on Netbeans 및 Eclipse의 Groovy)에 대한 내 경험으로 인해 제한을 받았지만 동적 언어의 특성으로 인해 리팩터링이 불가능 해졌습니다 (메서드, 클래스 이름 변경, 푸시 - 업, 다운 등).동적 언어에서 자동 리팩터링이 가능합니까?

모든 동적 언어 (모든 IDE/도구 사용)에서 자동으로 리팩터링 할 수 있습니까? 저는 Ruby, Python, Groovy에 특히 관심이 있습니다. 그리고 리팩토링이 모든 Java IDE에서 사용할 수있는 100 % 자동 리팩터링과 어떻게 비교되는지 알아보십시오.

답변

16

자동 리팩터링이 이 동적 언어 (스몰 토크)로을 발명했다고 가정하면, 나는 "예"라고 대답해야 할 것입니다.

특히 John Brant, Don Roberts 및 Ralph Johnson은 Squeak의 핵심 도구 중 하나 인 Refactoring Browser을 개발했습니다.

오늘 내 Google-fu는 약하지만 Don Roberts, John Brant 및 Ralph Johnson, Smalltalk 용 리팩토링 도구, "객체 시스템의 이론과 실습", (3) 4 , 1997.

+0

이 역사적인 쪽지는 멋지다. (말장난을 용서해라.) 나는 그것이 가능한지 알아 내려고하지 않고있다. 루비에서도 우리는 "자동 리팩터링"을 가지고 있지만 실제로는 작동하지 않습니다. Netbeans에는 경고조차 있지만 실제는 꽤 황량합니다. 또한 스몰 토크에서 모든 유형을 선언하면 리팩토링에 도움이 될지 여부는 알 수 없습니다. 루비에서는 그렇게하지 못합니다. 그렇게하는 것이 어려운 일 중 하나입니다. –

+2

죄송합니다. 역사적인 쪽지 만주는 것이 아닙니다. 저는 리팩토링 브라우저가 많은 스몰 토크 IDE에서 표준 도구라고 제안하고자했습니다. –

13

스몰 토크는 어떤 유형도 선언하지 않습니다. 리팩토링 브라우저는 1995 년 이래 상용 코드에서 올바른 리팩토링을 성공적으로 수행했으며 거의 ​​모든 최신 스몰 토크 IDE에 통합되었습니다. - Don Roberts

+2

감사합니다 돈, 이제는 스몰 토크에서 일하는 것이 필요합니다. 유형을 선언하지 않고 리팩터링을 수행하는 방법 (내 무지를 용서)? 그 덕분에 –

9

자동 리팩터링은 매우 동적 인 스몰 토크에서 고안되었습니다. 그리고 그 이후로 매력처럼 작동합니다.

당신은 당신이 할 수 또한 스크립트 리팩토링에게 동적 언어에서 (예를 http://pharo-project.org에 대한) 무료 스몰 토크 버전

에서 자신을 자신을 시도하거나 시스템을 조회 할 수 있습니다. 간단한 예는 테스트 클래스의 수를 얻을 :

TestCase에 allSubclasses 크기가 리팩토링 브라우저에 대한 포인트 동감

1

를 ... 그것은 스몰 토크에 매우 효과적입니다. 그러나 유형 정보가 없으면 불가능할 특정 유형의 리팩토링이 있다고 상상합니다 (언어의 명시 적 형식 주석 또는 동적 언어의 형식 추론 형식을 통해 얻을 수 있는지 여부는 관련 없음). 한 가지 예 : 스몰 토크에서 메소드의 이름을 바꿀 때, 메소드의 모든 구현 자와 전송 자의 이름을 바꿉니다.이 메소드는 대개 잘되지만 종종 바람직하지 않습니다. 변수에 대한 정보를 입력했다면 그 계층 구조의 유형으로 선언 된 변수에 메시지를 보낼 때 현재 클래스 계층 구조의 구현 자와 모든 보낸 사람의 이름을 바꿀 수 있습니다 (단, 시나리오 타입 선언이있는 곳에서도 분해되고 바람직하지 않은 결과가 발생합니다).

+0

. 이것은 "해당 메소드의 모든 구현 자 및 전송자의 이름을 바꿉니다"라는 것을 의미합니까? 메소드가 전역 적으로 범위가 지정 되었습니까 (아니면 이와 비슷한 것입니까?)? –

+0

또한 스몰 토크의 날인가요? 나는이 질문이 왜 작은 길로 갔는지 결코 이해할 수 없을 것이다. 어딘가에서 링크를 보았습니까? Python, Ruby 및 Groovy에 대해 더 자세히 설명하고 있지만 ST는 분명히 하나의 경우로서 유효합니다. –

+0

@yar : 물론 메소드의 범위는 전역 적입니다. 파이썬과 Ruby에서 동일해야하지만, 메소드가 매개 변수를 사용하고 매개 변수의 메소드에 메시지를 보내거나 호출하는 경우 해당 메소드를 구현하는 모든 클래스에서 작동하므로 하나의 호출 사이트의 이름을 바꾸면됩니다. 모든 호출 사이트 및 구현의 이름을 바꿉니다. 프로그램을 실행할 때 이름의 하위 집합이 여전히 작동한다는 것을 알 수 있습니다. – quamrana

2

나는 똑같은 것을 궁금해했다. 나는 컴파일러/통역 작가가 아니지만, 그 답은 완벽 해지는 것이 불가능하다고 생각합니다. 그러나 대부분의 경우이 값을 올바르게 사용할 수 있습니다.

먼저 "동적"언어를 "해석 된"언어로 변경하겠다. Ruby, Javascript 등으로 생각한다. 해석 된 언어는 런타임 기능을 활용하는 경향이있다.

예를 들어

, 대부분의 스크립트 언어는 그냥 문자열을 "실행"다음

-- pseudo-code but you get the idea 
eval("echo(a)"); 

을 허용! 그 문자열도 리팩토링해야합니다. 변수가 없으면이 따옴표없이 문자를 인쇄 할 수 있습니까?

나는 이런 종류의 코딩이 아마도 예외이며, 거의 모든 시간에 훌륭한 리펙토링을 얻을 것이라고 믿고 싶다. 불행하게도 스크립팅 언어로 라이브러리를 살펴볼 때 일반적으로 이러한 예외가 발생하고 아키텍처를 기반으로한다고 생각됩니다.

또는 출자금 최대 비트

:

def functionThatAssumesInputWillCreateX(input) 
    eval(input) 
    echo(x) 


def functionWithUnknownParms(...) 
    eval(argv[1]); 

자바를 리팩토링하고, 문자열 INT에서 변수를 변경할 때 적어도, 당신은 여전히 ​​INT 기대했던 모든 장소의 오류를 얻을 :

String wasInt; 
out = 3 + wasInt; 

인터 프리트 된 언어를 사용하면 런타임까지 이것을 볼 수 없을 것입니다.

관련 문제