Подтвердить что ты не робот

Должен ли я всегда ставить свои методы статически, когда это возможно?

Я часто размышлял над этим... его, вероятно, вопрос идиот, но здесь идет.

Скажем, у меня есть этот класс:

public class SomeClass
{
    public int AProperty { get; set; }

    public void SomeMethod()
    {
        DoStuff(AProperty);
    }
}

Есть ли какие-либо преимущества для этого:

public class SomeClass
{
    public int AProperty { get; set; }

    public static void SomeMethod(int arg)
    {
        DoStuff(arg);
    }
}

Единственное преимущество, которое очевидно, заключается в том, что я могу теперь напрямую обращаться к SomeMethod.

Так ли это хорошая практика, чтобы сделать такие методы статичными, где небольшой рефакторинг позволит или это пустая трата моего времени?

EDIT: Я забыл упомянуть (и комментарий ShellShock напомнил мне), что причина, по которой я спрашиваю, заключается в том, что я использую ReSharper, и он всегда делает предложения о том, что "метод X может быть сделан статическим" и т.д....

4b9b3361

Ответ 1

Статичность не является злом. Static является злом, если используется неправильно, как и многие части нашего инструментария программирования.

Статика может быть очень выгодной. Как отметил принятый ответ здесь, статические могут иметь потенциальное улучшение скорости.

Как правило, если метод не используется и поля класса, то его хорошее время для оценки его функции, однако в конечном итоге полезные методы, которые можно вызывать без создания экземпляра объекта, могут быть полезны. Например, классы DirectoryInformation и FileInformation содержат полезные статические методы.

Edit

Почувствуйте обязательство указать, что он делает насмешливость намного сложнее, но он по-прежнему определенно проверяется.

Просто означает, что вам нужно много думать о том, куда идут статические методы, чтобы вы всегда могли их тестировать, не полагаясь на макет/заглушку. (то есть: не помещайте их в DTO, для которого требуется постоянное соединение с базой данных).

Ответ 2

Статические методы имеют смысл, если вы сможете их вызывать, не создавая объект класса раньше. В Java, например, Math-Class содержит только статические методы, потому что не имеет большого смысла побуждать Math-Class делать только математические операции над другими объектами.

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

Ответ 3

Я попытаюсь ответить на ваш конкретный вопрос с помощью примера кода, который вы предоставили.

Если SomeMethod полезен только в классе, в котором он объявлен, я бы избежал статического преобразования и оставил его как метод экземпляра.

Если SomeMethod полезен вне класса, в котором он находится, то выставляйте его из класса. Это может быть как статический метод в статическом классе полезности где-то. Чтобы сделать его проверяемым, убедитесь, что все его зависимости переданы ему в качестве аргументов. Если у него есть множество зависимостей, вы можете просмотреть дизайн и выяснить, что именно он должен делать - он может быть лучше как метод экземпляра в одном из классов, к которым вы его передаете.

Некоторые говорят, что статичность - это зло. Это, как правило, из-за ловушек, которые предоставляет изменяемое статическое состояние, где переменные зависают от точки, когда статический конструктор вызывается для разрыва домена приложения, изменяясь между ними. Код, основанный на этом состоянии, может вести себя непредсказуемо, и тестирование может стать ужасным. Тем не менее, нет ничего плохого в статическом методе, который не ссылается на изменяемое статическое состояние.

Для (очень простого) примера, когда статичность является злой, но может быть преобразована в не-злую версию, представьте себе функцию, которая вычисляет кого-то возраст:

static TimeSpan CalcAge(DateTime dob) { return DateTime.Now - dob; }

Можно ли это проверить? Ответ - нет. Он опирается на массово изменчивое статическое состояние DateTime.Now. Вам не гарантируется одинаковый выход для одного и того же входа каждый раз. Чтобы сделать его более удобным для тестирования:

static TimeSpan CalcAge(DateTime dob, DateTime now) { return now - dob; }

Теперь все значения, на которые полагается функция, передаются и полностью проверяются. Тот же ввод даст вам тот же результат.

Ответ 5

Я думаю, что это будет зависеть от того, как вы хотите использовать методы. Использование статического метода в порядке, если оно используется как обычный метод для нескольких экземпляров класса.

Для примера, скажем, у вас есть строковый класс и две строки A и B. Для сравнения A и B вы можете либо использовать метод A.CompareTo(B), либо String.Compare(A, B) метод.

Пожалуйста, поправьте меня, если я ошибаюсь.