Swiftコードから自動的にUML図を生成する方法


SwiftのコードからUML(クラス図)を生成するスクリプト(palaniraja/swiftuml)を公開している方がいたので紹介します.

肥大化したプロジェクトを理解するためにクラス図などのダイアグラムを用いると便利です.JavaならInteliJ Ideaの機能を用いて生成するなど方法がありますが,XcodeやApp CodeにはSwift用のそのような機能は残念ながら存在しません.swiftumlのスクリプトを使ってPlantUML(テキストベースのUML記述言語)を出力すれば,PlantUMLのソフトを使ってダイアグラムを表示できます.

 環境を準備する

  • swiftですのでmacOSを対象とします.

swiftuml実行環境

  • swiftumlのスクリプトを実行するために以下をbrewでインストールでします.
zsh
brew install sourcekitten
brew install jq
  • 必要に応じてNode.jsをインストールしてください.

PlantUML実行環境

  • PlantUMLを公式ページからダウンロードします.
  • 必要に応じてJDKをインストールしてください.

また,ダイアグラムの描画に以下のコマンドが必要です.

zsh
brew install graphviz

このソフトを使わなくてもweb上で描画するシステムもあります.

swiftumlスクリプトを実行する

GitHub(palaniraja/swiftuml)から必要なプログラムを入手します.沢山のファイルがありますが,必要なのは次の二つです.

  • plantuml.js
  • plantuml.sh

この二つを適当な場所に配置します.

スクリプトは次のコマンドで実行します.このコマンドは,directory_name以下の階層に存在する全ての.swiftファイルを対象にしてPlantUMLを生成し,uml.txtに書き出します.

zsh
find directory_name | grep .swift |  xargs -L 1 sh plantuml.sh | grep -v @enduml | grep -v @startuml >> uml.txt

筆者の環境では,Resourcesに入っているswiftgenによって生成されたファイルが上手く扱えなかったため,無視するようにしました.

zsh
find directory_name | grep .swift | grep -v Resources |  xargs -L 1 sh plantuml.sh | grep -v @enduml | grep -v @startuml >> uml.txt

コマンドの補足説明

PlantUMLで記述されたファイルは@startumlで始まり,@endumlで終わります.上のコマンドでは読み込んだswiftファイル毎にこれらのキーワードが付加されてしまうため,一旦全て削除しています.(| grep -v @enduml | grep -v @startuml の部分)

ダイアグラムを描画する

まず,uml.txtのファイルを開き,ファイルの先頭行に@startuml,最後の行の後に@endumlを追加します.(先ほどのコマンドで全て消してしまったため追加する必要があります.本来は追加するためにsedコマンドを書きたかったのですが,macだとややこしいのでやめました)

公式ページからダウンロードしたjavaアプリを起動しuml.txtを選択します.

ダイアグラムが表示されます.

問題点等

使ってみたところ以下のような問題点がありました.解決策をご存じの方おられましたら教えていただけると幸いです.

  • 大規模すぎるとPlantUMLのソフトで一部しか表示できない(途中から切れてしまいます)
  • 表示されるのは継承関係のみでそのほかの関係性は表示されません.(どのクラスを利用しているなど)
  • 最新のSwiftの記法に対応していない部分があります(下図,PlantUMLの問題で&を使った継承など)