2017-02-09 1 views
4

Из-за модульного тестирования и точки впрыска зависимости, какая обычная принятая норма, когда дело касается вспомогательных методов?dependecy injection и модульное тестирование - статические вспомогательные методы или частные методы экземпляра

Вот мой пример ситуации:

public class GoodiesController : Controller 
{ 
    private IMyContext _context; 

    public GoodiesController(IMyContext context) 
    { 
     _context = context 
    } 

    public async Task<IAction> GetThoseGoodies() 
    { 
     if(YouLikeThemThisWay(Request.Path)) 
     { 
      var result = await _context.GoGetThemThisWay() 
     } else { } 
    } 

Мой вопрос я лучше с YouLikeThemThisWay(string path) как статический помощник в некотором классе или в качестве частного метода экземпляра? Предполагая, что у меня может быть пара подобных YouLikeThemThisWay?

ответ

4

Это действительно зависит от вашего YouLikeThemThisWay(string path) метода. Мои правила использования статического метода или следующим образом:

  1. Требуется ли для него не примитивная зависимость? Если это так, не используйте статические.
  2. Это влияет на состояние приложения? Если это так, не используйте статические.
  3. Расширяет ли функциональность класса или типа, к которому у вас нет доступа к внутренним (классы или примитивы IE BCL)? Если это так, используйте статическое расширение!
  4. Будет ли это влиять на модульные тесты - как в случае их затруднения - если я не могу издеваться над рутиной? Если нет, сделайте его статическим!
  5. Будет ли он использоваться более чем одним типом или классом? Если это так, что он станет лучшим кандидатом на статичность!
  6. Выполняет ли подпрограмма какое-то IO, например, вызов базы данных или файловой системы? Если это так, я бы не стал статичным.

В основном, небольшие вспомогательные функции, которые легко тестируются и не влияют на состояние, или обычно нормально, чтобы сделать статичным. Если есть задействованное состояние, подпрограмма требует зависимости, которую вы обычно вводите, или подпрограмма вызывает вызовы IO или IPC, а затем не статична.

Одно из предостережений к проблеме зависимости технически вы можете использовать метод инъекции для обработки зависимостей, но мне нравится держать его простым. Вероятно, ваш метод может быть статичным.

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

РЕДАКТИРОВАТЬ: Обратите внимание, что обычно мне требуется большинство или все эти пять правил в пользу статики, чтобы я мог даже подумать о создании чего-то статического.

+0

Я не думаю, что полностью получаю очко 2. Метод в основном не вызовет никакого внешнего ресурса. он просто работает над предоставленным вводом. –

+0

Сначала я подумал о том, чтобы поместить его в «контекст», и вопрос был в том, что мне действительно нужно издеваться над этим или просто называть его (т. Е. Вывести его из «контекста», следовательно, мой вопрос «статический» или «частный») –

+0

Точка № 2 означает, что метод, который вы думаете сделать статическим, влияет на глобальное состояние приложения, IE делает какой-то метод что-то, что нельзя «отменить», так что вы не можете выполнять функцию несколько раз подряд, те же результаты. Статические функции всегда должны быть [idempotent] (https://en.wikipedia.org/wiki/Idempotence) – Carson

Смежные вопросы