GraphVizを使用してクラス内の関係を視覚化する

R. Martinの著書「Clean Code」を読んだ後、私は古い、大きくて汚いプロジェクトをリファクタリングすることに決めました。



そして、最も単純なクラスの1つでメソッドとフィールドがどのように相互接続されているかを確認したかったのです。 PhpCallGraphは 、すぐにグーグルで修正できませんでした(xdebugの問題)。さらに、例から判断すると、プロジェクト全体の接続を表示し、トレースして、1つのクラスを調べる必要がありました。



私は独自のソリューションを作成することにしました。これが何が起こったかです。



実験用のコードをダウンロードするには、 GraphVizが必要です。



使い方はとても簡単です。

まず、ドラフトマンクラス自体を分析しましょう。

require "Class2GV.php"; $c2g = new Class2GV("C:\\Program Files\\GraphViz 2.28\\bin"); //,     $c2g->showVariables(true); //-   ,      $svg = $c2g->convert("Class2GV.php", "dot"); //   dot,    header("Content-type: image/svg+xml"); readfile($svg);
      
      







Class2GV.png




緑の長方形はパブリックメソッド、黄色の菱形は保護されています(ここにはありません)、赤い楕円はプライベート、青い長方形は説明されていません(継承または動的に呼び出され、ここにもありません)。 灰色の長方形は変数です。

変数の使用は、常に1つの矢印、メソッド呼び出し(その数に応じて)で表示されます。



かなり論理的なクラス構造ですが、かなり複雑です。 ちなみに、ドットを使用する場合(階層的にグラフを描画しようとする場合)、より多くの「正しい」クラスが適切に見えます。



しかし、よく見ると、右側に(組み込みのget_all_tokens()



関数を使用して)PHPファイルの解析に関連するかなり関連した領域があり、別のクラスで選択できることがget_all_tokens()



ます。 これは、変数のないグラフで特に顕著です。

Class2GV_wv.png




私はあまり最適化しませんでしたが、クラスが成長し始めたら、それをしなければなりません。



クラスの例をいくつか示します。




All Articles