SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

PHPカンファレンス実行委員プレゼンツ PHPの最前線

健全なソフトウェア設計の第一歩! 既存のPHPソースコードからクラス図を自動生成しよう

PHPカンファレンス実行委員プレゼンツ PHPの最前線 第5回

現実的なライブラリのクラス図を生成する

 先程の例は非常にシンプルでしたが、今回はより現実的なライブラリを対象にクラス図を生成してみましょう。今回は、適度なサイズの有名なライブラリであるsymfony/stringを選びました。

 本記事で対象としたバージョンは、v7.1.8です。

 symfony/stringを直接利用している方は多くないかもしれませんが、9.7k以上のGitHubのスターを集めているsymfony/consoleでUnicode文字列の幅や長さを計算するためにsymfony/stringが利用されています。

 まず、GitHubからsymfony/stringのリポジトリをクローンし、クローンしたディレクトリに移動します。

git clone https://github.com/symfony/string.git
cd string

 次に、クラス図を生成するために以下のコマンドを実行します。

docker run --rm \
        -v $(pwd):/usr/src \
        smeghead7/php-class-diagram bash \
        -c 'php-class-diagram \
                --disable-class-methods \
                --disable-class-name-summary \
                --exclude="Tests" . \
                | plantuml -pipe -tpng > string-diagram.png'

コマンドの説明

 php-class-diagramのオプションを指定することで、生成されるクラス図をカスタマイズしています。

  • --disable-class-methods:メソッドが非常に多いクラスがあるため、メソッドを非表示にします。
  • --disable-class-name-summary:クラスコメントの1行目をクラス名として表示する機能を無効化します。
  • --exclude='Tests':テストクラスを解析対象から除外するために、テストファイルが格納されているディレクトリ名を指定します。

 コマンドが成功すると、カレントディレクトリに、string-diagram.pngというクラス図が生成されます。

生成されたクラス図
生成されたクラス図

 複数の名前空間にまたがっているクラスやインターフェースが、クラス図として出力できました。

 この図では、複数の名前空間にまたがるクラスやインターフェースが表示され、クラス間の関係性が視覚化されています。インターフェースとその実装クラス、クラスとその継承関係は実線の矢印で示され、依存関係は点線の矢印で表現されていることが確認できます。

現実的なライブラリのパッケージ図を生成する

 php-class-diagramはクラス図だけでなく、パッケージ図の生成も可能です。パッケージの依存関係に着目した図を出力することで、クラス図とは異なる視点から設計を把握することができます。ここでは引き続きsymfony/stringのパッケージ図を出力してみます。

パッケージ図の「パッケージ」という概念について

 php-class-diagramは、対象のソースコードのnamespaceの階層構造またはディレクトリ構成構造を擬似的にパッケージとして見做して、パッケージ図を出力します。

 以下のコマンドを使用して、symfony/stringのパッケージ図を生成します。

docker run --rm \
        -v $(pwd):/usr/src \
        smeghead7/php-class-diagram bash \
        -c 'php-class-diagram \
                --package-diagram \
                --exclude='Tests' . \
                | plantuml -pipe -tpng > string-package-diagram.png'

コマンドの説明

 php-class-diagramのオプションを指定することで、生成されるパッケージ図を制御しています。

  • --package-diagram:パッケージ図を出力します。
  • --exclude='Tests':テストクラスを解析対象から除外するために、テストファイルが格納されているディレクトリ名を指定します。

 実行が成功すると、カレントディレクトリに、string-package-diagram.pngというパッケージ図の画像が生成されます。

生成されたクラス図
生成されたクラス図

 php-class-diagramが出力するパッケージ図では、対象に指定したディレクトリ内のパッケージだけではなく、外部の依存するパッケージへの依存関係も表示されています。

 出力されたパッケージ図を確認してみたところ、ResourceパッケージがSymfony\Component\HttpClientに依存していることがわかりました。

 この点に疑問を感じてソースコードを調べたところ、Unicode文字列の幅や長さに関する情報をunicode.orgのサイトから取得するツールが含まれていることが判明しました。Unicodeのバージョンが更新されるたびに、このツールを使ってResource/dataディレクトリ内のファイルが更新されていたのです。

 このように、php-class-diagramを使って出力したパッケージ図を確認することで、設計上の気付きや場合によっては潜在的な問題点を発見するのに役立つことがあります。

さいごに

 比較的簡単な手順で現実的なライブラリのPHPのソースコードから、クラス図やパッケージ図を生成することができました。

 クラス図と聞くと、実装前のクラス設計フェーズで作るものという認識のある人が多いかもしれません。しかし、php-class-diagramを使用すると、既存のソースコードからクラス図やパッケージ図を自動生成でき、開発の進行中にも継続的にクラス図を生成して確認することが可能になります。

 生成された図を確認することで、単にソースコードを読むだけでは得られない、異なる視点からソフトウェア設計の改善案を考えるきっかけが得られるかもしれません。

 php-class-diagramを使って生成するクラス図は、機能追加をする際の設計レビューや新しくプロジェクトに参加するメンバーへのキャッチアップのための資料としてもソースコードの迅速な理解に役立ちます。

 php-class-diagramとPlantUMLを活用してPHPのソースコードからクラス図を自動生成することで、設計に対する洞察を深め、より健全なソフトウェア設計を実現する手助けとなるでしょう!

PHPカンファレンス2024 実行委員より

 2024年12月22日(日)に開催される日本のPHPコミュニティの最大のお祭り「PHPカンファレンス2024」タイアップ企画として5回に渡ってお送りした連載も今回で最終回です。イベント当日は7トラック54のセッション、ワークショップが開催され、みなさんのご来場をお待ちしています。年の瀬の慌ただしい時期ですが、PHPの熱狂に一日浸っていただきたく思います。

 また来年に開催される「PHPカンファレンス2025」についても少し触れておきましょう。来年は2025年6月25日(土)に、本年と同じく東京都大田区蒲田の大田区産業会館PiOでの開催が決定しています。これは会場が年後半に大規模改修に入ってしまうので、例年のスケジュールを大幅に前倒す判断を行ってその様になりました。また2025年も今年並に日本各地で多くのPHPカンファレンスの開催が予定されています。PHPコミュニティの熱い雰囲気はまだしばらく続きそうです。お楽しみに。

関連リンク

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
PHPカンファレンス実行委員プレゼンツ PHPの最前線連載記事一覧

もっと読む

この記事の著者

しめじ(smeghead)(シメジ)

 ソフトウェア設計に興味を持ちつつ、日々レガシーコードの改善を続けているプログラマーです。携わっている主なOSSプロジェクトは、php-class-diagramとphel-langです。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/20561 2024/12/09 11:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー