Все,Удлинительные методы Скрыть зависимости?
Хотелось бы высказать несколько соображений по этому вопросу. В последнее время я становлюсь все более и более подписчиком «пуристских» принципов ДИ/МОК при проектировании/разработке. Часть этого (большая часть) связана с тем, что между моими классами существует небольшая связь и что их зависимости разрешаются с помощью конструктора (есть, конечно, другие способы управления этим, но вы получаете идею).
Моя основная предпосылка заключается в том, что методы расширения нарушают принципы DI/IOC.
Я создал следующий метод расширения, который я использую для того, чтобы строки, вставленные в таблицы базы данных обрезаются до нужного размера:
public static class StringExtensions
{
public static string TruncateToSize(this string input, int maxLength)
{
int lengthToUse = maxLength;
if (input.Length < maxLength)
{
lengthToUse = input.Length;
}
return input.Substring(0, lengthToUse);
}
}
Затем я могу назвать свою строку из другого класса, как так:
string myString = "myValue.TruncateThisPartPlease.";
myString.TruncateToSize(8);
справедливый перевод этого без использования метода расширения будет:
string myString = "myValue.TruncateThisPartPlease.";
StaticStringUtil.TruncateToSize(myString, 8);
Любой класс, который использует любой из приведенных выше примеров, не может быть проверен независимо от класса, содержащего метод TruncateToSize (в том числе TypeMock). Если бы я не использовал метод расширения, и я не хочу, чтобы создать статическую зависимость, она будет выглядеть больше как:
string myString = "myValue.TruncateThisPartPlease.";
_stringUtil.TruncateToSize(myString, 8);
В последнем примере, зависимость _stringUtil будет решена с помощью конструкторы и класса могут быть протестированы без какой-либо зависимости от класса метода TruncateToSize (его можно легко высмеять).
С моей точки зрения, первые два примера основаны на статических зависимостях (один явный, один скрытый), а второй инвертирует зависимость и обеспечивает уменьшенную связь и лучшую тестируемость.
Значит, использование методов расширения противоречит принципам DI/IOC? Если вы являетесь подписчиком методологии МОК, избегайте использования методов расширения?
Ваш метод расширения не проверяет нулевой ввод! – canon
@antisanity: AFAIK логически невозможно, чтобы параметр экземпляра метода расширения (* input * в этом случае) был пустым. –
Да, Фил ... он может быть нулевым. – canon