突然 iOS 案件にヘルプとして召喚されたときに役立った6つの Tips

先日、__突然 iOS の案件に召喚__ され、新機能の実装をしてきました。

当方は、何年か前に __数ヶ月程度 iOS アプリの開発経験がある__ 程度で、
さらに __join する案件のナレッジは皆無__ という状況で、
一早く全体像を掴んだり、作業効率の向上に寄与した6つの Tips を紹介します。

# とにかくまずはアプリを触る

あまりに基本ですが、全体像を把握するためには、
__やっぱり実際に動くアプリをいじり倒すのが一番__ ですね。

既に AppStore にリリースされていて、コンシューマ向けのアプリが動作すればベストですが、
何かしらの理由で難しい場合は、開発環境を整えて、実機でアプリを触れる環境を作りましょう。

iOS の simulator は優秀ですが、やはりできれば実機で操作するのがベストだと思います。
また、その時点で、よくわからない機能や仕様、怪しい動作等あれば確認しておくと良いですね。

# サブディスプレイを用意する

完全に私の事情に依存した話ですが、
私の場合 __プロジェクトルームとして別室__ が用意されました。

iOS アプリ開発なので MacBook 1台持っていけば開発自体問題はないのですが、
__モニタを1台運び込んだ__ ことで作業効率が大幅に向上しました。

特に join したばかりのプロジェクトでは、
ソースコード以外にも、wiki や仕様書類、過去チケットなど、あらゆる情報を見比べることが多くなります。

その際に、毎回ウィンドウをスイッチしていては効率が上がらないため、
多少面倒な環境(手狭、客先など)であっても、ディスプレイは用意するべきです。

一般的に、脳のコンテキストスイッチを削減するための労力は惜しむべきではないと思います。

# Debugging View Hierarchies の活用

![](https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/Art/dwx-sw-dvh-1_2x.png)

未だに __Storyboard/Xib を利用していない__ レガシーアプリだったり、
動的にビューをゴリゴリ変更している場合、特定画面の構造が把握しづらい場合があります。

そういうときは、__Debugging View Hierarchies__ が役に立ちました。
画像の通り、デバッガで動的に view の構造を可視化してくれます。

詳細は Apple 公式か、他記事が詳しいのでご参照ください。

* Specialized Debugging Workflows  
https://developer.apple.com/library/content/documentation/DeveloperTools/Conceptual/debugging_with_xcode/chapters/special_debugging_workflows.html

# CoreData の Editor Style Graph の活用

![](https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/Art/Entity_Inheritence_2_2x.png)

永続化データを CoreData に保持する機能を触る、あるいは追加する際は、ある程度テーブルの関係を把握しておく必要があります。
Xcode に __Editor Style Graph__ という (E-R図ライクな)関係図を表示する機能があるため、
これを利用すると全体像を把握しやすいと思います。

位置は自由に変更が可能なので、見やすいように並べれば良いですが、
座標情報は __プロジェクトファイルに保存される__ ため、既にコミット予定の変更が modified の状態にある場合は、
混ざってしまうため注意が必要です。

* Entity Inheritance  
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreData/KeyConcepts.html

# Show only recent files の活用

コードリーディングでは、ソースコードを飛び回ることになると思いますが、
いざコーディングするとなると、__手を加えるファイルはそれほど多くない__ 場合もあります。

しかし、手を加えたいファイルが構成上、別ディレクトリに分かれていたり、同階層にズラッと並んでいると、
Project Navigator で辿るのが面倒だったり、
Spotlight(cmd + shift + o) 使おうにも、ファイル名がまだスッとはでてこない。

そういうときは __Show only recent files__ で、__最近使ったファイルのみを Project Navigator に表示する__ のが便利です。
これ凄い便利なのに全く主張しない場所にあって、
実装がほぼ終わった後に知りました。もっと早く君と出会いたかった。

<img width="241" alt="show_only_recent_files.png" src="https://qiita-image-store.s3.amazonaws.com/0/38837/59458798-d7b0-12f9-73c0-eb801509e61e.png">

画像の通り Project Navigator の最下部にある時計マークのアイコンです。(画像は selected の状態)

# クラス図の自動生成

これは正直うまく活用できなかったのですが、紹介しておきます。

* Xcode プロジェクト内のクラスの依存関係を図示する  
https://qiita.com/shu223/items/170b899df86952544c17

大まかに下記2段階で処理を行います。

1. python スクリプトで、ソースファイルを読み込み __relation を dot ファイルに出力__
2. graphviz で可視化

通常、それなりの規模のプロジェクトでこれをやると、
__8Kを超える解像度のスパゲティ__ が生成されて心に傷を負うことになるので、

有効活用するためには、
手順 1. の段階で、__特定のサブディレクトリのみをターゲット__ にスクリプトを実行するとか、
明らかに参照元の多い __ユーティリティやヘルパーのようなファイルは事前に除いておく__ などの前処理が必要だと思います。

依存関係が綺麗に整理されているプロジェクトや、
ファイルがそれほど多くないプロジェクトであれば、特に前処理を行わずとも有効的に活用できるのかも。

# まとめ

というわけで、6つの Tips を紹介してみました。

結局のところ、突然入った案件で瞬発力を求められる場合は、__いかに早く全体像を捉えるか__ がポイントで、
そのために役立ったアクションや Xcode の機能をリストアップしたという結果になりました。

少しでも彷徨える初級 iOS エンジニアの助けになればと思います。

# 環境情報

* MacOS High Sierra 10.13.4
* Xcode 8.3.3/9.3
* Objective-C 2.0