株式会社ゴクロの浜本です。SmartNewsでは、主にサーバサイドのURL収集およびインデクシング部分と、iOSアプリの開発を担当しています。
このエントリーでは、私が好きなIDEの1つで、Objective-Cによる開発効率を大幅に高めてくれると感じているAppCodeについて、Xcodeとの機能比較表を作ってみました。
XcodeやAppCodeの真価を引き出す上で、個人的に最重要レベルと位置付けているコマンドとショートカットキーを厳選して表にしたので(厳選という割には結構なボリュームになってしまいましたが)、チートシート的なチェックリストとしても活用していただけると思います。
AppCodeを使うようになった背景
(個人的な経緯なので、不要な方は読み飛ばしてください)
私はJavaの使用歴が長いのですが、Java開発の生産性を上げるべく、今までいろいろなIDEを試してきました。Java IDEといえばEclipseが圧倒的なシェアを誇っていますが、NetBeansやIntelliJ IDEAも根強い人気があります。とりわけ、IntelliJには熱狂的なファンが多く、私も試用してすぐIntelliJラブな状態になってしまい、Eclipseから乗り換えてしばらく使っていた時期があります。
IntelliJはJavaに限らず、Ruby, Python, PHP, HTML, JavaScript, CSSなど多彩な言語をサポートしているIDEですが、開発元のJetBrains社は言語別の特化版IDEもリリースしており(RubyMine, PyCharm, PhpStorm, WebStormなど)、最近はこれらの名前の方が有名かもしれません。
そんなJetBrainsが、2011年4月、Objective-C開発向けの新しいIDEとしてAppCodeを発表しました。JetBrainsのプロダクトに魅了されていた私はすぐ飛びつき、以後、iOSアプリの開発にはずっとAppCodeを使っています。AppCodeの当初のバージョンは、突然ハングアップするなど重たい印象がありましたが、その後どんどん改善され、最新の2.1ではほぼ問題なく安定動作しています。
AppCodeの前提条件
AppCodeの利用には次のような前提条件があり、導入のハードルになっています。
- AppCodeだけではビルド設定を細かく変更できないなど開発フローを完結できず、Xcodeとの併用が必須です。
- Xcodeが無料なのに対し、AppCodeは有償です。Personal Licenseは$99です(こちらの情報によれば、Personal Licenseでも業務利用OK)。
が、この後の比較で明らかにするように、私は上記の点を差し引いても、十分採用の検討価値があるIDEだと考えています。
本エントリーでのXcodeとAppCodeの比較項目
このエントリーでは、コーディング周りに絞って、XcodeとAppCodeを比較します。コーディング機能はIDEの核であり、使用頻度が突出して高く、開発効率向上への寄与度が大きいと考えるためです。以下のようにカテゴリを分けて、機能比較表を作ってみました。
- コードナビゲーション
- クラス/ファイル/シンボルに移動
- ファイル中の特定シンボルに移動
- .hファイルと.mファイルの切り替え
- 実装クラスとテストケースの切り替え
- 定義へ移動
- クラス階層の移動
- Localizable.stringsエントリーへ移動
- シンボルの使用状況を表示
- キャレット下の識別子ハイライト
- 差分表示
- コード補完・生成
- 補完候補のCamelHumpsによる絞り込み
- 型の認識に基づく補完
- メッセージ・画像リソース名の補完
- ソースコードの自動整形
- #importの自動挿入
- メソッドのオーバーライド・インプリメント時のコードスニペット生成
- 未実装コードのスニペット生成
- '@', '*'の自動挿入
- リファクタリング
- 名前の変更
- メソッドシグネチャの変更
- メソッドの抽出
- 変数の抽出
上記以外の機能についての比較は、こちらの記事などが参考になると思います。
なお、本エントリーで比較しているソフトウェアのバージョンは、Xcode 4.6とAppCode 2.1です。記載しているショートカットキーは、デフォルトのキーバインドに基づくものです。
徹底比較: コードナビゲーション
それでは早速、XcodeとAppCodeを比較していきます。まず、ナビゲーション関連機能です。
クラス/ファイル/シンボルに移動 | |
---|---|
Xcode [◎] | AppCode [◎] |
Command + Shift + O | Command + O (クラス) Command + Shift + O (ファイル) Command + Option + O (シンボル) |
どんな種類のシンボルでも開ける。CamelHumps検索に対応(シンボル名の大文字部を含む部分文字列で検索できる)。 | クラス(.mファイル)を開くのか、ファイルを開くのか、シンボル(変数、メソッド、etc)を開くのかによって、ショートカットを使い分ける必要がある。CamelHumps検索に対応。 |
ファイル中の特定シンボルに移動 | |
Xcode [○] | AppCode [◎] |
Ctrl + 6 | Command + F12 |
パンくずリストの右端をクリックするのと同じ。CamelHumps検索に対応。JavaScriptファイル中のシンボルも若干開ける。 | CamelHumps検索に対応。インスタンス変数やスーパークラスのフィールドも開ける。JavaScript、CSSファイル中のシンボルも開ける。 |
.hファイルと.mファイルの切り替え | |
Xcode [○] | AppCode [◎] |
Command + Ctrl + ↑ | Command + Ctrl + ↑ |
ファイルの表示を切り替えるのみ。 | 単純に切り替えるだけでなく、キャレット下のシンボルと対応する箇所にジャンプしてくれる。 |
実装クラスとテストケースの切り替え | |
Xcode [×] | AppCode [◎] |
(なし) | Command + Shift + T |
機能が存在しない。 | EclipseのQuick JUnitプラグインのように、テスティングペアを行き来できる。 |
定義へ移動 | |
Xcode [◎] | AppCode [◎] |
Command + Ctrl + J | Command + B(単一定義に移動する場合) Command + Option + B(複数定義から選択する場合) |
シンボルの宣言部と実装部を行き来できる。実装部が複数存在する場合は、ポップアップで選択可。 | Xcodeと同様だが、コマンドが2種類用意されている。 |
クラス階層の移動 | |
Xcode [△] | AppCode [◎] |
(Symbol Navigatorを使う?) | Command + U (スーパークラスへ移動) Command + Option + B (サブクラスへ移動) Ctrl + H (階層ビューを開く) |
クラス名を右クリックしてReveal in Symbol Navigatorを実行すれば、クラス階層を閲覧可能。 | ショートカットキーで素早く階層間を移動できるほか、階層ビューを開くことも可能。 |
Localizable.stringsエントリーへ移動 | |
Xcode [×] | AppCode [◎] |
(なし) | Command + B |
機能が存在しない。 | NSLocalizedString()の引数部でCommand + Bを押下すると、対応するLocalizable.stringsエントリーに飛べる。複数ロケールが存在する場合はポップアップから選択可。 |
シンボルの使用状況を表示 | |
Xcode [×] | AppCode [◎] |
(なし) | Command + Option + F7 |
Search Navigatorを使ってテキストマッチングはできるが... | シンボルを参照している箇所を一覧表示し、移動できる。Localizable.stringsのエントリー上でも実行可能。 |
キャレット下の識別子ハイライト | |
Xcode [△] | AppCode [◎] |
点線でハイライト表示される。 | write accessとread accessが色分けされることに加え、エディタ右端のバーにファイル中での出現位置がストライプ表示されるので、識別子の使用状況を把握しやすい。 |
差分表示 | |
Xcode [○] | AppCode [◎] |
Version editorモードで、直前のコミットとの差分を確認できる。 | エディタ左端のバーのストライプ表示で直接差分を確認でき、その場で個別revertもできる。Version editorと同様の差分ビューも利用可能。 |
徹底比較: コード補完・生成
続いて、コードの補完や自動生成に関する機能の比較です。
補完候補のCamelHumpsによる絞り込み | |
---|---|
Xcode [×] | AppCode [◎] |
コード補完中は前方一致による絞り込みしかできない。 | コード補完中でも、CamelHumpsによる部分一致絞り込みが可能。 |
型の認識に基づく補完 | |
Xcode [×] | AppCode [◎] |
(なし) | Ctrl + Shift + Space |
SmartType Completionと呼ばれる補完機能があり、文脈に応じて補完候補を自動的に絞り込んでくれる。 | |
メッセージ・画像リソース名の補完 | |
Xcode [×] | AppCode [◎] |
リソース名の補完機能は特にない。 | NSLocalizedString()ではLocalizable.strings中のキーが、UIImage::imageNamed:では画像ファイル名が、自動的に補完候補として出てくる。 |
ソースコードの自動整形 | |
Xcode [×] | AppCode [◎] |
(なし) | Command + Option + L |
自動インデント機能はあるが、整形はできない。 | インデント、空白、折り返しなどを設定に基づいて揃えてくれる。チーム開発での記法統一に役立つ。 |
#importの自動挿入 | |
Xcode [×] | AppCode [◎] |
(なし) | Alt + Enter |
機能が存在しない。 | 未解決の参照を記述すると、自動的に#importの挿入をサジェストしてくれる。 |
メソッドのオーバーライド・インプリメント時のコードスニペット生成 | |
Xcode [○] | AppCode [◎] |
(メソッド名の先頭を入力) | Ctrl + O (オーバーライド) Ctrl + I (インプリメント) |
メソッド名の先頭文字列を入力し、補完リストを表示させる。候補数が多いと、所望のメソッドを特定するのが大変。 | オーバーライド/インプリメントと、目的別にショートカットを使い分けることができ、さらにCamelHumpsで容易に絞り込める。 |
未実装コードのスニペット生成 | |
Xcode [×] | AppCode [◎] |
(なし) | Alt + Enter |
機能が存在しない。 | まだ実装していないメソッドの呼び出しを記述すると、そのシグネチャを認識して定義を自動生成してくれる。 |
'@', '*'の自動挿入 | |
Xcode [×] | AppCode [◎] |
機能が存在しない。 | " を入力すると、その前に @ が自動挿入される。また、クラス名を入力すると、インスタンス名を入力するよりも前に * が自動挿入される。地味に嬉しい。 |
徹底比較: リファクタリング
最後に、リファクタリング機能の比較です。
名前の変更 | |
---|---|
Xcode [○] | AppCode [◎] |
Command + Option + Shift + R | Shift + F6 |
ダイアログで新しい名前を入力する方式。Objective-C, C, C++のシンボルのみリネーム可能。 | インラインで直接リネームできる。Localizable.stringsのキーや、JavaScript、CSSの要素もリネーム可能。 |
メソッドシグネチャの変更 | |
Xcode [×] | AppCode [◎] |
(なし) | Command + F6 |
機能が存在しない。 | 引数の追加や削除、戻り値の型変更が可能。 |
メソッドの抽出 | |
Xcode [◎] | AppCode [◎] |
(デフォルトではショートカットの割り当てなし。コンテキストメニューからExtract...を選択) | Command + Option + M |
既存の式を新しいメソッドとして抜き出すことができる。 | 既存の式を新しいメソッドとして抜き出すことができる。 |
変数の抽出 | |
Xcode [×] | AppCode [◎] |
(なし) | Command + Option + V |
機能が存在しない。 | 既存の式を新しい変数として抜き出すことができる。 |
まとめ
いかがでしょうか。XcodeとAppCodeを比較したとき、コーディング環境に限定すると、AppCodeにかなりの優位性があることが分かると思います。興味を持たれた方、ぜひAppCodeを試してみてください。