Должен ли я всегда делать свои методы статичными, где это возможно? - PullRequest
12 голосов
/ 13 сентября 2010

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

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

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 напрямую.

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

РЕДАКТИРОВАТЬ: Я забылупомяните (и комментарий ShellShock напомнил мне), что я спрашиваю, потому что я использую ReSharper, и он всегда предлагает, что «Метод X можно сделать статическим» и так далее ...

Ответы [ 5 ]

15 голосов
/ 13 сентября 2010

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

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

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

Редактировать

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

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

2 голосов
/ 13 сентября 2010

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

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

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

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

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

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

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

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

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

2 голосов
/ 13 сентября 2010

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

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

2 голосов
/ 13 сентября 2010

Нет. Статика это зло .Он тесно связывает вызывающего с используемым классом и затрудняет тестирование .

1 голос
/ 13 сентября 2010

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

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

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

...