きれいめ系iOSプログラマのためのモテXcode5コーデ術(Uncrustify, VVDocumenter)

こんにちは。haranicleです。
今回は、きれいなソースコードを生産したい「きれいめ系プログラマ」な皆さんのために、
コードフォーマッタの設定とコメントの記述を助けてくれるXcodeのプラグインを紹介します。

**※Xcode5.1で使用する場合は、以下のように設定してください。(2014/04/06追記)**
[iOSモテコーデ術Xcode5.1対応](http://blog.haranicle.net/motecode-xcode5_1/ "iOSモテコーデ術Xcode5.1対応")

# コードフォーマッタ

開発メンバが多かったり、期間が長いプロジェクトだとコードフォーマットがバラバラでイケてないソースコードが生産されがちです。
モテなソースコードを生産するために、コードフォーマットを決めて自動で整形してあげましょう。
今回は以下を実現します。

- Xcode5でビルドに成功したタイミングで、自動的にコードフォーマッタを実行できる。

- プロジェクト毎に異なるコードフォーマットを設定できる。

※本章は下記ページをベースに記載しています。
[Xcode で コードフォーマッター Uncrustify を使う - FUKULOG開発者ブログ](http://fukulog.github.io/blog/2013/05/22/using-uncrustify-in-xcode/ "Xcode で コードフォーマッター Uncrustify を使う - FUKULOG開発者ブログ")

## 前提条件

- Homebrewがインストール済みであること。

- Xcode5とCommand Line Toolsがインストール済みであること。

- 試しにフォーマッタを実行してみるXcodeのプロジェクト(今回はMoteSampleという名前のSingle View Applicationフォーマットのプロジェクト)を作成していること。

以下の説明は、これらの条件を満たしていることが前提です。

## Uncrustifyのインストール

Uncrustifyをインストールします。
Xcodeのプラグイン版もありますが、今回は、ビルド時に自動実行させるためにHomebrew版を使用します。
以下のコマンドをターミナルで実行してください。

```:
$ brew install uncrustify
```

## Uncrustifyを実行するスクリプトの作成

`~/bin/`配下(フォルダがない場合は新規に作成する)に`uncrustify`という名前のファイルを作成し、`uncrustify`に以下を記述します。

```ruby:uncrustify
#!/usr/bin/ruby
base_path = ENV['PWD']

puts "running uncrustify for xcode project path: #{base_path}"

if base_path != nil
  paths = `find "#{base_path}" -name "*.m" -o -name "*.h" -o -name "*.mm" -o -name "*.c"`
  if paths.kind_of?(String) then
    paths = paths.split(/\r?\n/).map {|line| line.chomp}
  end
  paths = paths.collect do |path|
    path.gsub(/(^[^\n]+?)(\n)/, '"\\1"')
  end
  paths = paths.join(" ")
  result = `/usr/local/bin/uncrustify -c "#{base_path}"/.uncrustifyconfig --no-backup #{paths}`;
  puts result
else
  puts "Invalid base path..."
end
```
(2013/12/15修正　paths = `find... の結果がArrayではなく改行区切りのStringで取得されてしまった時にコードフォーマッタを実行できないバグを修正しました。)

## スクリプトに実行権限を追加

以下のコマンドをターミナルで実行して、スクリプトに実行権限を付与します。

```:
$ chmod +x ~/bin/uncrustify
```

## Uncrustifyのフォーマットの作成

MoteSampleフォルダ(プロジェクトフォルダのルート)内に`.uncrustifyconfig`というファイルを作成し、下記ページのフォーマットを記述します(各パラメータについて日本語解説がついてて素敵です)。

[uncrustify - 意識の高さからかコードフォーマッター設定を公開 - Qiita [キータ]](http://qiita.com/ayakix/items/3f05da9541b8e130e39f "uncrustify - 意識の高さからかコードフォーマッター設定を公開 - Qiita [キータ]")

## Xcodeの設定

Xcode>Preferences...>Behaviors>Build>Succeedsと順に選択し、Runのチェックボックスを✓します。
次にRunの横のドロップダウンからChoose Script...をクリックし、`~/bin/uncrustify`を選択してOpenをクリックします。

これでXcodeでビルド成功時に自動でフォーマッタが走るようになりました。
Command Line Toolsがインストールされていないと実行されないので注意してください。
(僕はココで若干ハマりました...)

## 動作確認

MoteSampleのViewController.mに以下を記述します。

```objc:ViewController.m
-(BOOL)isMoteru:(NSInteger)age    faceSize:(CGSize)faceSize money:(NSInteger)money{return NO;}
```
⌘+Bでビルドし、ビルド成功のタイミングで以下のように整形されれば成功です。

```objc:ViewController.m
- (BOOL)isMoteru:(NSInteger)age faceSize:(CGSize)faceSize money:(NSInteger)money
{
    return NO;
}
```

`.uncrustifyconfig`をチームで共有すれば、全員が同じコードフォーマットのソースコードを生産できますね。

# VVDocumenter

Uncrustifyはインデントなどの整形は出来ますが、変数名やコメントの記述方法については整形できません。
変数名は仕方ないとして、せめてコメントのフォーマットは統一したい！
折角コメント書くんだからAppledocを使ってAPIドキュメントを作りたい！
そんなきれいめ系プログラマなあなたにおすすめしたいのがVVDocumenterです。
VVDocumenterはXcodeで"///"と入力すると、自動的にJavadocライクなコメントを生成してくれるXcodeのプラグインです。

## 前提条件

- Xcode5がインストール済みであること。

- 試しにVVDocumenterを実行してみるXcodeのプロジェクト(今回はMoteSampleという名前のSingle View Applicationフォーマットのプロジェクト)を作成していること。

以下の説明は、これらの条件を満たしていることが前提です。

## VVDocumenterのインストール

### ダウンロード

下記URLからVVDocumenter-Xcodeを取得します。
git cloneするなりダウンロードするなりお好きにどうぞ。

[onevcat/VVDocumenter-Xcode · GitHub](https://github.com/onevcat/VVDocumenter-Xcode "onevcat/VVDocumenter-Xcode · GitHub")

### インストール

1. ダウンロードしてきたファイルの中のVVDocumenter-Xcode.xcodeprojをXcodeで開きます。

2. ⌘+Bでビルドし、Buld Succeededと表示されればインストール成功です。

3. Xcodeを再起動します。

## 動作確認

MoteSampleを開き適当なメソッドの前にカーソルを合わせ、"///"を入力します。
Javadocライクなコメントが挿入されたら成功です。
@paramや@returnを自動で挿入してくれるので便利ですね。

## おまけ
###Xcodeでリファレンス表示も！

VVDocumenterでコメントを書いておくとXcodeでメソッド名を⌥+クリックでサクッとリファレンスを見ることができます。

こんな感じでソースコードを書いておいて。

![source.png](https://qiita-image-store.s3.amazonaws.com/0/8093/88506319-fe00-f447-b9e0-aa0835c998df.png)

メソッド名を⌥+クリックでリファレンス表示！

![reference.png](https://qiita-image-store.s3.amazonaws.com/0/8093/d63c063c-548c-30dc-ff35-d520288dc303.png)

これだけでも、インストールする価値がありますね。

###Appledocも！

上記ソースコードからAppledocでAPIドキュメントを生成するとこんな感じになります。

![appledoc.png](https://qiita-image-store.s3.amazonaws.com/0/8093/8cbcf89c-0119-8dc0-e5c3-25df8860033e.png)


#おわりに

コードフォーマッタとVVDocumenterを設定したのに全然モテない！おかしい！