Help us understand the problem. What is going on with this article?

Xcodeプロジェクト内のクラスの依存関係を図示する

More than 5 years have passed since last update.

他人から引き継いだプロジェクトの大まかな全体設計を把握したい場合、規模の大きいライブラリの一部だけ取り出して使用したい場合、複雑になってしまったコードをリファクタリングしたい場合等、プロジェクト内のクラスの依存関係が一望できると有益な場面は多いのではないでしょうか。

objc_depというスクリプトを用いると、下記のように、Xcodeプロジェクト内のクラスの依存関係を示す図をコマンド一発で生成することができます。

依存関係図のサンプル

このスクリプトの使い方、生成される図の見方等を紹介します。

スクリプトの実行方法

次のURLからダウンロードしてきて解凍すると、objc_dep.py というファイルが入っています。

https://github.com/nst/objc_dep

そのスクリプトを適当な場所に置き、ターミナルから次のように実行します。

$ python objc_dep.py {プロジェクトのパス} > {出力ファイル名}.dot

たとえばホーム直下にDemoというプロジェクトフォルダがあり、demo.dotというファイル名で出力したい場合は、

$ python objc_dep.py ~/Demo > demo.dot

というコマンドになります。

依存関係図を表示

出力される.dotという形式のファイルは、Graphviz または Omnigraffle というアプリケーションで表示できます。(Omnigraffle は定評のあるダイアグラム作成ソフトですが、なにぶん有料なので、とりあえず objc_dep を試してみたいという方は、オープンソースの Graphviz をオススメします。)

依存関係図の見方

ここでは試しに、 "Facebook iOS SDK" に付属している "Hackbook" というサンプルアプリの依存関係を出力してみました。

Hackbook の依存関係図

出力された図を見ると、青い矢印で結ばれているところがあります。

相互import

ソースコード内のコメントによると、「相互にimportしている」場合に青い矢印で結ばれるようです。

コードの保守性の観点から、クラスの相互依存はなるべく避けたいところかと思います。もし青い矢印が存在した場合、プロトコルを使用して直接参照を片方向からのみにできないか検討する、といったようにリファクタリングの指針とすることができます。

またこの例には出てきませんでしたが、赤い矢印が出てくることがあります。

pchからのimport

赤い矢印は、.pchファイルからのimportを意味します。

.pch ファイルから import されたヘッダは全クラスから参照される(この参照の矢印は描画されない)ため、このような使用になっているものと思われます。

こちらも、.pch で import しているのにさらに個別のクラスでも import している、.pch で import すべきではないクラスを import している、といったように不要な依存性がないかのチェックの指針となります。

同じくこの例には出ていませんが、カテゴリは(他のクラスに依存していない場合は)依存関係図から切り出して右上の方に列挙してくれます。カテゴリはその性質上多くのファイルから参照されていても設計上の問題とはならないため、図がゴチャゴチャしないようにこういう仕様になっているようです。

shu223
フリーランスiOSエンジニア 著書:『iOS×BLE Core Bluetooth プログラミング』『Metal入門』『実践ARKit』『Depth in Depth』『iOSアプリ開発 達人のレシピ100』他 GitHubの累計スター数23,000超
http://shu223.hatenablog.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした