eclipse:Logユーティリティを作成してLog出力の手間を減らす

<h1>最初に</h1>
アプリケーションの開発環境を構築する上で最も大事なことは何か？
プラグインの導入、命名規則の設定、おそらく色々あるとは思う。
だが開発環境を構築する上で最も大事、かつ最も忘れやすいことは「**Logユーティリティの構築**」であると私は考える。
<h2>Logユーティリティを構築する必要性</h2>
Logがどうして重要かは、おそらく多少の開発経験があればすぐにわかるだろう。
同時にLogを仕込むことがどれだけ**めんどくさい**ことかもわかるはずである。

1. メソッドの最初と最後にLogを**コピペで**仕込み、
2. 重要な値や参照範囲の広い変数は適宜出力し、
3. デバッグ時にはとにかくたくさん出力して中身を見るものの、
4. 制作物のリリースでは逆にログを出力しないよう制御しなければならない。

書くだけでもうっとうしい。正直こんな作業、工数を使うだけ無駄だし、モチベも下がる。
じゃぁやっぱり効率化した方が誰のためにもなるのである。
<h1>Logユーティリティ作成手順</h1>
上記のめんどくさい作業の中で、今回自動化を図るのは１と４である。
作成手順は以下の通り。なお、筆者はEclipseでAndroid開発をしているため、内容もEclipse,Android寄りではあるが、Java開発や他のIDEでも類似の機能で実現できるはずだ。

1. Logユーティリティクラスの作成
2. Javaコード・テンプレートの編集

基本はこれだけである。
なお、複数人での開発を行う場合は「テンプレートの共有」や「クラス・メソッド作成手順の共有」などがあるが、ここでは割愛する。

<h4>Logユーティリティクラスの作成</h4>
以下をまるっとコピペ。Androidの場合。

```lang:LogUtil.java

package com.example.util;

import android.content.Context;
import android.util.Log;
import android.widget.Toast;

public class LogUtil {
    
    private static final boolean IS_DEBUG = true;
    /* プロジェクト名を入れておくなどの使い方をすると、grepをかけるときに便利 */
    private static final String TAG = "[hogehoge]";
    
    public static void e(String tag, String msg) {
        if (IS_DEBUG) Log.e(TAG + tag, msg);
    }
    public static void w(String tag, String msg) {
        if (IS_DEBUG) Log.w(TAG + tag, msg);
    }
    public static void i(String tag, String msg) {
        if (IS_DEBUG) Log.i(TAG + tag, msg);
    }
    public static void d(String tag, String msg) {
        if (IS_DEBUG) Log.d(TAG + tag, msg);
    }
    public static void v(String tag, String msg) {
        if (IS_DEBUG) Log.v(TAG + tag, msg);
    }
    
    /* 後述のテンプレートで使用する */
    public static void methodStart(String tag, String msg) {
        if (IS_DEBUG) Log.i(TAG + tag, msg + " Start");
    }
    public static void methodEnd(String tag, String msg) {
        if (IS_DEBUG) Log.i(TAG + tag, msg + " End");
    }
    
    /* Android特有。Toast機能を使うと操作中に発生したLogが実機で見られるため、デバッグでも使える */
    public static void toast (Context context, String tag, String msg) {
        if (IS_DEBUG) Toast.makeText(context, tag + ":" + msg, Toast.LENGTH_LONG).show();
    }
}

```

デバッグ時は`IS_DEBUG`をtrueに、リリース時はfalseにするだけで、ログの出力を制御できる。
ただしリリース時の運用として忘れやすいので、もっといい方法があったら教えてほしい…。

<h4>Javaコード・テンプレートの編集</h4>
Eclipseでの編集は以下の通り。なお、筆者はMac使用。
Winでも入るメニューの名前が違うだけで、同様の機能は存在する。

`"環境設定"->"Java"->"Code Style"->"Code Templates"`

このメニュー内でコードテンプレートを設定できる。
特に設定しておきたいのは以下の通り。なお内容の一部に引用がある。

* Class body

`private static final String TAG = ${type_name}.class.getSimpleName();`

[Android開発向けの eclipse コードテンプレート設定](http://qiita.com/Nunocky/items/02dd21db40a1bd451808)より引用

* Method body

`// ${todo} Auto-generated method stub
LogUtil.methodStart(TAG,${enclosing_method});
LogUtil.methodEnd(TAG,${enclosing_method});
${body_statement}`

こんな風にユーティリティクラスのメソッドをテンプレートに入れておくことで、
メソッドの最初と最後に自動的にログが挿入される。
（メソッド途中のreturnなどは自分でやるしかないかも。）

* Constructor body

`${body_statement}
// ${todo} Auto-generated constructor stub
LogUtil.methodStart(TAG,${enclosing_type});
LogUtil.methodEnd(TAG,${enclosing_type});`

その他必要なら、ガンガンテンプレートを編集すること。

<h4>注意点</h4>
* 手書きでメソッドやクラスを作成してはならない。

当たり前だが手書きでバリバリとメソッドを作ってはテンプレートの意味が無い。
それどころか必要なところにログを挿入し忘れるなどのヒューマンエラーが発生する。
コードの挿入はできる限りIDEの機能に任せるように運用すること。プログラマはコードはできる限り書いちゃダメ。

* Java,Android標準のLogクラスを使用しない

コードを見てわかる通り、実際に使用しているのはAndroid標準のLogクラスだ。
もちろん通常のコード内にLogクラスを書いてしまうことも可能だが、
DEBUGフラグの制御外になってしまうため、ユーティリティクラスを経由しないLogの出力は厳禁だ。
重要な値の出力を行うと、下手をするとアプリの脆弱性にもつながる。注意するべし。