2011-01-07 10 views
5

APIを定義する具体的なクラスのコレクションがあります。これらのクラスのインタフェースを抽出する必要があります(基本的に型階層とパブリックメソッド)。 APIの実際の実装例えばのでJavaクラスからインタフェースを抽出する自動化された方法

APIの公共のクラスの一つは、私が

public interface FooInterface extends BarInterface { 
    public void method(); 
    public void otherMethod() 
} 

public class Foo implements FooInterface { 
    /* etc etc */ 
} 

すなわちインタフェースと実装

に侵入したい

public class Foo extends Bar { 
    /* some fields which I don't care about */ 

    public void method() { 
    /* implementation here */ 
    } 

    public void otherMethod() { 
    /* implementation goes here */ 
    } 

    /* some non public methods which I don't care about */ 

} 

ある場合

この分離を自動化するために使用できるツールはありますか?仕事をするために自分のプログラムをロールバックしなければならないのでしょうか?最小の相互作用を必要とするツールである必要があります。私はあなたがこの仕事をするための独自のツールをロールバックする必要があります確信しているhttp://www.jetbrains.com/idea/features/refactoring.html#Extract_Interface

答えて

5

解決策が見つかりました!

Eclipseは、スクリプトのリファクタリングをサポートしていますが、スクリプトは人間ではありませんが、Eclipseはすべてのリファクタリングを実行するようにスクリプトを生成しています。

日食スクリプトリファクタリングの詳細について

look hereとスクリプトが、

+0

これは私が探していたものです(正確なシナリオがあります)!あなたが使ったリファクタリングスクリプトを共有することはできますか?私はこれを理解するためにEclipseでspelunkに行くつもりですが、私はどんな助けも使うことができます。前もって感謝します! – scorpiodawg

+0

うわー、 "スクリプト"で生成されたXMLは、(Eclipse Indigoのように)きれいではありません。もし私が何か役に立つものがあれば、それを報告します。 – scorpiodawg

3

多くのIDEは、あなたのためのリファクタリングを行い、「インターフェイスの抽出」コマンドを持っていますそれは多くの開発者が使用するものではなく、それを使用した人は頻繁に使用しません。 Extract Interfaceは、正しく実行されるためには、実際にそれを導くインテリジェンス(実際の種類)が必要です。全てのパブリック&プロテクト要素を盲目的に抽出し、実装階層をミラーリングするためのインターフェイス階層を盲目的に構築したツールは、賢明ではない。何を含めるべきか、何を導くべきかを決定するための(人工的な)知性を開発することは有用なツールになるだろうが、私は想像もできないほど難しいと私は告白する。現時点のIDEが提供するガイドアシスタンスは、おそらく最良の妥協です。元気づける;それは手間をかけずに行うよりもずっと面倒です!

+1

複数のファイルを一度に処理できますか?パッケージ内のすべてのクラスを選択し、Interface Extractionを実行しますか? – hhafez

+1

「純度」のためにこれをすべてのファイルに適用しているのであれば、あなたが実際に得ている利益を再考することをお勧めします。個人的には、それが理にかなっていてどこか他のものをそのまま残して、どこでインターフェイスを抽出しますか?しかし、私はあなたの推論を知らない。 – Synesso

+0

「純粋さ」のためではなく、すべてのクラスには当てはまりませんが、一つずつ行うのは面倒です。 – hhafez

1

;:IntelliJのような

+0

私は一般的に出力がきれいではないことに同意しますが、それは出発点であり、私はこの特定の状況で必要なものになります(私は屈折計にしたいAPIは実際には別のツールから自動生成されるので、よく定義されているので、リファクタリングツールはこの場合かなりスマートになる可能性があります) – hhafez

3

javapようJDKでツールを探すべきか知っているので、あなたのためのいくつかの例を生成するために日食使用し、あなたに何のほとんどを取得します欲しいです。しかし、いくつかのことを正しく処理できないように準備する - 申し訳ありませんが、私は何か、おそらく注釈、内部クラスなどを忘れてしまいます。

あなたの中に埋め込むてjavapは、Javaアプリは、あなたがこのような何か行うことができます役立つだろう所有している場合:

import sun.tools.javap.Main; 
... 
    void javap(String className) throws IOException 
    { 
     bos = new ByteArrayOutputStream(); 
     ourOut = new PrintStream(bos); 

     PrintStream oldOut = System.out; 
     System.setOut(ourOut); 

     String[] params = new String[] {"-public", className}; 
     Main.main(params); 

     System.setOut(oldOut); 

     String str = bos.toString(); 
    } 

これはクラスパスにSunのJDKのtools.jarのを必要とします。