В объектно-ориентированном программировании вы наверняка слышали о синглтоне. Могу сказать, что это одна из самых спорных и дискуссионных тем программы. Некоторые программы считают, что это одна из лучших вещей, о которых может мечтать разработчик, в то время как другие говорят, что разработчик никогда не должен использовать это. Это зависит от вас, в какой категории вы находитесь. По крайней мере, в какой категории вы должны знать, что такое синглтон и как мы можем достичь этого в дартсе. При этом его хорошо использовать в конкретных случаях.

  • Некоторые люди говорят, что их следует избегать любой ценой. ❌
  • Другие более прагматичны и используют их только в конкретных случаях. 🔍
  • А некоторые используют их волей-неволей, как будто завтра не наступит. 😅

К концу этой статьи вы узнаете, что такое синглтон и как его реализовать в дартс.

Что такое синглтон?

Шаблон синглтон — это шаблон проектирования программного обеспечения, который ограничивает создание экземпляра класса одним «единственным» экземпляром.

Может быть, вы поняли это из определения, а может быть, и нет. Итак, позвольте мне ясно вам это объяснить (вот почему я здесь :-)).

Другими словами, шаблон Singleton гарантирует, что когда-либо будет создан только один экземпляр класса, что упрощает доступ к нему как к глобальной переменной.

Реализация в дартсе..

class Singleton {
  /// private constructor
  Singleton._internal() {
    // initialization logic 
  }

  /// the one and only instance of this singleton
  static final _instance = Singleton._internal();

 factory Singleton() {
    return _instance();
  }
}

В приведенном выше коде мы сделали конструктор закрытым, чтобы экземпляр класса не мог быть создан за пределами файла, в котором он определен. Мы также определили экземпляр как частный, поэтому используем метод получения для получения экземпляра, потому что мы не хотим, чтобы кто-то по ошибке изменил единственный экземпляр нашего класса.

На этом часть кодирования завершается, но после этого начинается важная часть: почему и как использовать класс Singleton в dart. Используется ли он вообще в дартсе или нет?

Одним из крупнейших пользователей синглтона является Firebase. Если вы создали какое-либо приложение или веб-сайт, то весьма вероятно, что вы использовали Firebase или, по крайней мере, знаете о firebase. Плагины Firebase в дартс используют синглтон

И единственный способ вызвать их методы — использовать геттер instance:

FirebaseFirestore.instance.doc('path/to/document');
FirebaseFunctions.instance.httpsCallable('createOrder');
FirebaseMessaging.instance.deleteToken();

Итак, вы думаете, что если google/firebase использует это, значит, это лучше, и мы также можем использовать его в нашем проекте, но подождите, прежде чем делать это. Большинство библиотек используют синглтон только для того, чтобы вы не могли создавать более одного экземпляра в своем коде. Но при написании кода приложения мы должны быть очень осторожны с их использованием, поскольку они могут привести к множеству проблем в нашей кодовой базе.

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

Недостатки

  1. Синглтоны сложно тестировать

2. Синглтоны — это неявные зависимости

3. Ленивая инициализация

4. Безопасность потоков

Примечание. В Dart все глобальные переменные загружаются по умолчанию (и это также верно для статических переменных класса). сильный>). Это означает, что они инициализируются только при первом использовании. С другой стороны, локальные переменные инициализируются сразу после их объявления, если они не объявлены как late.

Альтернативы синглтонам

Используйте провайдеров Riverpod: —

Riverpod позволяет легко создавать провайдеров в виде глобальных переменных:

final authRepositoryProvider = Provider<FirebaseAuthRepository>((ref) {
  return FirebaseAuthRepository(FirebaseAuth.instance);
});

А если у нас есть объект ref, мы можем легко прочитать любой провайдер, чтобы получить его значение:

final authRepository = ref.read(authRepositoryProvider);

В результате нам нужно вызвать FirebaseAuth.instance только один раз во всей базе кода (а не много раз), поскольку теперь мы можем получить или читать. его значение (с помощью get_it или Riverpod).

В отличие от решений на основе InheritedWidget или пакета Provider, провайдеры Riverpod живут вне дерева виджетов. Это делает их безопасными в использовании во время компиляции, без исключений во время выполнения. Дополнительную информацию об этом можно найти в моем Основном руководстве по Riverpod.

Заворачивать

Синглтоны упрощают доступ к зависимостям в вашем коде. Но они создают больше проблем, чем решают. Лучшая альтернатива — управлять зависимостями с помощью проверенных в боевых условиях пакетов, таких как Riverpod.

Приятного кодирования..!!

Еще из АйРайан Бишт

Вы можете купить мне кофе по адресу: - https://www.buymeacoffee.com/aryanbisht

Путешествие по повышению уровня кодирования и разработки

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Если вы нашли это полезным, хлопайте в ладоши по истории и подписывайтесь на автора 👉
  • 🔔 Следуйте за нами: LinkedIn