Я попытаюсь ответить на ваш конкретный вопрос, касающийся предоставленного вами примера кода.
Если SomeMethod
полезен только в классе, в котором он объявлен, я бы избегал статического преобразования и оставлял его какметод экземпляра.
Если SomeMethod
полезен вне класса, в котором он находится, то исключите его из класса.Это может быть как статический метод в статическом служебном классе где-то.Чтобы сделать его тестируемым, убедитесь, что все его зависимости переданы ему в качестве аргументов.Если он имеет множество зависимостей, вы можете просмотреть дизайн и точно определить, что он должен делать - он может быть лучше в качестве метода экземпляра в одном из классов, которые вы передаете ему.
Некоторые люди говорят, что статика - это зло.Обычно это происходит из-за ловушек, которые изменяемое статическое состояние обеспечивает, когда переменные зависают от точки, которую статический конструктор вызывает для разрушения домена приложения, переходя между ними.Код, зависящий от этого состояния, может вести себя непредсказуемо, и тестирование может стать ужасным.Однако нет ничего плохого в статическом методе, который не ссылается на изменяемое статическое состояние.
Для (очень простого) примера, где статика является злом, но может быть преобразована в не злую версию, представьте себефункция, которая вычисляет чей-то возраст:
static TimeSpan CalcAge(DateTime dob) { return DateTime.Now - dob; }
Это проверяемое?Ответ - нет.Он опирается на чрезвычайно изменчивое статическое состояние DateTime.Now
.Вам не гарантируется один и тот же вывод каждый раз для одного и того же ввода.Чтобы сделать его более удобным для тестирования:
static TimeSpan CalcAge(DateTime dob, DateTime now) { return now - dob; }
Теперь все значения, на которые опирается функция, передаются, и они полностью тестируемы.Один и тот же вход даст вам тот же результат.