Graphvizを使用してフローチャートを作成する

Oracleデータベースを開発およびサポートするソフトウェアを作成します。静的PL / SQLパーサーは、アプリケーションの主要な機能の1つです。 Oracleに精通している人ならだれでも、PL / SQLについてよく知っています。



よく知られていることわざには、「100回聞くよりも1回見る方が良い」とあります。 そのため、フローチャートと呼び出し図(呼び出しツリー)の形式でコードを視覚化するような方法で静的アナライザーを埋め込むことにしました。 ブロックとその接続を描くことは難しくありませんが、「シート」上の位置を最適化することは、かなりの努力を必要とするタスクのように思えました。 矢印がブロックの周りを最小限に交差して流れるようにするには、ブロックがグループに結合され、ダイアグラムが混乱にならず、多くの労力と時間がかかりました。



そして、車輪を再発明しないように、既成のソリューションを探すことにしました。 オープンソースのチャート視覚化ソリューションであるGraphvizは、すぐに注目を集めました。 最初のバージョンはAT&Tによって開発され、現在ではユーティリティとライブラリのセットとして、またEclipse Public License(EPL)の下のソースコードで利用可能です。



チャートエンジンはDOTグラフ記述言語を使用します。これは、視覚的なデザインの頂点、それらの関係、グループ、属性など、グラフ構造のテキスト記述です。



最も単純なグラフの説明:



digraph graphname { a -> b; }
      
      





署名などの属性をノードに追加する必要がある場合は、ノードを個別に記述する必要があります。



 digraph graphname { a [label="source"] b [label="destination"] a -> b; }
      
      





次に、簡単なPL / SQLプロシージャの例を示します。



 CREATE PROCEDURE WRITE_STRING( P_MESSAGE_TYPE IN NUMBER , P_MESSAGE IN VARCHAR2 ) IS BEGIN IF P_MESSAGE_TYPE >= LOG_LEVEL THEN ADD_LOG_RECORD(P_MESSAGE_TYPE, P_MESSAGE); END IF; END WRITE_STRING;
      
      





PL / SQL構文に精通していない場合でも、コードは明確です。



次に、このコードをDOT言語で説明します。 冗長な説明:



 digraph G { N0 [label="”] N1_COND [label="P_MESSAGE_TYPE \>= LOG_LEVEL ?"]; N2 [label="ADD_LOG_RECORD(P_MESSAGE_TYPE, P_MESSAGE);"]; EXIT_LABEL [label="END"]; N0 -> N1_COND N1_COND -> N2 N1_COND -> EXIT_LABEL N2 -> EXIT_LABEL }
      
      





これで、%PNGFILE%および%DOTFILE%の代わりに出力(png)および入力(ドット)ファイルの名前を置き換えることにより、このGraphvizファイルを「フィード」できます。



 dot -v -Tpng –o%PNGFILE% %DOTFILE%
      
      





上記の説明からGraphvizを使用すると、次の図が得られます。







視覚的には、非常に禁欲的です。



属性を追加してブロックの(shape=diamond)



、矢印の署名(label="Yes")



および色color



fontcolor



を決定することで、チャートをより魅力的にすることができます。



実行可能なサブグラフブロックに結合することもできます。 これは、 subgraph {}



コンストラクトによって実装されます。サブ構造内では、サブグラフに含まれるブロックの名前をリストし、ビジュアルデザインの属性(フレームカラー)を指定できます。



 digraph G { comment="PL/SQL flowchart generated by ClearSQL"; node [fontname="Arial", fontsize=8, height=.2, width=.25, color="#000000", fontcolor="#000000"]; edge [fontname="Arial", fontsize=8, arrowsize=.8, color="#000000", fontcolor="#000000"]; N0 [shape=plaintext, label="", style=invis]; N1_COND [shape=diamond, conditional=true, label="P_MESSAGE_TYPE \>= LOG_LEVEL ?"]; N2 [shape=box, label="ADD_LOG_RECORD(P_MESSAGE_TYPE, P_MESSAGE);"]; EXIT_LABEL [shape=Msquare, label="END"]; N0 -> N1_COND [color=darkgoldenrod]; N1_COND -> N2 [label=" Yes " color="#228b22" fontcolor="#228b22"]; N1_COND -> EXIT_LABEL [label=" No " color="#ff7e40" fontcolor="#ff7e40"]; N2 -> EXIT_LABEL subgraph "cluster_#1" { color="#0000ff"; N1_COND; N2 } }
      
      





ブロック図は非常に良いものであり、人々が見せることを恥じることはありません。







プログラマーだけでなく、「単なる人間」もコードを読み取れるようにするために、このトリックを思いつきました。コメント内の特別なタグを認識し、開発者はこれを疑似コード(アルゴリズムを記述する言語)として記述します。 これにより、フローチャートに価値が追加され、リストを視覚化するだけでなく、ビジネスロジックを表示できるようになりました。



 CREATE PROCEDURE WRITE_STRING( P_MESSAGE_TYPE IN NUMBER , P_MESSAGE IN VARCHAR2 ) IS BEGIN --##         --##@true  --##@false  IF P_MESSAGE_TYPE >= LOG_LEVEL THEN --##     ADD_LOG_RECORD(P_MESSAGE_TYPE, P_MESSAGE); END IF; END WRITE_STRING;
      
      





出来上がり! Graphvizでは、最小限のコストで素晴らしい視覚化を行うことができます。








All Articles