Хорошо, почему синглеты плохие, вы можете прочитать здесь: Что такого плохого в синглетах?
Специально для тестирования: типичный шаблон синглтона выглядит следующим образом
class MyClass
{
private static MyClass m_Instance = new MyClass();
public static MyClass Instance
{
get { return m_Instance; }
}
}
Теперь представьте, что вам нужно выполнить целую кучу тестов, включающих MyClass.Instance
.Этот класс переносит состояние, и вам обычно требуется способ его сброса между тестами, чтобы каждый тест мог начинаться с чистого начального состояния.Теперь вы можете добавить метод Reset()
, но это означает, что вы добавляете код в свой класс только для возможности его тестирования, что нежелательно.
Что использовать вместо этого: Ну, синглтон сам по себеэто не совсем плохо.Проблема, к которой это приводит, состоит в том, что это облегчает написание кода следующим образом:
class SomeClass
{
public void SomeMethod()
{
...
MyClass.Instance.DoSomething();
}
}
Теперь вы создали неявную зависимость от экземпляра singleton, который вы не можете легко сломать.Одним из подходов, который решает эту проблему, является внедрение зависимостей (о котором уже упоминалось):
class SomeClass
{
public SomeClass(MyClass myClass)
{
m_MyClass = myClass;
}
public void SomeMethod()
{
...
m_MyClass.DoSomething();
}
}
, и вы можете сделать:
var someClass = new SomeClass(MyClass.Instance);
в вашей программе и
var someClass = new SomeClass(new MyClass());
для тестирования.
Так что синглтоны не так уж и плохи, а иногда и являются подходящим инструментом для правильной работы, однако вы должны быть осторожны с их использованием.