История изменений
Исправление
Legioner,
(текущая версия)
:
Тут две взаимосвязанных проблемы.
1 - сильное связывание. В модульном программировании считается плохим тоном сильное связывание. При изменении требований и переделывании одной части неизбежно затрагивается вторая.
2 - сложность тестирования. Это уже зависит от языка, но обычно глобальные переменные подменять для теста сложно и неудобно. Простой пример - у нас есть алгоритм, в котором прописан System.currentTimeInMillis(). Ну и как его подменять? Не, можно, если сильно захотеть, но это такой гемор.
Решений второй проблеме я знаю два.
1 решение это репозиторий. При этом у нас таки есть одна глобальная переменная, Map<String, Object>. В нём хранятся все остальные синглтоны.
2 решение это dependency injection. В самом начале (или во фреймворке) создаётся один объект и он через setter вставляется в нужные объекты. Зачастую во фреймворке он скомбинирован с первым решением, т.е. у фреймворка есть внутри репозиторий созданных объектов и он может его отдать, если попросить, либо попросить его вставить все зависимости в указанный объект, он этот объект исследует, найдет все зависимости и передаст ему.
Более популярно второе решение. Без фреймворка там получается много писанины, поэтому «на коленке» лучше делать первый вариант. А если на тестирование пофиг и код на выброс, то никаких проблем использовать синглтоны нет.
Соответственно решение первой проблемы это ввод промежуточного интерфейса между модулями. Но это усложняет программу и не всегда оправдано.
Исходная версия
Legioner,
:
Тут две взаимосвязанных проблемы.
1 - сильное связывание. В модульном программировании считается плохим тоном сильное связывание. При изменении требований и переделывании одной части неизбежно затрагивается вторая.
2 - сложность тестирования. Это уже зависит от языка, но обычно глобальные переменные подменять для теста сложно и неудобно. Простой пример - у нас есть алгоритм, в котором прописан System.currentTimeInMillis(). Ну и как его подменять? Не, можно, если сильно захотеть, но это такой гемор.
Решений я знаю два.
1 решение это репозиторий. При этом у нас таки есть одна глобальная переменная, Map<String, Object>. В нём хранятся все остальные синглтоны.
2 решение это dependency injection. В самом начале (или во фреймворке) создаётся один объект и он через setter вставляется в нужные объекты. Зачастую во фреймворке он скомбинирован с первым решением, т.е. у фреймворка есть внутри репозиторий созданных объектов и он может его отдать, если попросить, либо попросить его вставить все зависимости в указанный объект, он этот объект исследует, найдет все зависимости и передаст ему.
Более популярно второе решение. Без фреймворка там получается много писанины, поэтому «на коленке» лучше делать первый вариант. А если на тестирование пофиг и код на выброс, то никаких проблем использовать синглтоны нет.