【Python】クラス内のメソッド→フィールドの使用関係をグラフに描画するツール

どうもです、タドスケです。

前回こちらのツールを作りまして、コードを解析してあれこれするツールというのが、意外と簡単に作れることがわかりました。

他にも何か便利な解析ツールが作れないかな? と思ったので、「クラス内のメソッド→フィールドの使用関係をグラフに描画するツール」を作ってみました。

開発には ChatGPT を利用しています。

目次

コード

コードは以下の場所にアップしてあります。
(量が多いので、記事内に全文は載せません)

tadosuke/create_dependency_graph: メソッド・フィールドの依存関係グラフを表示するツール (github.com)

create_dependency.py がコア処理(Model)で、*_matplotlib.py、*_plantuml.py はそれぞれの表示形式に合わせた処理(View)です。

使いかた

matplotlib, networkx のインストール(matplotlib 版のみ)

matplotlib 版は内部で matplotlib, networkx ライブラリを使用しているため、python 環境へのインストールが必要です。

コマンドプロンプトで pip コマンドが使える環境であれば、

pip install matplotlib networkx

でまとめてインストールできます。

PyCharm のプロジェクト設定で異なる Python 実行環境を設定している場合、PyCharm 上ではなくPCにインストールされている方の Python 実行環境である点に注意してください。

コマンドプロンプト(ターミナル)を使う

コマンドプロンプト(ターミナル)で python コマンドが実行できる環境であれば、

python [ディレクトリ階層]/create_dependency_plantuml.py [解析したい.py ファイル]

と入力すれば使えます。

matplotlib 版も同様です。

PyCharm の外部ツール機能(おススメ)

PyCharm の外部ツール機能に登録しておけば、現在開いているファイルの右クリックメニューからカンタンに実行できます。

引数の末尾に「$FilePath$」マクロを追加してください。

解析したいファイルタブの右クリックメニューから実行できます。

実行結果

以下のコードに対して実行します。

class MyClassA:

    def __init__(self):
        self._a = 0
        self._b = 0
        self._c = 0

    def func_a(self):
        self._a = 1

    def func_b(self):
        self._b = 1


class MyClassB:

    def __init__(self):
        self._cls_a = MyClassA()

    def func_c(self):
        self._cls_a.func_a()

    def func_b(self):
        self._cls_a.func_b()

PlantUML 版

出力自体はコンソールにテキストでされるので、PlantUML にあるオンラインツールなどに貼り付けます。

一つのファイル内に複数のクラスがある場合、出力は複数クラス一括で行われます。

複数クラス間で同じ名前のメソッド・フィールドがあると、同じものとして扱われてしまうため、表示がおかしくなります。

その場合はクラス(rectangle 単位)ごとにコピペするようにしてください。

matplotlib 版

クラスごとにウィンドウが順番に生成されます。(一つ閉じると、次のウィンドウが表示される)

何の役に立つの?

どこからも参照されていないフィールドや、特定の関数群からしか参照されていないフィールドを視認しやすくなるので、巨大なクラスをリファクタリングする場合のとっかかりとして利用できます。

上の例だと、MyClassA 内にある _c は削除できそうで、func_a-_a、func_b-_b のセットはそれぞれ別のクラスに分離できそうです。

ここで「できそう」と書いているのは、クラス外からのアクセスを考慮していないためです。

このツールであたりを付けたら、プロジェクト内の全検索や、PyCharm にある参照箇所の検索機能などを活用して、リファクタリングの影響範囲を確認してください。

課題:複数クラス、ファイルへの対応

複数クラス・ファイル間の関係を一括で描画する機能も検討したのですが、同名メソッド/フィールドなどの影響で描画がおかしくなる問題が頻発したため、対応を断念しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次