DSM - Dependency Structure Matrix

いつのEAPビルドから出来るようになったか忘れたが,IDEAのDSM分析の使い方がわかってきた。というか,使い方は「DSM Guide(PDF)」に書いてあるんで,ようやっと書いてることが理解できた。というのが正しい。


DSM(Dependency Structure Matrix)ってのは,寡聞にして知らなかったのだが,ソフトウェア(パッケージとかクラスとか)の依存関係を表すマトリックスなんだそうな。実際に見た方がわかりがいいだろう。


こんな感じで,モジュールの一覧が表示され,行からは自身に依存している相手とその依存数,列からは自身が依存している相手とその依存数が読み取れる(循環参照もわかる)。これ,なかなか見やすくて良い。

ちゃんとガイド読んでなかったんで,最近気付いたのが,特定の行を選択し「Limit Scope To Selection」を選ぶと,その対象だけのDSMを描いてくれる。これが,すごく便利で,やっとDSMの使い方に目覚めたというワケだ。

    ↓


もともとIDEAには,いろんな依存分析方法があるんだけど,どれもイマイチ閲覧性がよろしくなくて使ってなかったけど,DSMは見やすくて良い。まあ,依存分析したからって,何がどうなるワケではないが,リファクタリングするときに判断材料には使えるかな。あとは,人様のコードを分析するときにも,役に立ちそう。


ps.
↓たくさんあって,使いこなせないIDEAの分析メニュー。:-)

IDEA7のShelve Changesまがいをパッチ生成・適用で試してみた。

かなり誇張したタイトルになってしまったが,要するにSubversionのパッチ生成・パッチ適用をそれぞれの実装系で試してみたって話。自分自身が生成したパッチを正しく戻せるのはもちろんのこと,他の実装系で作ったパッチも適用可能かどうかを確認してみた。


とりあえず,手元にあったのが以下の実装系で試す。

結果は下表の通り。

1 2 3 4
1.TortoiseSVN × ×
2.IDEA7 × ×
3.NetBeans6.0 × ×
4.Eclipse3.3 × ×

横軸がパッチを適用する実装系で,縦軸がそのパッチを作成した実装系。例えば「△」つけた部分は「Eclipseで作ったパッチを,TortoiseSVNで使えた」って読む。
ちなみに,「○」はパッチをそのまま適用できたケース。「△」はパッチをちょっと加工したら適用できたケース。
「×」はダメ(いや,これも加工すりゃ適用できるんで,△は限りなく×に近いと言えよう)。


どうゆうわけか,NetBeans6.0とEclipse3.3(Suversive)は,自分で作ったパッチを自分に適用できなかった。原因とおぼしき部分は,後述する。


それぞれの実装系が生成したパッチのフォーマットを以下に示す。SubversionはUnified Diff形式のパッチが望ましいらしいんだが,どうゆうのが厳密なUnified Diffなのかよーわかってない。:-(


TortoiseSVN 1.4.1, Build 7992で作ったパッチ
これがUnified Diffなのかしらん?

Index: conf/build.properties
===================================================================
--- conf/build.properties	(リビジョン 2098)
+++ conf/build.properties	(作業コピー)
@@ -1,4 +1,3 @@
:||<


<b>IntelliJ IDEA 7(#7096)で作ったパッチ</b>
TortoiseSVNのパッチに似てるだけど,'Index:'行がないためTortoiseSVNではパッチとして認識されなかった(そのくせ,TortoiseSVNのパッチは適用できる)。
>||
--- conf/build.properties	Tue Jul 31 14:05:32 JST 2007
+++ conf/build.properties	(revision 2098)
@@ -1,3 +1,4 @@
:


NetBeans 6.0M10で作ったパッチ
TortoiseSVNのそれとは明らかにフォーマットが異なる。しかもフルパスで書いてるし,自分で作ったパッチを適用できないとはどうゆうこっちゃ?

# This patch file was generated by NetBeans IDE
# Following Index: paths are relative to: C:?temp?test?conf
# This patch can be applied using context Tools: Patch action on respective folder.
# It uses platform neutral UTF-8 encoding and ?n newlines.
# Above lines and this line are ignored by the patching process.
Index: buld.properties
*** C:?temp?test?conf?build.properties Base (BASE)
--- C:?temp?test?conf?build.properties Locally Modified (Based On LOCAL)
***************
*** 1,4 ****
:


Eclipse 3.3 + Suversive 1.1.4で作ったパッチ
TortoiseSVNのパッチに一番近いんだけど,フルパスで書くなってば。これのせいでパッチ適用に失敗してるとしか思えない。
TortoiseSVNの「△」は,フルパス部分を加工して相対パスにして適用してみた結果なのだ。

Index: C:/temp/test/conf/build.properties
===================================================================
--- C:/temp/test/conf/build.properties	(revision 2104)
+++ C:/temp/test/conf/build.properties	(working copy)
@@ -1,4 +1,3 @@
:


うむ,パッチも一筋縄ではいかんのだな。
とりあえず,パッチ作ってあれこれしようと思ったら,TortoiseSVNで作るのが吉ってわけか。