10

おそらく私は動的言語 (Netbeans での Ruby と Eclipse での Groovy) の経験によって制限されていますが、動的言語の性質上、リファクタリング (メソッド、クラスの名前変更、プッシュアップ、プルダウン、など)自動的に。

任意の動的言語 (任意の IDE/ツールを使用) で自動的にリファクタリングすることは可能ですか? 特に Ruby、Python、Groovy に興味があり、リファクタリングがすべての Java IDE で利用可能な 100% 自動リファクタリングとどのように比較されるかについてです。

4

5 に答える 5

16

自動リファクタリングが動的言語 (Smalltalk) で発明されたことを考えると、「はい」と言わざるを得ません。

特に、John Brant、Don Roberts、および Ralph Johnsonは、Squeak などのコア ツールの 1 つであるRefactoring Browserを開発しました。

今日の私の Google-fu は弱いですが、Don Roberts、John Brant、および Ralph Johnson 共著、「A Refactoring Tool for Smalltalk」、「Theory and Practice of Object Systems」、(3) 4、1997 という論文を見つけてみてください。

于 2010-02-23T12:10:13.633 に答える
13

Smalltalk は型を宣言しません。リファクタリング ブラウザは、1995 年以来、商用コードの正しいリファクタリングを成功裏に実行しており、現在のほぼすべての Smalltalk IDE に組み込まれています。- ドン・ロバーツ

于 2010-02-23T13:21:08.263 に答える
9

自動リファクタリングは、非常に動的な言語である Smalltalk で発明されました。それ以来、それは魅力のように機能します。

無料の Smalltalk バージョンを試すことができます (たとえば、http://pharo-project.org ) 。

動的言語では、リファクタリングを自分でスクリプト化するか、システムにクエリを実行することもできます。Test クラスの数を取得する簡単な例:

TestCase allSubclasses サイズ

于 2010-02-23T13:35:45.527 に答える
2

私も同じことを疑問に思いました。私はコンパイラー/インタープリターのライターではありませんが、完璧にするのは不可能だというのが答えになると思います。ただし、ほとんどの場合、正しく取得できます。

まず、「動的」言語という名前を「解釈された」言語に変更します。これは、Ruby や Javascript などで私が考えるものです。解釈される言語は、実行時の機能を利用する傾向があります。

たとえば、ほとんどのスクリプト言語では次のことが可能です。

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

文字列を「実行」しただけです。その文字列もリファクタリングする必要があります。また、a は変数になりますか、それとも変数 a がない場合、この言語では文字 a を引用符なしで出力できますか?

この種のコーディングはおそらく例外であり、ほぼ常に適切なリファクタリングが得られると信じたい. 残念ながら、スクリプト言語のライブラリを調べてみると、通常はそのような例外が発生し、アーキテクチャがそれらに基づいている可能性さえあるようです。

または、アンティを少し上げるには:

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


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

少なくとも Java をリファクタリングし、変数を int から string に変更すると、int を想定していたすべての場所でエラーが発生します。

String wasInt;
out = 3 + wasInt;

インタープリター言語では、実行時までこれが表示されない可能性があります。

于 2012-02-22T21:18:43.923 に答える
1

リファクタリング ブラウザのポイントも同様に... Smalltalk では非常に効果的です。ただし、型情報なしでは不可能な特定の種類のリファクタリングがあると思います (言語の明示的な型注釈によって取得するか、動的言語で何らかの形式の型推論を介して取得するかは関係ありません)。1 つの例: Smalltalk でメソッドの名前を変更すると、そのメソッドのすべての実装者と送信者の名前が変更されます。ほとんどの場合は問題ありませんが、望ましくない場合もあります。変数の型情報があれば、名前変更の範囲を現在のクラス階層の実装者と、その階層の型であると宣言された変数にメッセージが送信されているすべての送信者に限定できます (ただし、シナリオは想像できます)。型宣言があっても、

于 2010-02-24T21:02:49.270 に答える