动态语言中是否可以自动重构?

时间:2010-02-23 11:14:22

标签: refactoring dynamic-languages

也许我受限于我在动态语言方面的经验(Ruby on Netbeans和Groovy on Eclipse),但在我看来,动态语言的本质使得无法重构(重命名方法,类,推升,拉动) -down等)自动。

是否有可能以任何动态语言(使用任何IDE /工具)重构AUTOMATICALLY?我对Ruby,Python和Groovy特别感兴趣,以及重构与100%自动重构的比较可在所有Java IDE中使用。

5 个答案:

答案 0 :(得分:16)

鉴于自动重构是用动态语言(Smalltalk)发明的,我不得不说“是”。

特别是,John Brant,Don Roberts和Ralph Johnson开发了Refactoring Browser,这是Squeak的核心工具之一。

我的Google-fu今天很弱,但你可以尝试找到这篇论文:Don Roberts,John Brant和Ralph Johnson,Smalltalk的重构工具,“对象系统的理论与实践”,(3)4, 1997年。

答案 1 :(得分:13)

Smalltalk没有声明任何类型。自1995年以来,重构浏览器已经成功地在商业代码中执行了正确的重构,并且几乎包含在所有当前的Smalltalk IDE中。 - 唐·罗伯茨

答案 2 :(得分:9)

自动重构是在Smalltalk中发明的,这是一种高度动态的语言。 从那时起它就像一种魅力。

您可以尝试使用免费的Smalltalk版本(例如http://pharo-project.org

在动态语言中,您也可以自己编写脚本重构或查询 系统。获取测试类数量的简单示例:

TestCase allSubclasses size

答案 3 :(得分:2)

我想知道同样的事情。我不是编译器/翻译作家,但我认为答案是不可能完美。但是,在大多数情况下,您可以正确使用它。

首先,我要将“动态”语言改为“解释”语言,这是我对Ruby,Javascript等的看法。解释语言倾向于利用运行时功能。

例如,大多数脚本语言允许以下

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

我只是“跑”了一根绳子!您还必须重构该字符串。如果没有变量a,这个语言是否允许你在没有引号的情况下打印字符?

我想相信这种编码可能是例外,几乎所有时间你都会得到很好的重构。不幸的是,当我查看脚本语言的库时,它们通常会遇到这样的异常,甚至可能将它们的架构基于它们。

或稍微提高赌注:

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


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

至少在重构Java并将变量从int更改为string时,在所有期望int的地方都会出现错误:

String wasInt;
out = 3 + wasInt;

使用解释型语言,您可能直到运行时才会看到这种情况。

答案 4 :(得分:1)

同样关于重构浏览器的观点...它在Smalltalk中非常有效。但是,我想有一些类型的重构在没有类型信息的情况下是不可能的(无论是通过语言中的显式类型注释获得还是通过动态语言中的某种形式的类型推理都无关紧要)。一个例子:当在Smalltalk中重命名方法时,它将重命名该方法的所有实现者和发送者,这通常很好,但有时是不合需要的。如果您有关于变量的类型信息,则可以将重命名范围仅限于当前类层次结构中的实现者以及将消息发送到声明为该层次结构中的类型的变量时的所有发送者(但是,我可以想象场景即使使用类型声明,也会分解并产生不良结果。)