it-swarm.com.ru

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

По общему мнению, следует избегать значительной зависимости от глобальных вещей. Разве использование статических классов и методов не будет одним и тем же?

28
Adam Kane

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

Я собираюсь занять позицию Рич Хики на этом и объяснить это так:

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

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

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

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


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

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

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

43
Timothy Baldridge

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

9
Janick Bernet

Если вы пытаетесь быть пуристами в отношении своего OO развития, тогда статика, вероятно, не вписывается в шаблон.

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

6
Andrew Anderson

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

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

3
Jeff Sternal

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

2
Dean J

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

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

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

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

2
Henk Holterman
public class Foo
{
    private static int counter = 0;

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

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

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

2
Lajos Arpad

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

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

2
Jordão

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

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

1
Eric Petroelje

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

0
GalacticCowboy