В объектно-ориентированном программировании вы наверняка слышали о синглтоне. Могу сказать, что это одна из самых спорных и дискуссионных тем программы. Некоторые программы считают, что это одна из лучших вещей, о которых может мечтать разработчик, в то время как другие говорят, что разработчик никогда не должен использовать это. Это зависит от вас, в какой категории вы находитесь. По крайней мере, в какой категории вы должны знать, что такое синглтон и как мы можем достичь этого в дартсе. При этом его хорошо использовать в конкретных случаях.
- Некоторые люди говорят, что их следует избегать любой ценой. ❌
- Другие более прагматичны и используют их только в конкретных случаях. 🔍
- А некоторые используют их волей-неволей, как будто завтра не наступит. 😅
К концу этой статьи вы узнаете, что такое синглтон и как его реализовать в дартс.
Что такое синглтон?
Шаблон синглтон — это шаблон проектирования программного обеспечения, который ограничивает создание экземпляра класса одним «единственным» экземпляром.
Может быть, вы поняли это из определения, а может быть, и нет. Итак, позвольте мне ясно вам это объяснить (вот почему я здесь :-)).
Другими словами, шаблон 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 имеют глубоко вложенные деревья виджетов. В результате синглтоны упрощают доступ к нужным нам объектам из любого виджета. Но у синглтонов много недостатков, и есть лучшие альтернативы, которые по-прежнему просты в использовании.
Недостатки
- Синглтоны сложно тестировать
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