最初に
アプリケーションの開発環境を構築する上で最も大事なことは何か? プラグインの導入、命名規則の設定、おそらく色々あるとは思う。 だが開発環境を構築する上で最も大事、かつ最も忘れやすいことは「**Logユーティリティの構築**」であると私は考える。Logユーティリティを構築する必要性
Logがどうして重要かは、おそらく多少の開発経験があればすぐにわかるだろう。 同時にLogを仕込むことがどれだけ**めんどくさい**ことかもわかるはずである。- メソッドの最初と最後にLogをコピペで仕込み、
- 重要な値や参照範囲の広い変数は適宜出力し、
- デバッグ時にはとにかくたくさん出力して中身を見るものの、
- 制作物のリリースでは逆にログを出力しないよう制御しなければならない。
書くだけでもうっとうしい。正直こんな作業、工数を使うだけ無駄だし、モチベも下がる。
じゃぁやっぱり効率化した方が誰のためにもなるのである。
Logユーティリティ作成手順
上記のめんどくさい作業の中で、今回自動化を図るのは1と4である。 作成手順は以下の通り。なお、筆者はEclipseでAndroid開発をしているため、内容もEclipse,Android寄りではあるが、Java開発や他のIDEでも類似の機能で実現できるはずだ。- Logユーティリティクラスの作成
- Javaコード・テンプレートの編集
基本はこれだけである。
なお、複数人での開発を行う場合は「テンプレートの共有」や「クラス・メソッド作成手順の共有」などがあるが、ここでは割愛する。
Logユーティリティクラスの作成
以下をまるっとコピペ。Androidの場合。
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にするだけで、ログの出力を制御できる。
ただしリリース時の運用として忘れやすいので、もっといい方法があったら教えてほしい…。
Javaコード・テンプレートの編集
Eclipseでの編集は以下の通り。なお、筆者はMac使用。 Winでも入るメニューの名前が違うだけで、同様の機能は存在する。"環境設定"->"Java"->"Code Style"->"Code Templates"
このメニュー内でコードテンプレートを設定できる。
特に設定しておきたいのは以下の通り。なお内容の一部に引用がある。
- Class body
private static final String TAG = ${type_name}.class.getSimpleName();
Android開発向けの eclipse コードテンプレート設定より引用
- 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});
その他必要なら、ガンガンテンプレートを編集すること。
注意点
* 手書きでメソッドやクラスを作成してはならない。当たり前だが手書きでバリバリとメソッドを作ってはテンプレートの意味が無い。
それどころか必要なところにログを挿入し忘れるなどのヒューマンエラーが発生する。
コードの挿入はできる限りIDEの機能に任せるように運用すること。プログラマはコードはできる限り書いちゃダメ。
- Java,Android標準のLogクラスを使用しない
コードを見てわかる通り、実際に使用しているのはAndroid標準のLogクラスだ。
もちろん通常のコード内にLogクラスを書いてしまうことも可能だが、
DEBUGフラグの制御外になってしまうため、ユーティリティクラスを経由しないLogの出力は厳禁だ。
重要な値の出力を行うと、下手をするとアプリの脆弱性にもつながる。注意するべし。