Синглтоны, как известно, плохая практика, угловые основаны на синглетонах. Это плохо?

0

Все услуги в Angular - это одиночные игры. Известно, что синглтоны являются плохой практикой.

Я знаю, что многие люди (включая меня) очень довольны Угловым. Что мне здесь не хватает?

  • 1
    Это больше похоже на логическую ошибку, чем на настоящий вопрос.
  • 0
    Это довольно смелое утверждение, основанное на мнении. Я не думаю, что каждый разработчик согласится с тем, что Singletons - это плохо. При правильном использовании они могут быть весьма полезны (мое мнение).
Показать ещё 2 комментария
Теги:
design-patterns
singleton

1 ответ

2

Синглтон по-прежнему представляет собой супер полезный шаблон, с недостатками, указанными в этой теме:

Что так плохо о одиночных играх?

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

Они нарушают принцип единой ответственности: в силу того, что они контролируют собственное творение и жизненный цикл.

Они по своей сути приводят к тому, что код тесно связан. Это во многих случаях затрудняет их проверку.

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

Основная часть критики, по-видимому, указывает на очень старомодную реализацию одноэлементного шаблона, где они создаются во всем мире:

public class ClassicSingleton {
   private static ClassicSingleton instance = null;
   protected ClassicSingleton() {
      // Exists only to defeat instantiation.
   }
   public static ClassicSingleton getInstance() {
      if(instance == null) {
         instance = new ClassicSingleton();
      }
      return instance;
   }
}

Использование контейнера для инъекций зависимости (например, углового или пружинного) преодолевает большинство вышеперечисленных возражений. Контейнер обрабатывает жизненный цикл и вводит экземпляр singleton в клиентский код. Вы всегда можете заменить инжектированный синглтон другим для тестирования.

Короче говоря, использование контейнера DI позволяет легко использовать синглтоны без потенциальных плохих эффектов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню