2017-02-04 2 views
0

Я искал приложение Android для ввода-вывода Google iosched link и увидел, что они используют в основном свои статические методы в своих классах helper/util. Тем не менее, я обнаружил, что многие люди не рекомендуют использовать статические методы в вспомогательных классах.Помощник класса лучший подход android

Предположим, что если у меня есть 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

Usuage из Helper classes мало спорно в объектно-ориентированном программировании. Вы можете использовать обычный класс и включать объект класса. Или вы можете поместить общий код в базовый класс, а затем расширить его. Но если мы решили использовать классы Помощника, то ниже приведены несколько пунктов, которые могут помочь вам в качестве руководства.

  1. Классы-помощники - это служебные объекты. Они лучше используются так же, как и утилита, поэтому предотвращают создание и расширение, отмечая конструктор по умолчанию как закрытый.

  2. Выложить «статические» методы. Посмотрите, нужны ли методы только классам в пакете по классу утилиты, а затем сохраните acess-модификатор как private-package, а в случае необходимости и вне класса, вы можете сделать их общедоступными. Цель состоит в том, чтобы предотвратить чрезмерное чрезмерное отображение деталей пакета публичными API-интерфейсами. Вы также можете попробовать абстракции в параметрах и возвращаемом типе.

  3. Постарайтесь, чтобы такие классы, как stateless, не имели полей. Сохранение полей (статических) может привести к привязке объектов, даже если они не нужны.

  4. Назовите такие классы правильно, чтобы пользователи класса-помощника знали свое намерение, а также что они просто классы полезности. Также назовите методы в соответствии с использованием и чтобы свести к минимуму путаницы.

+1

Я согласен со всеми точками, отличными от 2, как правило, я считаю, что минимальный объем должен поддерживаться даже для полезных методов. Я предпочитаю начинать с 'package-private' и только раскрывать как' public', если это необходимо. –

+0

@ Марк Кин, да, согласился .. добавит вашу точку. Я просто хотел сказать, чтобы разоблачить статические методы, и, сказав это, сделал шаг вперед и добавил публику. –

+0

У меня есть база данных, которая считывает и записывает значения из разных мест. Должен ли я сделать свой метод статическим в классе-помощнике –

1

Несколько моментов, чтобы помнить, связанные с использованием полезных классов (некоторые из них уже затрагивали предыдущий ответ) -

  1. Вообще, если у вас есть несколько мероприятий, делая что-то общее, как с помощью один и тот же сетевой уровень, показывающий общие подсказки и уведомления об ошибках, лучший подход заключается в том, чтобы поместить их в BaseActivity и позволить всем вашим действиям расширить их. Если вы можете, используйте концепции OOPS, такие как поведение группировки, в интерфейсы, определяя абстрактные методы, которые должны распространяться дочерние действия и такие вещи. Избегайте делать что-либо конкретное в BaseActivity и позволяйте дочерним действиям принимать как можно больше контроля.

  2. Если у вас есть классы полезности, сделайте их singleton и без какого-либо состояния.

  3. Избегайте выполнения задач async в утилитах. Помните, что каждый компонент на Android имеет жизненный цикл, и любая задача async, которую вы делаете, должна быть привязана к жизненному циклу компонента хостинга. Так, например, если вы делаете операцию File, которая, по вашему мнению, занимает некоторое время, затем заверните ее в asynctask или что-то в своем вызывающем компоненте.

  4. Полезные классы - хорошие члены для инъекций (мое мнение!).Попробуйте использовать библиотеку DI, такую ​​как Dagger, чтобы сделать вашу жизнь проще, если вы в конечном итоге используете слишком много библиотек.