LINUX.ORG.RU

История изменений

Исправление 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 вставляется в нужные объекты. Зачастую во фреймворке он скомбинирован с первым решением, т.е. у фреймворка есть внутри репозиторий созданных объектов и он может его отдать, если попросить, либо попросить его вставить все зависимости в указанный объект, он этот объект исследует, найдет все зависимости и передаст ему.

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