Почему использование статических классов для обмена глобальными данными не является хорошей практикой?
Я слышал, что обмен данными с использованием статических свойств класса не является хорошей практикой. Хотя я не видел никого, кто использовал бы этот подход, но я не могу выяснить, каковы недостатки для такой аппроксимации! Чтобы быть более понятным, давайте рассмотрим приложение WPF, состоящее из множества пользовательских элементов управления, которые совместно используют данные и параметры в определенном потоке; использование статической ссылки облегчит доступ к этим данным и обмен ими, но такой подход никому не нравится. Почему?
Я ожидаю ответ, связанный с паттернами, я просто не уверен, что это такое.
2 ответа
Если речь идет только о настройке параметров, не вижу проблем с их совместным использованием в разных частях приложения, вместо того, чтобы иметь несколько копий одних и тех же данных. Он по-прежнему остается на плечах принципов SOLID, поскольку ответственность этого класса заключается в хранении параметров / параметров конфигурации.
Если у вас есть также данные, это становится немного сложнее. Нет единственного лучшего ответа на это. Наличие данных в одном месте нарушает принцип SOLID, и
- будет сложнее написать Unit Test
- найти ошибки
- сложнее управлять в многопоточной среде.
Обратите внимание на слово "сложнее", но не невозможно.
На положительной стороне
в современных компьютерных архитектурах вычисления обходятся намного дешевле, чем перемещение данных из одного места в другое. так что, если у вас интенсивное приложение, создайте данные один раз и получите доступ к ним из разных мест, как правило, лучший выбор, а затем обменивайтесь ими.
Если у вас многопотоковое приложение, требующее большого объема вычислений, и по своему дизайну ваши данные не гарантируют никаких условий повышения данных, это все же лучший выбор, чем иметь несколько копий. Создать, скопировать / переместить память дорого.
Говоря это. Если вы беспокоитесь только об элементах управления и пользовательском интерфейсе, я бы предложил
- параметры конфигурации хранятся в одном статическом классе (учитывая, что вам требуется одна настройка конфигурации во время одного запуска)
- Данные информация передаются каждому классу, который за это отвечает.
Я не думаю, что это обязательно плохая практика, я просто думаю, что она может быть использована неправильно.
В вашем случае, когда вам нужно совместное использование состояний между пользовательскими элементами управления, это, вероятно, нецелесообразное использование, потому что вы хотите, чтобы состояние делилось на экране, тогда как статические классы и их свойства являются общими для всего приложения.
Тем не менее, статический класс функционально является.NET-версией шаблона Singleton, и он полезен в подобных обстоятельствах.