Скажем, у нас есть 1001 клиент, который строит свои зависимости напрямую, а не принимает инъекции. Рефакторинг 1001 не вариант по мнению нашего босса. На самом деле нам даже не разрешен доступ к их источнику, только к файлам классов.
Мы должны «модернизировать» систему, через которую проходят эти 1001 клиент. Мы можем рефакторинг, что все, что нам нравится. Зависимости являются частью этой системы. И некоторые из этих зависимостей мы должны изменить, чтобы иметь новую реализацию.
Мы хотели бы иметь возможность настраивать различные реализации зависимостей для удовлетворения этого множества клиентов. К сожалению, DI не представляется возможным, так как клиенты не принимают инъекции с конструкторами или сеттерами.
Варианты:
1) Измените реализацию службы, которую используют клиенты, чтобы она выполняла то, что нужно клиентам сейчас. Взрыв, мы сделали. Не гибкий Не сложный
2) Рефакторизовать реализацию так, чтобы она делегировала свою работу еще одной зависимости, которую она приобретает через фабрику. Теперь мы можем контролировать, какую реализацию они все используют, путем рефакторинга фабрики.
3) Рефакторизовать реализацию так, чтобы она делегировала свою работу еще одной зависимости, которую она получает через локатор службы. Теперь мы можем контролировать, какую реализацию они все используют, настроив локатор службы, который может быть простоhashmap
строкой для объектов с небольшим продолжением приведения.
4) Что-то, о чем я даже не думал.
Цель:
Минимизируйте ущерб, нанесенный дизайну, перетаскивая старый плохо спроектированный клиентский код в будущее, не добавляя при этом лишней сложности.
Клиенты не должны знать или контролировать реализацию своих зависимостей, но они настаивают на их построении new
. Мы не можем контролировать, new
но мы контролируем класс, который они строят.
Мой вопрос:
Что я не учел?
вам действительно нужна возможность настройки между различными реализациями? С какой целью?
Ловкость. Много неизвестных. Менеджмент хочет потенциала для изменений. Только потерять зависимость от внешнего мира. Также тестирование.
Вам нужна механика времени выполнения или просто механика времени компиляции для переключения между различными реализациями? Почему?
Механика времени компиляции вполне вероятна. За исключением тестирования.
какая гранулярность вам нужна для переключения между реализациями? Все вместе? За модуль (каждый из которых содержит группу классов)? В классе?
Из 1001 только один запускается через систему одновременно. Изменение того, что все клиенты используют одновременно, вполне вероятно. Индивидуальный контроль над зависимостями, вероятно, важен, хотя.
кому нужно управлять выключателем? Только ваша / ваша команда разработчиков? Администратор? Каждый клиент по-своему? Или разработчики поддержки для кода клиента? Итак, насколько простой / надежной / надежной должна быть механика?
Dev для тестирования. Администратор как внешние аппаратные зависимости меняются. Это должно быть легко проверить и настроить.
Наша цель - показать, что система может быть быстро переделана и модернизирована.
Фактический вариант использования для реализации переключения?
Во-первых, некоторые данные будут предоставляться программным обеспечением до тех пор, пока аппаратное решение не будет готово.