PHPソースコードからクラス図を自動生成する
それでは、実際にPHPのクラス群を分析し、クラス図を自動生成してみましょう。php-class-diagramとPlantUMLという2つのツールを使ってクラス図を自動生成します。
PlantUMLの概要
PlantUMLは、テキスト形式のスクリプトを使用して、UMLだけでなく、さまざまな図を生成できるオープンソースツールです。シンプルな記法を用いることで、設計図を効率的に作成できる点が特徴です。クラス図、シーケンス図、アクティビティ図、状態遷移図、マインドマップなど多様な図の生成が可能です。デフォルトの出力形式はPNG画像ですが、用途に合わせてSVG(Scalable Vector Graphics)形式やテキスト形式等を選択することも可能です。
php-class-diagramの概要
php-class-diagramは、PHPのソースコードが格納されたディレクトリを引数に指定し実行すると、ソースコードを解析し、標準出力にPlantUML形式のクラス図スクリプトを自動生成するツールです。このツールとPlantUMLを使うことにより、既存のコードベースを素早く可視化し、クラス構造の理解を深めることができます。
php-class-diagramは、@irofさんの「コードをどまんなかに据えた設計アプローチ」というスライドに感銘を受けて、この設計アプローチをPHPでも実践したいと考え、筆者が2021年より開発しているものです。
インストール
php-class-diagramの実行方法は、Composerでプロジェクトの開発環境にインストールする方法と、dockerイメージを使う方法があります。今回は、プロジェクトの設定に影響することのないdockerイメージを使った方法で、クラス図を作成してみます。Dockerがインストールされていない場合は、先にDockerのインストールを済ませておいてください。
クラス図の生成方法
例として、以下のようにsrcディレクトリ配下にPHPのソースコードがあるものとします。
src
└── product
├── Name.php
├── Price.php
└── Product.php
各ファイルの内容は、以下のようになっているとします。
<?php
namespace hoge\fuga\product;
/**
* 製品
*/
class Product {
public function __construct(
private Name $name,
private Price $price
) {
}
}
<?php
namespace hoge\fuga\product;
/**
* 製品名
*/
class Name {
public function __construct(private string $name) {
}
}
<?php
namespace hoge\fuga\product;
/**
* 価格
*/
class Price {
public function __construct(private int $price) {
}
}
どのファイルもとても単純なPHPのクラスが定義されています。このコードを対象に、以下のコマンドを実行してクラス図を生成します。
docker run --rm \
-v $(pwd):/usr/src \
smeghead7/php-class-diagram bash \
-c 'php-class-diagram src | plantuml -pipe -tpng > class-diagram.png'
コマンドの説明
-
php-class-diagram src:php-class-diagramを使って、srcディレクトリ配下を対象に、PlantUMLのクラス図のスクリプトを生成します。 -
plantuml -pipe -tpng > class-diagram.png:php-class-diagramを使って出力したPlantUMLのクラス図のスクリプトをパイプ経由で受け取り、PlantUMLでPNG画像を出力し、class-diagram.pngにリダイレクトして保存します。
実行が成功すると、カレントディレクトリに、class-diagram.pngというクラス図の画像が生成されます。
生成されたクラス図では、ProductクラスがNameクラスとPriceクラスのプロパティを持ち、それぞれに依存していることが、点線の矢印で表されています。
このように、PHPソースコードを静的に解析し、クラス間の依存関係を視覚化できます。
