私はリファクタリングして、似たような見た目のひどい Java クラスをたくさん維持しなければなりません。多くは次の実装パターンを持っています
class Machine {
public int advance(int state) {
switch(state) {
case 7: return step_7();
case 13: return step_13();
case 4: return step_4();
}
}
private int step_7() {
if(something) return 13; else return 4;
}
private int step_13() {
...
return 4;
}
private int step_4() {
if(miep) return 7;
...
return 13;
}
}
そして、これからグラフを生成したいと思います(Graphvizとを使用dot
)-「静的呼び出しグラフ」のようなものですが、正確ではありません。
Perl や Python を使って自分で Java コードを解析する以外に、これを自動的に行う方法を考えています。
私が本当にしたいのは、Abstract Syntax Tree (AST) か、ナビゲートできるクラスに似たものを用意し、その間にdot
-code を出力することです。
- ここでトラバース可能な AST を生成するにはどうすればよいですか? その場合、トラバースはJavaで行われると思いますが、出力がテキスト表現であれば問題ありません(
gprof
ここで思い浮かびます)。 - ASTを使用しない他のアプローチはありますか? 多分私は目が見えないだけで、より良い、より簡単な方法があります。