2017-02-04 6 views
0

私はGoogle I/O Android Appを見ていました。linkがありました。ヘルパー/ユーティリティのクラスで静的メソッドがほとんど使用されていました。しかし、私は多くの人がヘルパークラスで静的メソッドの使用を推奨していないことを知っています。ヘルパークラスのベストアプローチアンドロイド

警告ダイアログや通知を表示するような作業を行っている3つのアクティビティがある場合は、3つのアクティビティすべてに同じコードを追加する必要があります。 10種類のアクティビティからファイルを作成している場合はどうなりますか?同じコードを繰り返し書くよりも、静的メソッドでヘルパークラスを使用する方が良いでしょうか?もしそうでなければ、最良のアプローチは何か。

public class NotificationHelper { 

    /** 
    * create notification 
    * @param context activity context 
    * @param title notification title 
    * @param contentText notification text 
    * @param mNotificationId notification id 
    */ 
    public static void setUpNotification(Context context, String title, String contentText, int mNotificationId) { 

    NotificationCompat.Builder mBuilder = 
      new NotificationCompat.Builder(context).setLargeIcon((BitmapFactory.decodeResource(context.getResources(),R.drawable.launcher))) 
        .setSmallIcon(R.drawable.ic_notif) 
        .setContentTitle(title) 
        .setContentText(contentText).setPriority(NotificationCompat.PRIORITY_MAX); 

    Intent resultIntent = new Intent(context, MainActivity.class); 
    PendingIntent resultPendingIntent = 
      PendingIntent.getActivity(
        context, 
        0, 
        resultIntent, 
        PendingIntent.FLAG_UPDATE_CURRENT); 
    mBuilder.setContentIntent(resultPendingIntent); 
    mBuilder.setOngoing(true); 
    NotificationManager mNotificationManager = 
      (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); 
    mNotificationManager.notify(mNotificationId, mBuilder.build()); 
} 

    /** 
    * cancel notification 
    * @param ctx context 
    * @param notifyId id of notification to be cancelled 
    */ 
    public static void cancelNotification(Context ctx, int notifyId) { 
    NotificationManager nMgr = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE); 
    nMgr.cancel(notifyId); 
    } 
} 

答えて

2

Helper classesの使用は、オブジェクト指向プログラミングでは議論の余地がほとんどありません。通常のクラスを使用し、クラスのオブジェクトを含めることができます。あるいは、共通のコードを基底クラスに入れてから、それを拡張することもできます。しかし、ヘルパークラスを使用することを決めた場合は、ガイドラインとしてあなたを助けるかもしれないいくつかのポイントがあります。

  1. ヘルパークラスは、ユーティリティエンティティです。これらはユーティリティのように使用する方が良いので、デフォルトのコンストラクタをプライベートとしてマークすることで、インスタンス化と拡張を防ぐことができます。

  2. 「静的」メソッドを公開します。メソッドがユーティリティクラスのパッケージのクラスで必要とされているかどうかを確認してから、acess修飾子をpackage-privateとして保持し、必要に応じて外部のクラスもpublicにすることができます。その目的は、パブリックAPIでパッケージの詳細をあまりにも多く公開することを防ぐことです。また、パラメータと戻り値の型に抽象を持たせることもできます。

  3. フィールドを持たないことによってstatelessなどのクラスを維持してください。 (静的な)フィールドを保持することは、必要でないときでさえ参照オブジェクトを導く可能性がある。

  4. ヘルパークラスのユーザーがその意図を知っているように、またそれらが単なるユーティリティクラスであるように、そのようなクラスを適切に名前を付けます。また、使用方法に合わせて名前を付け、混乱を最小限に抑えます。

+1

私は2から離れてすべての点に同意しますが、一般的には、実用的な方法であっても、最小限の範囲を維持する必要があります。私は 'package-private'で始まり、必要に応じて' public'として公開する方が好きです。 –

+0

@マーク・キーン、はい合意しました。あなたの意見を追加します。私はちょうど静的メソッドを公開すると言っていたと言いながら、これを先に進んで公開しました。 –

+0

私はさまざまな場所から値を読み書きするデータベースを持っています。そのメソッドをヘルパークラスで静的にする必要がありますか? –

1

いくつかのポイントをユーティリティクラス(そのうちのいくつかは、すでに前の回答に触れ)の使用に関連覚えておくべき - あなたが使用してのような一般的な何かを活動のカップルを持っている場合、一般的に

  1. 同じネットワーキングレイヤーで一般的なエラープロンプトと通知を表示する場合は、BaseActivityに入力して、すべてのアクティビティでそれらを拡張するのが最善の方法です。可能であれば、ビヘイビアをグループ化するなどのOOPSの概念をインターフェイスに使用して、子アクティビティが拡張する必要のある抽象メソッドを定義し、そのようなものを定義します。 BaseActivityで特定のことを行うのを避け、子供の活動が可能な限り多くの制御を取るようにしてください。

  2. ユーティリティクラスを持つ必要がある場合は、シングルトンで状態を一切作成しないでください。

  3. ユーティリティメソッドで非同期タスクを実行しないでください。 Androidの各コンポーネントはライフサイクルを持ち、非同期タスクはホスティングコンポーネントのライフサイクルに縛られている必要があります。たとえば、しばらく時間がかかると思われるFile操作を実行している場合は、asynctaskまたは呼び出し側コンポーネントの何かにラップしてください。

  4. ユーティリティクラスは、注射の良いメンバーです(私の意見!)。あまりにも多くのユーティリティライブラリを使いすぎると、DaggerのようなDIライブラリーを使って簡単に使えるようにしてください。

関連する問題