Использует ли статические классы всякий раз, когда я могу хорошую практику? - PullRequest
4 голосов
/ 10 июня 2011

Позвольте мне быть более точным.В моем проекте winforms я создаю классы для управления / создания каждой части программы.Я сделал это, чтобы иметь больше контроля над моим кодом.Например, у меня есть класс, который управляет моим элементом управления DataGridView.Я назвал его gridManager и в нем я установил все свойства, цвета и так далее, а также у меня есть методы для изменения этих настроек (например, changeBackgroundColor () и т. Д.).У меня также есть этот тип класса для каждой панели в splitContainer.В этих классах я инициализирую каждый элемент управления, являющийся дочерним элементом панели, добавляю их на эту панель, устанавливаю все свойства и т. Д.

Я написал все это, чтобы вы лучше ознакомились с назначением этих классов.

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

Сначала у меня они были нестатичными, но когда я захотел вызвать методы (например, для изменения цвета из параметров формы), мне пришлось либо передать MainForm в качестве параметра, либо сделатьэто так:

(Application.OpenForm[0] as MainForm).gridManager.changeColor();

Статическая версия делает это намного проще.Но это заставляет меня задуматься, хорошо ли это делать.Много объяснений, я надеюсь, что мой не идеальный английский не сделает его еще более трудным для понимания.:)

Ответы [ 6 ]

7 голосов
/ 10 июня 2011

Глобальное изменяемое состояние обычно является плохой идеей.

Статические методы / классы хороши для простых функций без побочных эффектов.Math и Enumerable являются хорошими примерами.

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

3 голосов
/ 10 июня 2011

Как и все, у статических классов есть компромиссы. На ум приходят два «отрицательных»:

  1. Вы не можете наследовать от статических классов
  2. Вы не можете (легко) высмеивать статические классы для тестирования

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

Редактировать Предполагается, что вы делаете что-то вроде фабрики управления.
Например: var grid = GridManager.CreateGrid(options);

Если вы делаете что-то вроде

var data = GridManager.GetDataFromGrid(myGrid)

Я бы, наверное, пересмотрел.

0 голосов
/ 10 июня 2011

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

Вся концепция ООП построена на экземплярах, поэтому большую часть времени вы должны использовать нестатические классы. Причина? Прежде всего гибкость. У вас может быть два экземпляра, которые делают одно и то же, немного по-другому, в зависимости от их внутреннего состояния. У вас может быть больше реализаций той же концепции, и вы можете легко переключать их. Вы можете использовать такие вещи, как контейнеры Inversion of Control. И так далее.

0 голосов
/ 10 июня 2011

Это ни хорошая, ни плохая практика, это просто общий шаблон для определенных задач.

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

public SomeClass = SomeClass.CreateWithSomeInit(parms);
0 голосов
/ 10 июня 2011

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

0 голосов
/ 10 июня 2011

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

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

...