PHPのソースコードからクラス図をリバースエンジニアリングする php-class-diagram を作りました。
この記事はQiita AdventCalendar 2021 PHPの13日目の記事です。
@smeghead Tiwtterやってます。
きっかけ
ソフトウェアを上手く作れるようになりたいという動機で設計に関連する情報収集をしていると、モデル駆動開発の文脈でJIGが紹介されているのを見付けました。
JIG
JIGのWikiがあるのですが、どれも素晴しい資料でした。
JIG Wiki
ソースコードから設計を可視化する
ソースコードのみから設計の意図を読み取るのは難しい
会話を促進する
素早いフィードバックサイクル
コードを歪めない
JIGが羨ましい。JIGを使えるjavaが羨ましい。
- 同時進行する設計とコーディング
- クラスを定義するとビジネスルール関連図が生成される
- 他のクラスをプロパティに追加すると関連の矢印が描画される
- 図を見て感じた違和感を即座にソースコードにフィードバックする
- パッケージとクラスの関連こそが大事
JIGは、javaのプロジェクトに最適化されているからこそ、多種のドキュメントを生成できているのがわかります。
今、自分のプロジェクトは、PHPを使っているのですが、JIGを使った開発のようにコーディングと設計のフィードバックサイクルを回したいと思い、JIGを部分的にでも実装できないかと考えました。
PHPで、JIGのようなツールが欲しくて、作りました。
JIGのビジネスルール関連図を生成するのが目的だったのですが、phpのプロダクトとしては、わかりやすく php-class-diagram という名前にしました。 ソースコードから、PlantUMLのスクリプトを生成するCLIツールを作りました。
Github
https://github.com/smeghead/php-class-diagram
Packagist
composer で導入できます。
https://packagist.org/packages/smeghead/php-class-diagram
dockerhub
php-class-diagram と PlantUML を含むDockerイメージを利用できます。
https://hub.docker.com/repository/docker/smeghead7/php-class-diagram
サンプル
PHPのソースコード(php-class-diagram本体のソースコード)を、php-class-diagram を使って PlantUMLのスクリプトを出力し、それを PlantUMLで画像にした例です。
ビジネスルール関連図の例(php-class-diagram本体のもの)
パッケージ関連図の例(php-class-diagram本体のもの)
普段仕事で担当しているような実用的なプロジェクトのソースコード全体を出力しようとすると、対象クラスが多すぎて、何も読み取れないクラス図になりがちなので、モデル駆動開発を行なっているディレクトリ(Domainなど)を対象に出力すると、現在の実装のクラスの関連を可視化し、何かしらのフィードバックを見付て設計の改善に繋げることができるかもしれません。(憧れのJIGを使った開発のように)