Глобальные данные плохие.Однако многих проблем можно избежать, работая со статическими методами.
Я собираюсь занять позицию Rich Hickey на этом и объяснить это следующим образом:
Чтобы построить самые надежные системы в C #, используйте статические методы иклассы, но не глобальные данные.Например, если вы передаете объект данных в статический метод, и этот статический метод не обращается к статическим данным, вы можете быть уверены, что с учетом этих входных данных выходные данные функции всегда будут одинаковыми.Это позиция, занятая Эрлангом, Лиспом, Clojure и всеми другими функциональными языками программирования .
Использование статических методов может значительно упростить многопоточное кодирование, поскольку при правильном программировании только одинпоток будет иметь доступ к заданному набору данных одновременно.И это действительно то, к чему это сводится.Наличие глобальных данных плохо, так как это состояние, которое может быть изменено тем, кто знает, какой поток и в любое время.Однако статические методы допускают очень чистый код, который можно тестировать с меньшими приращениями.
Я знаю, что это будет горячо обсуждаться, поскольку это идет вразрез с мыслительным процессом ООП в C #, но я обнаружил, что чем больше статических методов я использую, тем чище и надежнее мой код.
Это видео объясняет это лучше, чем я, но показывает, как неизменяемые данные и статические методы могут генерировать некоторый чрезвычайно поточно-ориентированный код.
Позвольте мне пояснить немногоЕще некоторые проблемы с глобальными данными.Постоянные (или только для чтения) глобальные данные не так важны, как изменяемые (чтение / запись) глобальные данные.Поэтому, если имеет смысл иметь глобальный кеш данных, используйте глобальные данные!В некоторой степени это будет иметь каждое приложение, которое использует базу данных, поскольку мы можем сказать, что вся база данных SQL - это одна огромная глобальная переменная, которая содержит данные.
Таким образом, сделать общее заявление, как я делал выше, вероятно, немного убедительно.Вместо этого предположим, что наличие глобальных данных создает много проблем, которых можно избежать, используя вместо этого локальные данные.
Некоторые языки, такие как Erlang, решают эту проблему, располагая кешем в отдельном потоке, который обрабатывает все запросы на эти данные.Таким образом, вы знаете, что все запросы и модификации этих данных будут атомарными, и глобальный кеш не останется в неизвестном состоянии.