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

Если вы избегаете статических классов?

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

4b9b3361

Ответ 1

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

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

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

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

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

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

Ответ 2

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

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

Почти все языки имеют что-то вроде:

y = Math.round(x);

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

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

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

как думать о oo

singletons

static-methods-are-death-to-testability

Ответ 6

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

Ответ 7

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

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

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

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