При розробці системи у мене часто виникає проблема використання купою модулів (ведення журналів, доступ до бази даних тощо), які використовуються іншими модулями. Питання в тому, як я можу запропонувати ці компоненти іншим компонентам. Дві відповіді здаються можливими введенням залежності або з використанням заводської схеми. Однак обидва здаються неправильними:
- Заводи випробовують біль і не дозволяють легко міняти реалізацію. Вони також не роблять очевидними залежності (наприклад, ви вивчаєте метод, не звертаючи уваги на те, що він викликає метод, який викликає метод, який викликає метод, який використовує базу даних).
- Ін'єкційна залежність масово набухає списки аргументів конструктора, і це змазує деякі аспекти у вашому коді. Типовою є ситуація, коли так виглядають конструктори більше половини класів
(....., LoggingProvider l, DbSessionProvider db, ExceptionFactory d, UserSession sess, Descriptions d)
Ось типова ситуація, з якою у мене виникає проблема: у мене є класи виключень, які використовують описи помилок, завантажені з бази даних, використовуючи запит із параметром мови мови користувача, що знаходиться в об'єкті сеансу користувача. Отже, щоб створити новий виняток, мені потрібен опис, який вимагає сесії бази даних та сеансу користувача. Тож я приречений перетягувати всі ці об’єкти на всі мої методи лише на випадок, якщо мені може знадобитися кинути виняток.
Як вирішити таку проблему ??