kazurayam / vba-callgraph

Generating a Call Graph for Excel VBA workbooks
https://kazurayam.github.io/VBACallGraph/
Apache License 2.0
0 stars 0 forks source link

クラスモジュールが2つあって、同じ名前のメソッドを実装している場合、見間違えている #17

Closed kazurayam closed 2 months ago

kazurayam commented 3 months ago
Cashbook現金出納帳のためのVBAライブラリ.CashList o-- Backboneライブラリ.Person : ToString

この出力は間違っている。

CashListはクラスモジュールでToStringメソッドを実装している。 PersonクラスもクラスモジュールでToStringメソッドを実装している。 同じToStringだからCashListとPersonを結びつけてしまった。 これは不適切だ。

Personクラスの他メソッドがToStringを参照するのは構文として妥当だが、モジュールの境を跨がないから、描画する価値がない。

その一方で、CashListのソースコードの中に Dim perosonX As Person; personX = new Person(); personX.ToString() と書いてあるならば、参照関係が成り立つ。こんなの、正規表現でマッチしようとしたって到底無理な話だ。

kazurayam commented 2 months ago

https://github.com/kazurayam/VBAProcedureUsageAnalyzer/blob/0.1.10/lib/src/main/java/com/kazurayam/vba/Options.java

    public static Options KAZURAYAM =
            new Options.Builder()
                    .excludeModule(ModuleToBeExcluded.プロシージャー一覧を作る.getPattern())
                    .excludeModule(ModuleToBeExcluded.プロシージャ一覧を作る.getPattern())
                    .excludeModule(ModuleToBeExcluded.プロシジャ一覧を作る.getPattern())
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシージャー一覧を作る")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシージャ一覧を作る")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシジャ一覧を作る")

            .ignoreRefereeProcedure(VBAModule.ModuleType.Class, "ToString")

                    .build();

とやってみよう。つまりToString()メソッドを無視する。

kazurayam commented 2 months ago

ずるい手を思いついた。Optionsクラスをこういうふうに変更した。

public class Options {

    public static Options KAZURAYAM =
            new Options.Builder()
                    .excludeModule(ModuleToBeExcluded.プロシージャー一覧を作る.getPattern())
                    .excludeModule(ModuleToBeExcluded.プロシージャ一覧を作る.getPattern())
                    .excludeModule(ModuleToBeExcluded.プロシジャ一覧を作る.getPattern())
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシージャー一覧を作る")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシージャ一覧を作る")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "プロシジャ一覧を作る")

                    .ignoreRefereeProcedure(VBAModule.ModuleType.Standard, "KzCls")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Class, "ToString")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Class, "Count")
                    .ignoreRefereeProcedure(VBAModule.ModuleType.Class, "Items")
                    .build();

KzCls, ToString, Count, Items ーーー これらRefereeプロシジャをignoreする。するとdiagramの中で矢印線がグッと少なくなった。クラス図のノイズが少なくなった。わたしkazurayamはこれらのプロシジャのことを覚えておこう、うっかり削除したりしないように気をつけよう。

diagram-16918242220069966672

kazurayam commented 2 months ago

もういいと思う