Скажімо, у нас є 1001 клієнт, який будує свої залежності безпосередньо, а не приймає ін'єкції. Переобладнання 1001 не є варіантом на думку нашого начальника. Нам фактично навіть не дозволений доступ до їх джерела, лише файли класу.
Ми повинні зробити "модернізацію" системи, через яку проходять ці 1001 клієнт. Ми можемо рефакторити все, що нам подобається. Залежності є частиною цієї системи. І деякі з цих залежностей ми повинні змінити, щоб мати нову реалізацію.
Що ми хотіли б зробити - це можливість налаштувати різні реалізації залежностей, щоб задовольнити цю кількість клієнтів. На жаль, DI не здається можливим, оскільки клієнти не приймають ін'єкцій з конструкторами або сеттерами.
Варіанти:
1) Refactor - реалізація послуги, яку користуються клієнти, щоб вона зробила те, що потрібно клієнтам зараз. Вибух ми закінчили. Не гнучка. Не складний.
2) Рефактор реалізація, щоб вона делегувала свою роботу ще одній залежності, яку вона набуває через завод. Тепер ми можемо контролювати, яку реалізацію вони всі використовують, переробляючи фабрику.
3) Рефактор реалізації, щоб він делегував свою роботу ще одній залежності, яку він набуває за допомогою сервера-локатора. Тепер ми можемо контролювати, яку реалізацію вони використовують, конфігуруючи сервіс-локатор, який може бути просто hashmap
рядком для об'єктів з невеликим кастингом.
4) Щось, про що я ще навіть не думав.
Мета:
Зведіть до мінімуму шкоду дизайну, перетягуючи старий погано розроблений клієнтський код у майбутнє, не додаючи безглуздої складності.
Клієнти не повинні знати або контролювати реалізацію своїх залежностей, але вони наполягають на їх побудові new
. Ми не можемо контролювати, new
але ми контролюємо клас, який вони будують.
Моє запитання:
Що я не міг розглянути?
чи справді вам потрібна можливість налаштування між різними реалізаціями? З якою метою?
Спритність. Багато невідомих. Керівництво хоче потенціалу для змін. Тільки втрачайте залежність від зовнішнього світу. Також тестування.
вам потрібна механіка часу виконання або просто механіка компіляції часу для переключення між різними реалізаціями? Чому?
Механіки часу компіляції, ймовірно, досить. За винятком тестування.
яка деталізація вам потрібна для перемикання між реалізаціями? Все одразу? На модуль (кожен містить групу класів)? За клас?
З 1001 лише один запускається через систему в будь-який час. Зміна того, що всі клієнти використовують відразу, швидше за все, добре. Хоча, мабуть, важливий індивідуальний контроль залежностей.
кому потрібно керувати вимикачем? Тільки ваша / ваша команда розробників? Адміністратор? Кожен клієнт самостійно? Або розробники технічного обслуговування коду клієнта? То наскільки легкою / надійною / безглуздою потрібна механіка?
Розробник для тестування. Змінюються адміністратор як зовнішні апаратні залежності. Це потрібно легко перевірити та налаштувати.
Наша мета - показати, що систему можна швидко переробити та модернізувати.
фактичний випадок використання для комутатора реалізації?
Одне полягає в тому, що деякі дані будуть надаватися програмним забезпеченням до тих пір, поки апаратне рішення не буде готове.