Android

BaseActivityに処理を求めるのは間違っているだろうか

More than 3 years have passed since last update.

先日行われましたDroidKaigiのFireside Chatにおいて、BaseActivityの是非についての話が出ました。

その場では概ね不評…というか使わない方がいいという話になったのですが、このエントリはそれに異を唱える内容です。


そもそもBaseActivityとは何か

要は、アプリ内で使うActivityの基底となるクラスのことです。

複数のActivityで使うような処理をBaseActivityに書いて処理をまとめて共通化しておくことで、サブクラスにおけるコードの量を少なくするのが狙いです。


なぜBaseActivityは嫌われるのか

iOSの話になりますが、こちらのエントリに書かれていることとほぼ同じ理由です。

つまり、BaseActivityが便利故ににいろいろ処理を書きすぎて肥大化し、なおかつ継承したクラスがそれに依存してしまうのが問題なわけです。

他のActivityでも同じ処理をやるからBaseActivityに書けばいいや…という実装を続けていると、いつの間にかよくわからない変数やメソッドが増えていて、

「BaseActivityを継承したけどこのメソッド何に使うの…?」ということになってしまいます。


BaseActivityはダメな子なのか?

そんなことはありません。使い方を間違えなければ全く問題ないのです。

要は、継承したクラスで必ず使うような処理「のみ」が書かれていればいいわけです。

では、どういった場合にBaseActivityを使うと便利になるのでしょうか?いくつか例を挙げます。


BaseActivityを便利に使おう


1. ButterKnife#inject

ViewのInject等をアノテーションを使って簡単に記述できるライブラリ。

通常、Activity#onCreate で呼び出しますが、すべてのActivityでButterKnifeを使うのであれば、BaseActivityに書いてしまうと便利です。

setContentView のあとに実行する必要がありますので、Overrideして記述します。


BaseActivity.java

@Override

public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
ButterKnife.inject(this);
}


2. (Otto) Bus#register / unregister

Observableパターンを簡単に実装できるライブラリ。

これのregister/unregisterもBaseActivityでやっておけば、いちいちActivityごとに書かなくてすみます。


BaseActivity.java

@Override

protected void onResume() {
super.onResume();
BusHolder.get().register(this);
}

@Override
protected void onPause() {
BusHolder.get().unregister(this);
super.onPause();
}


ちなみに、Ottoと似たようなライブラリにEventBusがありますが、こちらはregisterしたオブジェクト内に onEvent という名前のメソッドを作っておかないとエラーになるため、今回のようにBaseActivityを使う場合はOttoのほうがよいでしょう。


注意点

例を見てもらうとわかると思うんですが、基本的にonCreate等の、必ず実行されるようなメソッドをオーバーライドして処理を追加するのが便利な使い方です。

もし、必ず実行はさせたいんだけど各クラスで処理を分けたい…という場合は、abstractメソッドにしておいて実装は各Activityでやるとよいと思います。

その場合は、当然サブクラスにおいて実装を書かなければいけないので、それで本当によいかは設計時に考慮する必要があります。


まとめ

何度も書いていますが、BaseActivityには「継承するすべての」Activityにおいて、「必ず」「共通して」実装されるべき処理のみ記述してください。

もしそうなっていない場合は設計を見直すべきです。

もちろん、BaseActivityなんていらねーよという方は使わなくても全然OKです。

ただ一概にdisるようなものではないよ、ということを言いたかっただけなのでした。


おまけ

「ところでこいつを見てくれ。これをどう思う?」

「すごく…(無駄に)大きいです…」

去年のGoogle I/Oのアプリのコードです。

…みなさんはこういうマッチョなActivityは作らないようにしましょうね!