Closed kazurayam closed 1 month ago
AccountクラスモジュールのAccountNameプロパティを参照しているReferrerのコードを具体的に見てみた。
InntelliJ IDEAのFind Usage機能を使って src/test/fixture/hubディレクトリの中をスキャンしてみた。スキャン結果を見るとAccountNameプロパティはたくさん参照されている。ただしAccount.clsファイルを除外して考えよう。AccountsFinderクラスモジュールが参照していた。AccountsFinderのソースコードを見てみよう。76行目。
Set dic2(k) = cSel_.SelectCashList(acc.accType, acc.AccountName, acc.SubAccountName, _
ofReportingUnit, positiveLike)
AccountName
の直前にドット .
がある。オブジェクトのプロパティを参照するのだからドットが必須であることはわかる。これがどうやら鍵であるように思われる。
2024・9・1を AccountsFinderクラスをCashbookTransformerに改称した
com.kazurayam.vba.puml.ProcedureNamePatternManager
の List<Pattern> createPatterns(String)
メソッドの ソースを検討した。
createPatternsメソッドの引数として "AccoutName" が与えられたとき、どんなPatternのリストが返されるか?試してみた。こうだ。
AccountName\(|AccountName\s*'|AccountName\s*$
この正規表現が
Set dic2(k) = cSel_.SelectCashList(acc.accType, acc.AccountName, acc.SubAccountName, _
ofReportingUnit, positiveLike)
というINPUTにmatchするだろうか?検討しよう。
この正規表現は3つの正規表現を | で合体させている。3つそれぞれを検討しよう。
AccountName\(
この正規表現は AccountName
の直後に左カッコ (
がある場合にだけマッチする。VBAではSubやFunctionを呼び出すときに1つ以上のパラメータがある場合に左カッコが必要という構文規則がある。前出のINPUTにはマッチしない。
AccountName\s*'
この正規表現は AccountName
に続いてシングルクオート '
がある場合だけマッチする。VBAでシングルクオートはコメントの始まりを意味する。この正規表現は前出のINPUTにはマッチしない。
AccountName\s*$
この正規表現は AccountName
の後に行の末尾まで何にも文字が無い場合にマッチする。この正規表現は前出のINPUTにはマッチしない。
というわけで、現状では、ProcedureNamePatternManagerのcreatePatternsメソッドが作るList
だからクラス図の中でCashbookのAccountクラスについて矢印が一つもつかない。これが理由だ。
createPatternsメソッドを直せばAccountクラスに矢印をつけることができるはずだ。やってみよう。
createPatternsメソッドがどういう正規表現を生成すればいいのか?
\.?AccountName\W+|\.?AccountName\W*\s*'|\.?AccountName\W*\s*$
でどうだ?
すなわち、
,
)がある対策した。変更点は2つ。
第一に、ProcedureNamePatternManagerのcreatePatternsメソッドを修正して、上記のような参照関係を拾えるようにした。
第二に、FindUsageAppを修正した。ModuleAがModuleAを参照する関係があったら、それについて矢印を描かないようにした。
その前提としてIndexerのxrefメソッドも変更した。v0.1.17では「ModuleAがModuleAを参照する場合をスキップする」というケースをxrefメソッドの中で考慮したつもりだったが、デバッグしてみると、そのコードが間違いの元だった。
v0.1.18を出した。 https://github.com/kazurayam/VBAProcedureUsageAnalyzer/blob/0.1.18/lib/src/test/java/com/kazurayam/vba/puml/FindUsageAppGrandTest.java を実行すると下記のpumlと画像が得られた。
test_writeDiagram_Options_KAZURAYAM.puml.txt
ちなみにv0.1.17は下記のような画像を出力していた。
すごく変化した。こういうものなんだろう。
v0.1.18が生成した画像を眺めて思うのは、画像が妙にゴチャゴチャと複雑だということ。画像がゴチャゴチャして不快だからなぜこうなんだと疑問を覚える。疑問を覚えて画像を眺めると、ゴミであるモジュール(標準モジュールないしクラスモジュール)がいくつか混じっていることに気が付く。ゴミを掃除して気持ち良くしたい、と思う。絵が動機づけしてくれる。
v0.1.18が生成したPosterを紙に印刷しよう、コンビニのプリンターで。
ポスターpdfがA2よりも小さくなるようにパラメータを修正した。それでネットプリントが可能になった。
A4の紙9枚に印刷した。紙の印刷物は十分役立つものだった。
v0.1.17でこうだ
AccountクラスはCashbookの中でも重要なクラスであることは明らか。なのに矢印がない。これは不都合だ。
AccountクラスのAccoutNameはSubでもFunctionでもなくProperty Getだ。
現状、矢印を構築するための処理がSubまたはFunctionを対象としていて、Property Getを考慮していないのだろう。だからAccountクラスに矢印が一つもつかない。