Тестируемость и чрезмерный дизайн?
Вот ситуация, фактически изложенная сотрудником, который привел мой интерес:
public DoSomething()
{
//Do Stuff
var assembly = Assembly.LoadFrom("Path");
//Do More Stuff
}
Таким образом, для того, чтобы посмеяться над этим у вас есть два варианта
Создать internal virtual
метод:
internal virtual IAssembly LoadAssembly(String path){...Load Here...}
Или добавьте новый класс, который можно передать в
public class AssemblyLoader
{
public virtual IAssembly LoadAssembly(String path){...Load here...}
}
Обе опции кажутся проблемой, так как первый кажется, что это должен быть закрытый метод, а второй, похоже, является чрезмерным дизайном создания оболочки для простого статического вызова?
Итак, я думал, что отнесу это сообществу. Я ищу наиболее прагматичный подход, оставаясь при этом единообразным.
Это похоже на этот ТАК вопрос, однако я хотел бы углубиться в него на самом деле.
2 ответа
Вопрос слишком общий, поэтому трудно ответить.
Говоря в целом, я думаю, что ваша проблема искусственная. Вы утверждаете, что создание обертки для сторонних сервисов является чрезмерным дизайном, но в то же время вы говорите, что эта обертка является решением реальной проблемы. Если это решает реальную проблему, это не похоже на чрезмерный дизайн, обертка на самом деле звучит как хороший дизайн.
Создание оболочек для сторонних сервисов часто целесообразно, когда вам нужно настроить состояние для кода, который вы не контролируете. Пахнет не так плохо, как ты думаешь. На самом деле, я не вижу другого способа сделать это. Независимо от того, как вы это делаете, будь то издевательство над какой-либо сторонней библиотекой, использование какой-то магии отражения или использование ваших целевых решений, все сводится к обертыванию настоящего стороннего API.
Если ваша интуиция все еще говорит, что перенос этого внешнего API-интерфейса является чрезмерным дизайном, возможно, вам нужно изменить свой вопрос. Спросите себя, должен ли этот код быть проверен?
Здесь сложно сделать обобщение, но комментарии до и после загрузки сборок позволяют предположить, что DoSomething
метод может нарушать принцип единой ответственности. То есть код делает слишком много вещей. Есть несколько способов написания кода, чтобы избежать этого, и вы упомянули два из них в своем вопросе. Я думаю, что последую совету Грега и осуществлю здесь инъекцию зависимостей. Мне сложно сказать, что является и не является чрезмерным дизайном на основе этого примера.