2009-10-29 3 views
6

Я читал в разных местах, что наличие переменных с глобальной областью, то есть открытый статический класс со статическими членами, считается противоречащим философии OO и не является хорошим дизайном. (Например, я видел комментарии в соответствии с: «Если вы используете глобальный язык, вы не делаете это правильно». Или слова на этот счет.)Глобальные переменные v Настройки в C#

Но если вы используете механизм настроек, предоставляемый Visual Studio, например «Settings.Default.MySetting» и т. Д., Это доступно по всему миру в приложении, так как это отличается от использования общедоступного статического класса?

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

Глобальные переменные просто полезны, (модуль VB, кто-нибудь?), Но я пытаюсь научить себя, как правильно это делать, малакию OO, поэтому, если глобальные переменные плохо пахнут с точки зрения OO, что является альтернативой?

Меня особенно интересуют мнения людей об использовании функциональных возможностей «Настройки». Является ли это хорошим дизайном OO?

Благодарим за любые комментарии.

ответ

14

Статические методы и другие участники не являются плохой практикой сами по себе. Просто люди, менее знакомые с концепциями ОО, как правило, засоряют свой код статическими методами, свойствами и полями во всем мире, не понимая, каковы последствия.

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

1

Публичный статический класс или член не всегда плохая идея (даже если это не совсем OO). Многие хорошие проекты OO используют публичный статический член для таких вещей, как Loggers или Settings (как вы указываете). Хорошим примером того, как это сделать в OO-способе, является Static Gateway.

1

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

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

0

Механизм настройки ... хмм ...

Я смотрю на тех, кто в основном как часть окружающей среды. Как OS или Time, но для приложения. Они не являются «переменными», как вы заявляли во время INIT.

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

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

2

В C# у вас будет непросто идти против хорошего дизайна OO, потому что вы не можете уйти от OO. Это не похоже на C++, где вы можете смешивать и сопоставлять структурированные с помощью OO-программирования - области, в которой часто возникают подобные аргументы. Статические элементы класса - OO. Так же создаются настройки Microsoft, потому что генерация кода создает для них инкапсуляцию OO или, по крайней мере, «контейнер объектов» вокруг них. Таким образом, они никогда не являются глобальными переменными, потому что это не существует в C# - они просто статические члены на классах - ничего там не-OO.

Если аргумент о singleton vs static member, то он выставляет один аргумент OO против другого аргумента OO.

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

+2

Трудное время? Да. Будет ли трудное время остановить решительного, некомпетентного разработчика? Никогда. Я потерял подсчет количества раз, когда я видел что-то, реализованное в манере, которая является более сложной и менее правильной, чем разработанная. (И я буду лгать, если я скажу, что я никогда не был виноват в такой вещи.) –

+0

Хорошая точка Грег Д. Вы должны увидеть некоторые из моих прошлых кодов snafus! –

Смежные вопросы