2016-05-06 7 views
4

私は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? 
} 

これを行うには良い方法はありますか?ありがとう。

+0

空のプレースホルダに間違いはありません。誰かがGoogleアナリティクスのメソッドを使用しようとしたり、例外をスローしたりすると、何かをログに記録できます。 –

+0

Java 8は、インタフェースでデフォルトのメソッドもサポートしています。デフォルトの空のメソッドでインターフェースを定義することができます。リファレンス:https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html – mdewit

+0

基本的には、GoogleAnalyticsクラスが、それがないクラスから拡張するのではなく、インターフェースを実装する方が良いと感じています実際には "関係あり"の関係を持っています。 – mdewit

答えて

1

インターフェイスで行うことができます。
なぜ、母親のクラスを後で他のものに継承する必要がある場合。
ただ1度継承できることを忘れないでください。

関連する問題