03

10

DTangler - DSM(Dependency Structure Matrix)依存構造マトリクス作成、循環参照検出ツールの使い方

2011.03.10(21:51)

プロダクトライン開発で優れたフレームワークや共通部を作れたとしてもそれが崩れてゆくのを防ぐのが実はとてもたいへんである。崩れてゆくのをできるだけ早期に発見するために、依存性解析も毎日のプロセスに加えるとよいだろう。

DTangler は、DSM(Dependency Structure Matrix)依存構造マトリクスを作成表示したり、循環参照を検出することができるオープンソースのツールである。(Eclipse Public License)

gui_large.jpg

GUI版とコマンドライン版2つのツールがある。

GUI版は
依存関係を定義したdtファイル(後述)を読み込んで依存関係をGUIで表示する。循環参照を許可する設定などあとでコマンドライン版で使うときの条件を簡単に設定することもできる。

コマンドライン版は
依存関係を定義したdtファイル(後述)を読み込んでDSMのテキスト版を出力し、循環参照をレポートし、指定された条件に基づいてOKかエラーを判定して終了条件として返す。

■ サイト
http://web.sysart.fi/dtangler/

■ ダウンロード
上記のサイトから
dtangler-gui.zip (GUI版)
dtangler-core.zip (コマンドライン版)
をダウンロード。それぞれ別々のディレクトリを作って解凍しておく。

■ GUI版の使い方
(1) 依存関係をいれたdtファイルを作る。(sample1.dt)
1行に1つずつ、依存元 : 依存先 のペアを並べておく。

Class1 : Class2
Class1 : Class3
Class2 : Class3


(2) dsmgui.batを起動する。
またはそのファイルに書かれている以下をコマンドラインから入力して起動する
java -cp lib-forms\forms-1.2.0.jar;dtangler-gui.jar org.dtangler.swingui.app.Main
gui0.jpg

(3) Input...で、
Dependency engineからgenericを
Directories or files to search from のAdd...で(1)のdtファイルを指定して
OK
gui1.jpg

(4) DSMが表示される
gui2.jpg

Class1 : Class2
Class1 : Class3
Class2 : Class3


DSMは桁を上から下に見る。1番の Class1 は、2番の Class2 と、3番の Class3 に依存し、2番の Class2 は、3番の Class3 に依存する。依存があるところに依存の回数1が表示される。

行の並びは、できるだけ上から下に依存するように自動的に並べかえられ、自分で順番を指定することはできない。

(5) GUIツール上で行った設定((3)で行った設定)を保存したいときは、
File - save as で、sample1.properties のように保存する。
たとえば以下のようなファイルが保存できる。

input = E:\DTangler\sample1.dt
engine = generic
cyclesAllowed = false
rules = ;\

循環参照は許さない、という設定が見える。

(6) 保存した sample1.properties ファイルがあれば、
次回起動したあとに、
File - open で読み込めば、すぐに解析できる。つまりDTファイルとプロパティファイルを保存しておけばすぐに前回と同じDSMを見ることができる。

(7) 循環参照がある場合 (sample2.dt)

Class1 : Class2
Class1 : Class3
Class2 : Class3
Class3 : Class2


gui3.jpg

Class2 と Class3 が循環参照しているので赤く表示される。ウィンドウの下に循環参照している位置が表示される。

実際の依存性解析では、ファイルの中にパッケージがあり、パッケージの中にクラスがあり、同じパッケージの中のクラス同士が循環参照したり、異なるパッケージ間のクラス同士が循環参照している場合があり、さまざまなスコープで循環参照の有無を確認したいことが多い。

(8) スコープの定義を追加する (sample3.dt)

file{file1}
file{file2}
package{file1 package11}
package{file1 package12}
package{file2 package21}
class{file1 package11 class111} : class{file1 package11 class112}
class{file1 package11 class111} : class{file1 package12 class123}
class{file1 package11 class112} : class{file1 package12 class123}
class{file1 package12 class123} : class{file1 package11 class112}
class{file2 package21 class211} : class{file2 package21 class212}

スコープ名 { 親コンポジット名 }
スコープ名 { 親コンポジット名 子コンポジット名 }
スコープ名 { 親コンポジット名 子コンポジット名 リーフ名 }
となどと表記する。上の例では、
fileスコープには、file1がある。
fileスコープには、file2がある。
packageスコープには、file1の中のpackage11がある。
packageスコープには、file1の中のpackage12がある。
classスコープには、file1の中のpackage11の中のclass111があって、それは、file1の中のpackage11の中のclass112に依存している、という意味になる。

なお、スコープ名 file, package, class という名前も自分で自由につけることができる。
入れ子関係は正しくなっていないとツール読み込み時にパーサーエラーになる。

fileスコープの場合
gui41.jpg

packageスコープの場合
gui42.jpg

classスコープの場合
gui43.jpg


■ コマンドライン版の使い方
上で使った dtファイルと、上で作った propertiesファイルがあれば、コマンドラインで循環参照の有無を調べることができる。

(1) sample1の場合
sample1.properties
input = E:\DTangler\sample1.dt
engine = generic
cyclesAllowed = false
rules = ;\

実行結果
E:\DTangler>java -jar dtangler-core.jar -configFile=sample1.properties
dtangler 2.0.0 (c) 2008 by contributors.
check www.dtangler.org for new versions and additional information
| 1| 2| 3|
1 Class1 ( 1) |####| | |
2 Class2 ( 1) | 1|####| |
3 Class3 ( 1) | 1| 1|####|

循環参照がない場合、実行した結果の戻り値はゼロが返る。

(2) sample2の場合
sample2.properties
input = E:\DTangler\sample2.dt
engine = generic
cyclesAllowed = false
rules = ;\

実行結果
E:\DTangler>java -jar dtangler-core.jar -configFile=sample2.properties
dtangler 2.0.0 (c) 2008 by contributors.
check www.dtangler.org for new versions and additional information
| 1| 2| 3|
1 Class1 ( 1) |####| | |
2 Class2 ( 1) | 1|####| 1C|
3 Class3 ( 1) | 1| 1C|####|

Cycle: Class2-->Class3-->Class2

循環参照している部分が追加されて報告される。
循環参照がある場合、実行した結果の戻り値は非ゼロが返る。

(3) sample3の場合
sample3.properties
input = E:\DTangler\sample3.dt
engine = generic
cyclesAllowed = false
rules = ;\

実行結果
E:\DTangler>java -jar dtangler-core.jar -configFile=sample3.properties -scope=fi
le
dtangler 2.0.0 (c) 2008 by contributors.
check www.dtangler.org for new versions and additional information
| 1| 2|
1 file1 ( 2) |####| |
2 file2 ( 1) | |####|

file1 contains a violation: Cycle: package11-->package12-->package11

E:\DTangler>java -jar dtangler-core.jar -configFile=sample3.properties -scope=pa
ckage
dtangler 2.0.0 (c) 2008 by contributors.
check www.dtangler.org for new versions and additional information
| 1| 2| 3|
1 package11 ( 2) |####| 1C| |
2 package12 ( 1) | 2C|####| |
3 package21 ( 2) | | |####|

Cycle: package12-->package11-->package12

E:\DTangler>java -jar dtangler-core.jar -configFile=sample3.properties -scope=cl
ass
dtangler 2.0.0 (c) 2008 by contributors.
check www.dtangler.org for new versions and additional information
| 1| 2| 3| 4| 5|
1 class111 ( 1) |####| | | | |
2 class211 ( 1) | |####| | | |
3 class112 ( 1) | 1| |####| 1C| |
4 class123 ( 1) | 1| | 1C|####| |
5 class212 ( 1) | | 1| | |####|

Cycle: class112-->class123-->class112

コマンドラインかpropertiesファイルに、スコープを指定する。
循環参照がある場合、実行した結果の戻り値は非ゼロが返る。

■ ヒント
GUIツールは、折りたたんだり、拡大縮小したり、印刷する機能がないので、そのままでは巨大なDSMをうまく扱えない。上記のように、コマンドラインツールでDSMに近いテキストが得られるので、これを切り出して、csvに変換して、Excelに持ち込めばいろいろ見やすくなる。

コマンドラインツールは、循環参照が見つかった場合に、非ゼロを返すので、これを使って継続的インテグレーションのジョブの1つとして依存性解析を加えるといいだろう。

循環参照を認める例外の設定など、きめ細かい設定もできる。マニュアルはたいへん読みやすいので、そちらを参照されたい。

■ DSMについての参考サイト
The Design Structure Matrix Web Site
http://www.dsmweb-j.org/index.html

コメント

印刷するときには、

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。多少うまく印刷できます。まだ完全ではないのですが、これで勘弁してください。

コメントの投稿

非公開コメント

プロフィール

島敏博

Shima Toshihiro 島敏博
信州アルプスハイランド在住。HaskellとElixirが好き。組み込みソフトウェアアーキテクト、C++プログラマ、山歩き、美術館巡り、和食食べ歩き、日本赤十字社救急法指導員、インデックス投資、クラシック音楽、SESSAME会員、状態マシン設計、モデル駆動開発、ソフトウェアプロダクトライン、Rubyist、実践ビジネス英語

■ ツイッター
http://twitter.com/saltheads
■ Facebook
http://www.facebook.com/saltheads
■ Qiita
http://qiita.com/saltheads

印刷する場合は、ブラウザの印刷メニューではなく、このページの上から3cmくらいの青いところにある、「印刷」を押してみてください。少しうまく印刷できます。まだ完全ではないのですが、これで勘弁してください。


カテゴリ
最新記事
月別アーカイブ
最新コメント
検索フォーム
リンク
sessame
RSSリンクの表示