他人から引き継いだプロジェクトの大まかな全体設計を把握したい場合、規模の大きいライブラリの一部だけ取り出して使用したい場合、複雑になってしまったコードをリファクタリングしたい場合等、プロジェクト内のクラスの依存関係が一望できると有益な場面は多いのではないでしょうか。
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" というサンプルアプリの依存関係を出力してみました。
出力された図を見ると、青い矢印で結ばれているところがあります。
ソースコード内のコメントによると、「相互にimportしている」場合に青い矢印で結ばれるようです。
コードの保守性の観点から、クラスの相互依存はなるべく避けたいところかと思います。もし青い矢印が存在した場合、プロトコルを使用して直接参照を片方向からのみにできないか検討する、といったようにリファクタリングの指針とすることができます。
またこの例には出てきませんでしたが、赤い矢印が出てくることがあります。
赤い矢印は、.pchファイルからのimportを意味します。
.pch ファイルから import されたヘッダは全クラスから参照される(この参照の矢印は描画されない)ため、このような使用になっているものと思われます。
こちらも、.pch で import しているのにさらに個別のクラスでも import している、.pch で import すべきではないクラスを import している、といったように不要な依存性がないかのチェックの指針となります。
同じくこの例には出ていませんが、カテゴリは(他のクラスに依存していない場合は)依存関係図から切り出して右上の方に列挙してくれます。カテゴリはその性質上多くのファイルから参照されていても設計上の問題とはならないため、図がゴチャゴチャしないようにこういう仕様になっているようです。