Является ли рекомендация Решарпера сделать статический метод закрытым методом хорошей рекомендацией? - PullRequest
9 голосов
/ 19 сентября 2009

Недавно я заметил, что когда я создаю приватные методы, которые устанавливают несколько полей в передаваемых им объектах, Resharper подсказывает, что метод можно сделать статическим.

Вот очень упрощенный пример метода, который у меня может быть.

private void MakeStatusTheSame(MyClass mc, MySecondClass msc)
{
    mc.Status = msc.Status;
}

Когда у меня есть такой метод, Resharper дает рекомендацию, что метод можно сделать статическим.

Я стараюсь не делать общедоступные методы статичными, поскольку они разрушают модульные тесты ... но я не уверен, что то же самое относится и к частным методам.

Является ли рекомендация Решарпера действительной передовой практикой или я должен просто отключить ее?

Ответы [ 4 ]

11 голосов
/ 19 сентября 2009

Я думаю, что это определенно главный кандидат для статического метода. Это не меняет какие-либо свойства класса, поля и т. Д.

Вот пример:

class MyClass
{
  public static void MakeStatusTheSame(MyClass mc, MySecondClass msc)
  {
     mc.status = msc.status;
  }

  private void MakeStatusTheSame(MySecondClass msc)
  {
    this.status = msc.status;
  }

  private int status;
}

Кроме того, вы можете сделать это методом расширения (который также будет статическим):

public static class Extensions
{
  public static MyClass MakeStatusTheSame(this MyClass mc, MySecondClass msc)
  {
    mc.status = msc.status
    return mc; /* make the method chainable */
   }
}
8 голосов
/ 19 сентября 2009

Имея риск звучать как противоположность, я должен признать, что мне не нравится смешивать статические методы с методами экземпляра; и мне не нравятся статические методы в целом. Статические методы трудно тестировать, трудно переопределить и сложно поддерживать. Я предпочитаю совмещать все статические методы для работы с объектами Foo в одном классе FooUtils или, что еще лучше, в одноэлементном экземпляре класса FooSomethingDoer.

Конечно, статические методы имеют смысл в некоторых случаях - например, при создании вышеупомянутых синглетонов или фабрик и т. Д. Я не говорю, что все статические методы сделаны из чистого зла; Я просто предпочитаю ошибаться, избегая их, когда это возможно.

7 голосов
/ 19 сентября 2009

Я так думаю; То, что метод является статическим, ясно показывает, что метод не должен взаимодействовать с какими-либо членами экземпляра.

Представьте, что вы отлаживаете нестатический метод и понимаете, что экземпляр не затрагивается. Мгновенный запах, и если нет комментария, объясняющего, что делает функция, вы можете отвлечься от реальной проблемы.

4 голосов
/ 19 сентября 2009

Я обычно хожу с рекомендациями R #. Это частный метод, так что (надеюсь) вы не пишете юнит-тесты против него. Если сделать его статическим, то явно будет сказано, что он не использует никаких элементов экземпляра, что облегчает проверку на наличие побочных эффектов.

...