私はAndroidアプリの2つの異なるAnalyticsサービス(Google AnalyticsとMixpanel)を使用しています。抽象メソッドの空の実装は良いアプローチですか?
私はそうのような抽象基本クラスを作成しました:
public abstract class AnalyticsService {
public abstract void trackAppOpen();
public abstract void identifyUserOnLogin();
}
それから私はAnalyticsService基本クラスから拡張具象サブクラスを作成しました。私はregisterUserOnLogin()
メソッドの空の実装を作成する必要がありましたので、
public class MPAnalytics extends AnalyticsService {
@Override
public void trackAppOpen() {
//Send event to MixPanel
}
@Override
public void identifyUserOnLogin() {
//Identify user with MixPanel
}
}
public class GoogleAnalytics extends AnalyticsService {
@Override
public void trackAppOpen() {
//Send event to Google
}
@Override
public void identifyUserOnLogin() {
//Do nothing
}
}
今、Googleアナリティクスでは、実際にユーザ識別をサポートしていません。
ユーザー識別はGoogleアナリティクスの動作ではないため、理想的にはベースAnalyticsService
クラスの一部ではなく、その代わりにMPAnalytics
クラスで定義する必要があるため、これは正しい方法ではないと思います。
しかし、このアプローチの問題はクライアント側であるため、具体的な実装について心配する必要はなく、ベースのAnalyticsService
クラスを使用して、さまざまな分析サービスをすべて参照することができます。
List<AnalyticsService> analyticsServices;
for (AnalyticsService service : analyticsServices) {
service.trackAppOpen();
service.identifyUserOnLogin(); // where should this method be?
}
これを行うには良い方法はありますか?ありがとう。
空のプレースホルダに間違いはありません。誰かがGoogleアナリティクスのメソッドを使用しようとしたり、例外をスローしたりすると、何かをログに記録できます。 –
Java 8は、インタフェースでデフォルトのメソッドもサポートしています。デフォルトの空のメソッドでインターフェースを定義することができます。リファレンス:https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html – mdewit
基本的には、GoogleAnalyticsクラスが、それがないクラスから拡張するのではなく、インターフェースを実装する方が良いと感じています実際には "関係あり"の関係を持っています。 – mdewit