Когда использовать статические классы и методы?

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


person Vishal    schedule 14.07.2010    source источник


Ответы (4)


Я думаю, что следующие две ссылки дают четкий ответ на то, что вы ищете. Взгляните на них:

Для статических классов:

Когда использовать статические классы в C#

Для статических методов:

Когда уместно использовать статические методы? ( Джон Скит [Гуру] ответил на этот вопрос: o))

person Leniel Maccaferri    schedule 14.07.2010

Одна вещь, о которой следует помнить, — это последствия тестирования статических методов. Статический метод "запечатывает" множество швов. Швы — это то место, где вы можете изменить поведение, не меняя производственный код; примерами являются подклассы или ссылки на библиотеку тестирования. Поскольку статические методы разрешаются во время компиляции и не связаны динамически, вы не можете добавить тестовый объект и изменить поведение статического метода. Тестирование этого класса будет утомительным.

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

Вот хорошая ссылка из блога тестирования Google:Статические методы — это смерть для тестируемости

person Paul Rubel    schedule 15.07.2010
comment
Потрясающий пост - я чертовски люблю Мишко Хевери. Вы видели его Google Tech Talks? (Я думаю, это был доклад под названием «Разговоры о чистом коде — модульное тестирование», хотя все его доклады того стоят.) Эти доклады вызвали у меня головокружительный момент когнитивной сверхновой, объединив IOC и TDD в какое-то эпическое мега-оружие. . - person chickeninabiscuit; 10.01.2011
comment
Статический метод заделывает множество швов. не важно для методов низкого уровня, но важно для методов более высокого уровня. - person Raedwald; 30.03.2011

Я думаю, что общим правилом может быть то, что служебные функции должны быть статичными. Типичным примером может быть то, что в любом языке oop класс Math будет содержать статические методы, такие как sqrt(), поскольку на самом деле нет необходимости иметь что-то вроде отдельного объекта Math.

Что касается статических классов, вы должны думать о классах, сохраняющих форму состояния, обычно такую ​​как информация о сеансе, которая необходима независимо от точного пути, пройденного через ваше приложение, и из которых вам обычно нужен ровно один. (подумайте о своем браузере, который, вероятно, всегда хранит ровно 1 класс cookie-jar)

Статические переменные — это менее опасный близнец глобальных переменных (они сохраняют свое значение, но их область действия ограничена функцией), которые обычно полезны либо для хранения некоторой формы состояния (например, для кэширования данных), либо для перечисления вещей, которые должны быть уникальный, но чья нумерация не очень важна за пределами вашей функции или приложения (скажем, нумерация отладки или профилирования кричит из ваших собственных функций debug("..") или profile())

По сути, используйте любой из них только тогда, когда вы абсолютно уверены, что выполнение вещей «правильным» способом, подобным ООП, приведет к созданию монстра.

person mvds    schedule 15.07.2010

Как я понимаю, это когда нет смысла создавать объект класса для вызова действия или этот класс является общим в приложении. Например, в C# класс Console запечатан (поэтому вы не можете создать объект и наследовать его, да и смысла в этом нет). Однако профессионалы объяснят вам лучше.

person Jan Iwanow    schedule 15.07.2010