Стоит ли избегать статических классов?

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

7 ответов

Решение

Злоупотребление статическими классами можно считать плохой практикой. Но то же самое можно сказать о злоупотреблении любым языком.

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

Как вы говорите, распространение классов "Помощник" может привести к неприятностям (дизайн, ремонтопригодность, удобочитаемость, обнаруживаемость, другие способности...). Здесь нет аргументов. Но можете ли вы утверждать, что класс "Помощник" никогда не подходит? Я сомневаюсь.

Действительно, ответственное использование статических классов может иметь большие преимущества для вашего кода:

  • Enumerable Статический класс предоставляет набор методов расширения, которые многие из нас полюбили. Это логический набор функциональности / бизнес-логики, который не связан ни с каким конкретным типом.
  • Услуги, предоставляемые средой / контекстом: например, ведение журнала, настройка (иногда)
  • Другие (о которых я не могу думать сейчас:))

Так что нет, в целом это неплохая практика. Просто используйте их с умом...

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

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

Означает ли это, что "использование статических классов неверно" (в этом случае статья неверна) или "Статические классы часто встречаются в плохо написанном коде" (в этом случае речь идет не о том, что статические классы сами по себе плохие, но что они иногда используются неправильно)

Статические функции более эффективны, чем нестатические, потому что вам не нужно создавать экземпляр объекта для их использования или передавать указатель "this" в вызовы методов.

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

Нет, это не совсем правильно.

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

Почти во всех языках есть что-то вроде:

y = Math.round(x);

Таким образом, функция "round" является статической. Вы могли бы, если бы вы были сумасшедшими, утверждать что-то вроде (C#):

class RoundFunction<T> : GeneralMathFunction<T>
{
    public override T Operate (params object[] variables) {
        ..
    }
}

Но, ИМХО, тебе было бы немного странно это делать.

Конечно, есть время, когда слишком много статических функций являются признаком того, что что-то пошло не так, но в разумных пределах это не "плохо".

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

как думать оо

одиночек

статическая-метода-это смерть к контролируемости

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

public static class Logging
{
  public static UpdateAction(int id, object data)
  {
     SqlConnection connection = new SqlConnection("conn string from config file");
     // more logic here...
  }
}

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

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

Есть потребности, где у вас есть класс Utility, где все методы являются статическими. В том случае, если вы делаете класс статичным, это ясно указывает на ваше намерение. И, по крайней мере, в C# нельзя использовать нестатические методы внутри статического класса.

Другие вопросы по тегам