Являются ли глобальные статические классы и методы плохими?

Полагаю, вы приобрели сертификат wildcard ssl от thawte или symantec, который не поддерживает одинаково www и non-www. Раньше я покупал сертификат подстановочного знака thawte и сталкивался с тем же типом проблемы. Я только что обсудил с моим продавцом, чтобы получить решение, они мгновенно предоставили мне техническую поддержку и предложили групповой шаблон alphassl - https://www.ssl2buy.com/alphassl-wildcard.php . После этого я переключился на групповой символ alphassl, который отлично работает на моих обоих доменных именах mydomain.com, www.mydomain.com, а также на любом сайте.mydomain.com.

29
задан George Stocker 30 June 2010 в 18:28
поделиться

10 ответов

Глобальные данные - это плохо. Однако многих проблем можно избежать, работая со статическими методами.

Я собираюсь занять позицию Rich Hickey в этом вопросе и объяснить это так:

Для создания наиболее надежных систем на C# используйте статические методы и классы, но не глобальные данные. Например, если вы вводите объект данных в статический метод, и этот статический метод не обращается к статическим данным, то вы можете быть уверены, что при таких входных данных выход функции всегда будет одним и тем же. Такую позицию занимают Erlang, Lisp, Clojure и все остальные языки функционального программирования.

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

Я знаю, что это вызовет жаркие споры, поскольку это противоречит ООП-мышлению C#, но я обнаружил, что чем больше статических методов я использую, тем чище и надежнее мой код.

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


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

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

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

46
ответ дан 28 November 2019 в 01:01
поделиться

В качестве дополнения к тому, что еще сказано, final static переменные вполне подойдут; константы - это хорошо. Единственное исключение из этого - когда / если вы должны просто переместить их в файл свойств, чтобы их было легче изменить.

3
ответ дан 28 November 2019 в 01:01
поделиться

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

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

1
ответ дан 28 November 2019 в 01:01
поделиться

Если вы пытаетесь быть пуристом в своей объектно-ориентированной разработке, то статика, вероятно, не соответствует шаблону.

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

6
ответ дан 28 November 2019 в 01:01
поделиться

Изменяемые статические переменные плохи, потому что они просто глобальное состояние. Лучшее обсуждение этого , которое я знаю, находится здесь, под заголовком «Почему следует избегать использования глобальных переменных, когда они не нужны» .

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

3
ответ дан 28 November 2019 в 01:01
поделиться

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

11
ответ дан 28 November 2019 в 01:01
поделиться

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

Нет таких проблем со статическими методами .

Остается статических полей (переменных). Если вы объявили статическое поле public в классе, это действительно была бы глобальная переменная, и это было бы плохо.

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

2
ответ дан 28 November 2019 в 01:01
поделиться
public class Foo
{
    private static int counter = 0;

    public static int getCounterValue()
    {
         return counter;
    }
    //...
    public Foo()
    {
        //other tasks
        counter++;
    }
}

В приведенном выше коде видно, что мы считаем, сколько объектов Foo было создано. Это может быть полезно во многих случаях.

Ключевое слово static не является глобальным, оно говорит вам, что это на уровне класса, что может быть очень полезно в различных случаях. Итак, в заключение, вещи на уровне классов статичны, вещи на уровне объектов не статичны.

2
ответ дан 28 November 2019 в 01:01
поделиться

Не совсем. Статический фактически определяет, когда, где и как часто что-то создается, а не кто имеет к нему доступ.

0
ответ дан 28 November 2019 в 01:01
поделиться

Статические методы используются для реализации трейтов в Scala. В C # методы расширения (которые являются статическими) выполняют эту роль в части . Это можно рассматривать, как утверждают сторонники DCI, как «форму полиморфизма более высокого порядка» .

Также статические методы могут использоваться для реализации функций. Это то, что F # использует для реализации модулей . (А также VB.NET .) Функции полезны (что неудивительно) для функционального программирования. А иногда они просто способ моделирования чего-либо (например, «функции» в классе Math ). Опять же, C # здесь близко подходит к .

2
ответ дан 28 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: