= Grapher =
洗練されたアプリケーションを書いたなら、GuiceのリッチなイントロスペクションAPIを使って、
詳細なオブジェクトグラフを記述することができる。
ビルトインのgrapher拡張がこのデータを簡単にビジュアル化してくれる。
複雑なアプリケーションの中の様々なバインディングや依存を統合されたダイアグラムで表示する。
== .dotファイルを作成する ==
Guiceのgrapherは、[[http://www.graphviz.org/|GraphViz]]の力を借りている。
オープンソースのグラフビジュアル化パッケージである。
これは、グラフの明細とビジュアル・レイアウトをクリアに分離する。
インジェクタの.dotファイルをグラフ化するには、次のコードを使えばいい。
{{{
import com.google.inject.Injector;
import com.google.inject.grapher.GrapherModule;
import com.google.inject.grapher.InjectorGrapher;
import com.google.inject.grapher.graphviz.GraphvizModule;
import com.google.inject.grapher.graphviz.GraphvizRenderer;
public class Grapher {
private void graph(String filename, Injector demoInjector) throws IOException {
PrintWriter out = new PrintWriter(new File(filename), "UTF-8");
Injector injector = Guice.createInjector(new GrapherModule(), new GraphvizModule());
GraphvizRenderer renderer = injector.getInstance(GraphvizRenderer.class);
renderer.setOut(out).setRankdir("TB");
injector.getInstance(InjectorGrapher.class)
.of(demoInjector)
.graph();
}
}
}}}
== .dotファイル ==
上のコードを実行すると、グラフ明細を表す.dotファイルが作成される。
ファイルのそれぞれのエントリはグラフ内のノードやエッジを表す。
次に.dotファイルのサンプルを示す。
{{{
digraph injector {
graph [rankdir=TB];
k_997fdab [shape=box, label=<
>,
style=dashed, margin=0.02,0]
k_119e4fd8 [shape=box, label=<>,
style=dashed, margin=0.02,0]
k_115c9d69 [shape=box, label=<>, style=dashed, margin=0.02,0]
i_115c9d69 [shape=box, label=<BackToTheFutureModule.java:42 #provideFluxCapacitor(EnergySource)
|
>, style=invis,
margin=0.02,0]
k_1c5031a6 [shape=box, label=<>,
style=invis, margin=0.02,0]
k_17b87c3a [shape=box, label=<>,
style=invis, margin=0.02,0]
k_9acc501 [shape=box, label=<>, style=dashed, margin=0.02,0]
k_dd456f9 [shape=box, label=<EnergySourceProvider
|
<init> |
>,
style=invis, margin=0.02,0]
k_997fdab -> k_1c5031a6 [arrowtail=none, style=dashed, arrowhead=onormal]
k_119e4fd8 -> k_17b87c3a [arrowtail=none, style=dashed, arrowhead=onormal]
k_115c9d69 -> i_115c9d69 [arrowtail=none, style=dashed, arrowhead=onormalonormal]
i_115c9d69:header:e -> k_9acc501 [arrowtail=none, style=solid, arrowhead=normal]
k_9acc501 -> k_dd456f9 [arrowtail=none, style=dashed, arrowhead=onormalonormal]
}
}}}
== .dotファイルをレンダリングする ==
使用するプラットフォーム向けの[[http://www.graphviz.org/|Graphvizのビューア]]をダウンロードし、
.dotファイルをレンダリングしよう。
レンダリングには数分かかるかもしれない。
レンダリングされたグラフをPDFやイメージにエクスポートすることで、共有が簡単になる。
{{attachment:Grapher_screenshot.png}}
Linux上では、コマンドラインのdotツールを.dotファイルからイメージに変換するのに使うことができる。
{{{
dot -T png my_injector.dot > my_injector.png
}}}
このツールは現在のところ、我々のフォントタグの扱いに問題があることがわかっている。
我々はこの問題を解消中である。
== グラフ表示 ==
エッジ:
* 実線エッジは実装からタイプへ、その依存を表す。
* 破線エッジはタイプからその実装へのバインディングを表す。
* 重複矢印はバインディングあるいは依存からプロバイダを表す。
ノード:
* 実装タイプは黒の背景で示される。
* 実装インスタンスは灰の背景で示される。
その他:
* インジェクションポイントがProviderを必要とするならば、GrapherはProviderを省略してFooへの依存のみを示す。
* grapherはインスタンスのtoString()メソッドを利用して、そのタイトルを表示する。ただし、オブジェクトのデフォルト実装をオーバーライドしている場合のみである。